多位數(shù)碼管顯示電路分靜態(tài)顯示和動態(tài)顯示,要實現(xiàn)單個閃爍或多個同時閃爍并不難。只要在正常顯示的基礎上按閃爍頻率的1/2時間給段碼驅動端送消隱碼即可。共陰數(shù)碼管送0x00,共陽數(shù)碼管送0xff。數(shù)碼管亮度不均勻或閃爍有差異是因為顯示電路或顯示代碼本身不正常造成的。給你一個示例,用簡單的4位時鐘改成閃爍顯示以便于理解。注釋掉的部分是原來正常顯示的部分。
無標題.jpg (157.1 KB, 下載次數(shù): 13)
下載附件
2019-12-16 15:26 上傳
- #include <AT89X52.H>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key1 =P3^4;
- sbit key2 =P3^5;
- //順序共陰極數(shù)碼管段碼表,段碼a-h順序接PX0-PX7
- unsigned char code table[]={//共陰數(shù)碼管段碼"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;
- }
- }
- }
- }
復制代碼
|