多位数码管显示电路分静态显示和动态显示,要实现单个闪烁或多个同时闪烁并不难。只要在正常显示的基础上按闪烁频率的1/2时间给段码驱动端送消隐码即可。共阴数码管送0x00,共阳数码管送0xff。数码管亮度不均匀或闪烁有差异是因为显示电路或显示代码本身不正常造成的。给你一个示例,用简单的4位时钟改成闪烁显示以便于理解。注释掉的部分是原来正常显示的部分。
- #include <AT89X52.H>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key1 =P3^4;
- sbit key2 =P3^5;
- //顺序共阴极数码管段码表,段码a-h顺序接PX0-PX7
- unsigned char code table[]={//共阴数码管段码"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- uchar hour=12,min=0,sec=0;
- uchar tcnt;
- bit flag;
- void delayms(uint k)//1T
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=125;j>0;j--);
- }
- void InitTimer0()//50毫秒@12.000MHz
- {
- TMOD= 0x01; //设置定时器模式
- TL0 = 0xB0; //设置定时初值
- TH0 = 0x3C; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- EA = 1;
- ET0 = 1;
- }
- void keyscan()
- {
- static uchar count1,count2;
- if(!key1)
- {
- if(++count1>=100)
- {
- count1=0;
- hour++;
- if(hour>=24)
- hour=0;
- }
- }
- else count1=0;
- if(!key2)
- {
- if(++count2>=100)
- {
- count2=0;
- min++;
- tcnt=0;
- sec=0;
- if(min>=60)
- min=0;
- }
- }
- else count2=0;
- }
- void display()
- {
- static uchar i=0;
- P0=0x00;//消隐
- P3&=0xf0;//清P3低4位
- /* switch(i)
- {
- case 0: P3|=0x0e;P0=table[hour/10];break;
- case 1: P3|=0x0d;if(flag==1)P0=table[hour%10]|0x80;//加点
- else P0=table[hour%10];break;//不加点
- case 2: P3|=0x0b;P0=table[min/10] ;break;
- case 3: P3|=0x07;P0=table[min%10] ;break;
- }*/
- switch(i)
- {
- case 0: P3|=0x0e;if(flag==1)P0=table[hour/10];
- else P0=0x00;break;
- case 1: P3|=0x0d;if(flag==1)P0=table[hour%10]|0x80;//加点
- else P0=0x00;break;
- case 2: P3|=0x0b;if(flag==1)P0=table[min/10];
- else P0=0x00;break;
- case 3: P3|=0x07;if(flag==1)P0=table[min%10];
- else P0=0x00;break;
- }
- delayms(2);
- i++;
- i%=4;
- }
- void main(void)
- {
- InitTimer0();
- while (1)
- {
- keyscan();
- display();
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- tcnt++;
- if(tcnt<10)
- flag=1;
- else flag=0;
- if(tcnt>=20)
- {
- tcnt=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- hour++;
- if(hour>=24)
- hour=0;
- }
- }
- }
- }
复制代码
|