问题比较多,大概列出来:
1、位码错误2、送段码前没有清零
3、共阴数码管需要加驱动,单片机IO负载能力不足
4、段码加了245IC就不用上拉电阻。
5、我贴出来的代码随便写的,好多可以精简,请自行优化。
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- void Delayms(uint x);
- sbit L=P2^0;
- sbit LA=P2^1;
- sbit LB=P2^2;
- void Display();
- sbit key1=P3^3;
- sbit key2=P3^4;
- sbit key3=P3^5;
- /*位码*/uchar tablew[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uint mshi,mge,fshi,fge,sshi,sge;
- /*共阴极*/
- uchar table6[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };
- //{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uint aa,bb,cc,dd;
- //void Timer0_Init(void) //1毫秒@12.000MHz
- //{
- // //AUXR |= 0x80; //定时器时钟1T模式
- // TMOD = 0x01; //设置定时器模式
- // TL0 = (65536-1000)&0xFF; //设置定时初始值
- // TH0 = (65536-1000)>>8; //设置定时初始值
- // IE=0x82;
- // TR0=1;
- // EA=1;
- //}
- void main()
- {
-
-
- TMOD=0x01;//设置工作方式
- TH0=0xFC;//设置定时器高八位
- TL0=0x18;//设置定时器低八位
- ET0=1;//打开定时器T0的中断开关
- TR0=1;//启动定时器T0工作
- EA=1;//打开总中断开关
- //Timer0_Init();
- while(1)
- {
-
- if(key1==0)
- {
- EA=1;
- }
- else if(key2==0)
- {
- EA=0;
- }
- else if(key3==0)
- {
- bb=0;cc=0;dd=0;
- }
- Display();
- }
- }
- void int0_0() interrupt 1
- {
- TH0=0xFC;
- TL0=0x18;
- aa++;//1ms加一次
- if(aa>1000)
- {
- aa=0;
- bb++;//1S加一次
- }
- mshi=bb/10;
- mge=bb%10;
- if(bb>59)
- {
- bb=0;
- cc++;
- }
- fshi=cc/10;
- fge=cc%10;
- if(cc>59)
- {
- cc=0;
- dd++;
- }
- sshi=dd/10;
- sge=dd%10;
- if(dd>23)
- {
- dd=0;
- }
- }
- void Display()
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- P0=0x00;
- P2=tablew[7-i];///位码
- switch(i)
- {
- case 0:
- P0=table6[mge];break;
- case 1:
- P0=table6[mshi];break;
- case 2:
- P0=table6[10];break;
- case 3:
- P0=table6[fge];break;
- case 4:
- P0=table6[fshi];break;
- case 5:
- P0=table6[10];break;
- case 6:
- P0=table6[sge];break;
- case 7:
- P0=table6[sshi];break;
- default:
- P0=0x00;
- }
-
- Delayms(1);
- }
- }
- void Delayms(uint x)
- {
- uchar j;
- while(x--)
- {
- for(j=0;j<125;j++);
- }
- }
复制代码
|