本帖最后由 51黑電子會員 于 2020-5-22 08:38 編輯
- /*****
- 為什么按下按鍵到按鍵抬起后,會干擾到數碼管的顯示?原因:如果按鍵掃描
- 函數和數碼管顯示函數都放在主函數的固定循環內,當按鍵按下后,按鍵掃描
- 函數進行按鍵掃描,在掃描到按鍵延時后,CPU被限制在按鍵延時處進行計時,
- 卻無法運行其他程序,從而導致數碼管顯示函數無法運行,就會出現數碼管閃
- 滅顯示問題。人能看到數碼管閃爍是因為人眼能識別高頻率(人眼看不到閃爍
- 的頻率為50Hz)低于50Hz,即1/50Hz=0.02秒,因此要想讓人眼看不到數碼管閃
- 爍,數碼管顯示函數的顯示頻率至少是50Hz,即1/50Hz=0.02秒,也不是越高
- 好,還要結合按鍵掃描函數的按鍵延時來取出最恰當的顯示頻率。
- 本程序分兩個程序。一個是程序一,按鍵控制數碼管帶來閃滅顯示問題的程序。
- 另一個是程序二,解決按鍵控制數碼管帶來閃滅顯示問題的程序。通過把數碼
- 管顯示函數放在定時器中斷子程序中,以及把按鍵掃描函數放在主函數固定循
- 環內。提醒:先試程序一,再試程序二,之后兩者對比,找出不同點,取最適
- 合的。
- *****/
- //程序一:按鍵控制數碼管帶來閃滅顯示問題的程序
- //#include<reg51.h>
- //#define uchar unsigned char
- //#define uint unsigned int
- //sbit add=P3^0;
- //sbit dec=P3^4;
- //uchar lingweiflag;
- //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
- //uint num;
- //uint qian,bai,shi,ge;//定義拆字變量
- // /**ms級延時子程序**/
- // void delay(uint x)
- //{
- // uint i,j;
- // for(i=0;i<x;i++)
- // for(j=0;j<110;j++);
- // }
- // void display()
- //{
- // qian=num/1000;//取得千位數字
- // bai=num%1000/100;//取得百位數字
- // shi=num%100/10;//取得十位數字
- // ge=num%10;//取得個位數字
- //
- // P2=0xfe;//數碼管千位顯示位
- // P1=table[qian];//數碼管千位數值顯示
- // delay(2);//延時
- //
- // P2=0xfd;//數碼管百位顯示位
- // P1=table[bai];//數碼管百位數值顯示
- // delay(2);//延時
- //
- // P2=0xfb;//數碼管十位顯示位
- // P1=table[shi];//數碼管十位數值顯示
- // delay(2);//延時
- //
- // P2=0xf7;//數碼管個位顯示位
- // P1=table[ge];//數碼管個位數值顯示
- // delay(2);//延時
- // }
- // void keyscan()
- //{
- // if(add==0)
- // {
- // delay(5);
- // if(add==0)
- // {
- // num++;
- // while(!add);
- // lingweiflag=0;
- // }
- // }
- // if(dec==0&&lingweiflag==0)
- // {
- // delay(5);
- // if(dec==0)
- // {
- // num--;
- // while(!dec);
- // }
- // }
- // if(num>9999)
- // {
- // num=0;
- // }
- // if(num==0)
- // {
- // num=0;
- // lingweiflag=1;
- // }
- // }
- // void main()
- //{
- // while(1)
- // {
- // display();
- // keyscan();
- // }
- // }
- //程序二:解決按鍵控制數碼管帶來閃滅顯示問題的程序
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit add=P3^0;
- sbit dec=P3^4;
- uchar lingweiflag;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
- uint num;
- uint qian,bai,shi,ge;//定義拆字變量
- /**ms級延時子程序**/
- void delay(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++);
- }
- void display()
- {
- qian=num/1000;//取得千位數字
- bai=num%1000/100;//取得百位數字
- shi=num%100/10;//取得十位數字
- ge=num%10;//取得個位數字
- P2=0xfe;//數碼管千位顯示位
- P1=table[qian];//數碼管千位數值顯示
- delay(2);//延時
- P2=0xfd;//數碼管百位顯示位
- P1=table[bai];//數碼管百位數值顯示
- delay(2);//延時
- P2=0xfb;//數碼管十位顯示位
- P1=table[shi];//數碼管十位數值顯示
- delay(2);//延時
- P2=0xf7;//數碼管個位顯示位
- P1=table[ge];//數碼管個位數值顯示
- delay(2);//延時
- }
- void keyscan()
- {
- if(add==0)
- {
- delay(5);
- if(add==0)
- {
- num++;
- while(!add);
- lingweiflag=0;
- }
- }
- if(dec==0&&lingweiflag==0)
- {
- delay(5);
- if(dec==0)
- {
- num--;
- while(!dec);
- }
- }
- if(num>9999)
- {
- num=0;
- }
- if(num==0)
- {
- num=0;
- lingweiflag=1;
- }
- }
- void Time0_init()
- {
- TMOD=0x01;
- TH0=(65536-10000)/256;//為什么取定時器中斷時間為10000微妙,即10毫秒,亦0.01秒,則頻率為1/0.01S=100Hz?由于人眼能看到數碼管閃爍是源于人眼能識別高頻率(人眼看不到閃爍的頻率為50Hz)低于50Hz,即1/50Hz=0.02秒,因此要想讓人眼看不到數碼管閃爍,數管顯示函數的顯示頻率至少是50Hz,即1/50Hz=0.02秒,也不是越高越好,還要結合按鍵掃描函數的按鍵延時來取出最恰當的顯示頻率。
- TL0=(65536-10000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void time0() interrupt 1
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- display();
- }
- void main()
- {
- Time0_init();
- while(1)
- {
- keyscan();
- }
- }
復制代碼
1680900-20200520213008932-420492329.png (114.58 KB, 下載次數: 44)
下載附件
2020-5-20 21:31 上傳
|