找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3962|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

解決單片機按鍵控制數(shù)碼管帶來閃滅顯示問題的項目工程(優(yōu)化版一)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:171036 發(fā)表于 2020-5-20 21:31 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 51黑電子會員 于 2020-5-22 08:38 編輯
  1. /*****
  2. 為什么按下按鍵到按鍵抬起后,會干擾到數(shù)碼管的顯示?原因:如果按鍵掃描
  3. 函數(shù)和數(shù)碼管顯示函數(shù)都放在主函數(shù)的固定循環(huán)內(nèi),當按鍵按下后,按鍵掃描
  4. 函數(shù)進行按鍵掃描,在掃描到按鍵延時后,CPU被限制在按鍵延時處進行計時,
  5. 卻無法運行其他程序,從而導致數(shù)碼管顯示函數(shù)無法運行,就會出現(xiàn)數(shù)碼管閃
  6. 滅顯示問題。人能看到數(shù)碼管閃爍是因為人眼能識別高頻率(人眼看不到閃爍
  7. 的頻率為50Hz)低于50Hz,即1/50Hz=0.02秒,因此要想讓人眼看不到數(shù)碼管閃
  8. 爍,數(shù)碼管顯示函數(shù)的顯示頻率至少是50Hz,即1/50Hz=0.02秒,也不是越高
  9. 好,還要結(jié)合按鍵掃描函數(shù)的按鍵延時來取出最恰當?shù)娘@示頻率。
  10. 本程序分兩個程序。一個是程序一,按鍵控制數(shù)碼管帶來閃滅顯示問題的程序。
  11. 另一個是程序二,解決按鍵控制數(shù)碼管帶來閃滅顯示問題的程序。通過把數(shù)碼
  12. 管顯示函數(shù)放在定時器中斷子程序中,以及把按鍵掃描函數(shù)放在主函數(shù)固定循
  13. 環(huán)內(nèi)。提醒:先試程序一,再試程序二,之后兩者對比,找出不同點,取最適
  14. 合的。
  15. *****/
  16. //程序一:按鍵控制數(shù)碼管帶來閃滅顯示問題的程序
  17. //#include<reg51.h>
  18. //#define uchar unsigned char
  19. //#define uint unsigned int
  20. //sbit add=P3^0;
  21. //sbit dec=P3^4;
  22. //uchar lingweiflag;
  23. //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點亮數(shù)碼管段碼數(shù)字0~9。
  24. //uint num;
  25. //uint qian,bai,shi,ge;//定義拆字變量
  26. //  /**ms級延時子程序**/
  27. //  void delay(uint x)
  28. //{
  29. //   uint i,j;                       
  30. //   for(i=0;i<x;i++)     
  31. //    for(j=0;j<110;j++);
  32. //  }
  33. //  void display()
  34. //{
  35. //   qian=num/1000;//取得千位數(shù)字
  36. //   bai=num%1000/100;//取得百位數(shù)字
  37. //   shi=num%100/10;//取得十位數(shù)字
  38. //   ge=num%10;//取得個位數(shù)字
  39. //
  40. //   P2=0xfe;//數(shù)碼管千位顯示位
  41. //   P1=table[qian];//數(shù)碼管千位數(shù)值顯示
  42. //   delay(2);//延時
  43. //
  44. //   P2=0xfd;//數(shù)碼管百位顯示位
  45. //   P1=table[bai];//數(shù)碼管百位數(shù)值顯示
  46. //   delay(2);//延時
  47. //
  48. //   P2=0xfb;//數(shù)碼管十位顯示位
  49. //   P1=table[shi];//數(shù)碼管十位數(shù)值顯示
  50. //   delay(2);//延時
  51. //
  52. //   P2=0xf7;//數(shù)碼管個位顯示位
  53. //   P1=table[ge];//數(shù)碼管個位數(shù)值顯示
  54. //   delay(2);//延時
  55. // }
  56. //  void keyscan()
  57. //{
  58. //   if(add==0)
  59. // {         
  60. //    delay(5);
  61. //    if(add==0)
  62. //  {
  63. //     num++;
  64. //     while(!add);
  65. //     lingweiflag=0;
  66. //    }
  67. //   }
  68. //   if(dec==0&&lingweiflag==0)
  69. // {         
  70. //    delay(5);
  71. //    if(dec==0)
  72. //  {
  73. //     num--;
  74. //     while(!dec);
  75. //    }
  76. //   }
  77. //   if(num>9999)
  78. // {
  79. //      num=0;
  80. //   }
  81. //   if(num==0)
  82. // {
  83. //       num=0;
  84. //       lingweiflag=1;
  85. //   }
  86. // }
  87. //  void main()
  88. //{
  89. //   while(1)
  90. // {
  91. //    display();
  92. //    keyscan();
  93. //   }
  94. //  }



  95. //程序二:解決按鍵控制數(shù)碼管帶來閃滅顯示問題的程序
  96. #include<reg51.h>
  97. #define uchar unsigned char
  98. #define uint unsigned int
  99. sbit add=P3^0;
  100. sbit dec=P3^4;
  101. uchar lingweiflag;
  102. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點亮數(shù)碼管段碼數(shù)字0~9。
  103. uint num;
  104. uint qian,bai,shi,ge;//定義拆字變量
  105.   /**ms級延時子程序**/
  106.   void delay(uint x)
  107. {
  108.    uint i,j;                       
  109.    for(i=0;i<x;i++)     
  110.     for(j=0;j<110;j++);
  111.   }
  112.   void display()
  113. {
  114.    qian=num/1000;//取得千位數(shù)字
  115.    bai=num%1000/100;//取得百位數(shù)字
  116.    shi=num%100/10;//取得十位數(shù)字
  117.    ge=num%10;//取得個位數(shù)字

  118.    P2=0xfe;//數(shù)碼管千位顯示位
  119.    P1=table[qian];//數(shù)碼管千位數(shù)值顯示
  120.    delay(2);//延時

  121.    P2=0xfd;//數(shù)碼管百位顯示位
  122.    P1=table[bai];//數(shù)碼管百位數(shù)值顯示
  123.    delay(2);//延時

  124.    P2=0xfb;//數(shù)碼管十位顯示位
  125.    P1=table[shi];//數(shù)碼管十位數(shù)值顯示
  126.    delay(2);//延時

  127.    P2=0xf7;//數(shù)碼管個位顯示位
  128.    P1=table[ge];//數(shù)碼管個位數(shù)值顯示
  129.    delay(2);//延時
  130. }
  131.   void keyscan()
  132. {
  133.    if(add==0)
  134. {         
  135.     delay(5);
  136.     if(add==0)
  137.   {
  138.      num++;
  139.      while(!add);
  140.      lingweiflag=0;
  141.     }
  142.    }
  143.    if(dec==0&&lingweiflag==0)
  144. {         
  145.     delay(5);
  146.     if(dec==0)
  147.   {
  148.      num--;
  149.      while(!dec);
  150.     }
  151.    }
  152.    if(num>9999)
  153. {
  154.     num=0;
  155.    }
  156.    if(num==0)
  157. {
  158.     num=0;
  159.     lingweiflag=1;
  160.    }
  161. }
  162.   void Time0_init()
  163. {
  164.    TMOD=0x01;
  165.    TH0=(65536-10000)/256;//為什么取定時器中斷時間為10000微妙,即10毫秒,亦0.01秒,則頻率為1/0.01S=100Hz?由于人眼能看到數(shù)碼管閃爍是源于人眼能識別高頻率(人眼看不到閃爍的頻率為50Hz)低于50Hz,即1/50Hz=0.02秒,因此要想讓人眼看不到數(shù)碼管閃爍,數(shù)管顯示函數(shù)的顯示頻率至少是50Hz,即1/50Hz=0.02秒,也不是越高越好,還要結(jié)合按鍵掃描函數(shù)的按鍵延時來取出最恰當?shù)娘@示頻率。
  166.    TL0=(65536-10000)%256;
  167.    EA=1;
  168.    ET0=1;
  169.    TR0=1;
  170.   }
  171.   void time0() interrupt 1
  172. {
  173.    TH0=(65536-10000)/256;
  174.    TL0=(65536-10000)%256;
  175.    display();
  176.   }
  177.   void main()
  178. {
  179.    Time0_init();
  180.    while(1)
  181. {
  182.     keyscan();
  183.    }
  184.   }
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:584814 發(fā)表于 2020-5-21 20:07 | 只看該作者
大段注釋程序行行用//可以顯示耐力優(yōu)化略顯呵呵
回復(fù)

使用道具 舉報

板凳
ID:171036 發(fā)表于 2020-5-21 21:54 | 只看該作者
man1234567 發(fā)表于 2020-5-21 20:07
大段注釋程序行行用//可以顯示耐力優(yōu)化略顯呵呵

基礎(chǔ)扎不扎實  看基本功
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表