久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3887|回復: 2
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 51黑電子會員 于 2020-5-22 08:38 編輯
  1. /*****
  2. 為什么按下按鍵到按鍵抬起后,會干擾到數碼管的顯示?原因:如果按鍵掃描
  3. 函數和數碼管顯示函數都放在主函數的固定循環內,當按鍵按下后,按鍵掃描
  4. 函數進行按鍵掃描,在掃描到按鍵延時后,CPU被限制在按鍵延時處進行計時,
  5. 卻無法運行其他程序,從而導致數碼管顯示函數無法運行,就會出現數碼管閃
  6. 滅顯示問題。人能看到數碼管閃爍是因為人眼能識別高頻率(人眼看不到閃爍
  7. 的頻率為50Hz)低于50Hz,即1/50Hz=0.02秒,因此要想讓人眼看不到數碼管閃
  8. 爍,數碼管顯示函數的顯示頻率至少是50Hz,即1/50Hz=0.02秒,也不是越高
  9. 好,還要結合按鍵掃描函數的按鍵延時來取出最恰當的顯示頻率。
  10. 本程序分兩個程序。一個是程序一,按鍵控制數碼管帶來閃滅顯示問題的程序。
  11. 另一個是程序二,解決按鍵控制數碼管帶來閃滅顯示問題的程序。通過把數碼
  12. 管顯示函數放在定時器中斷子程序中,以及把按鍵掃描函數放在主函數固定循
  13. 環內。提醒:先試程序一,再試程序二,之后兩者對比,找出不同點,取最適
  14. 合的。
  15. *****/
  16. //程序一:按鍵控制數碼管帶來閃滅顯示問題的程序
  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} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字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;//取得千位數字
  36. //   bai=num%1000/100;//取得百位數字
  37. //   shi=num%100/10;//取得十位數字
  38. //   ge=num%10;//取得個位數字
  39. //
  40. //   P2=0xfe;//數碼管千位顯示位
  41. //   P1=table[qian];//數碼管千位數值顯示
  42. //   delay(2);//延時
  43. //
  44. //   P2=0xfd;//數碼管百位顯示位
  45. //   P1=table[bai];//數碼管百位數值顯示
  46. //   delay(2);//延時
  47. //
  48. //   P2=0xfb;//數碼管十位顯示位
  49. //   P1=table[shi];//數碼管十位數值顯示
  50. //   delay(2);//延時
  51. //
  52. //   P2=0xf7;//數碼管個位顯示位
  53. //   P1=table[ge];//數碼管個位數值顯示
  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. //程序二:解決按鍵控制數碼管帶來閃滅顯示問題的程序
  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} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字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;//取得千位數字
  115.    bai=num%1000/100;//取得百位數字
  116.    shi=num%100/10;//取得十位數字
  117.    ge=num%10;//取得個位數字

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

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

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

  127.    P2=0xf7;//數碼管個位顯示位
  128.    P1=table[ge];//數碼管個位數值顯示
  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?由于人眼能看到數碼管閃爍是源于人眼能識別高頻率(人眼看不到閃爍的頻率為50Hz)低于50Hz,即1/50Hz=0.02秒,因此要想讓人眼看不到數碼管閃爍,數管顯示函數的顯示頻率至少是50Hz,即1/50Hz=0.02秒,也不是越高越好,還要結合按鍵掃描函數的按鍵延時來取出最恰當的顯示頻率。
  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.   }
復制代碼

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

基礎扎不扎實  看基本功
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久影音先锋 | 久久精品欧美一区二区三区麻豆 | 亚洲国产精品一区二区www | 亚洲网在线 | 国产成人一区二区三区电影 | 日韩精品成人一区二区三区视频 | 亚洲成人免费视频 | 99re6在线视频精品免费 | h在线| 久久久精品综合 | 国产精品亚洲一区二区三区在线观看 | 日韩在线免费视频 | 五月槐花香| 成人精品国产一区二区4080 | 91免费看片 | 中文字幕在线不卡播放 | 日韩一区二区三区在线视频 | 九九伦理电影 | 午夜视频一区二区三区 | 精品久久影院 | 色视频在线免费观看 | 91啪亚洲精品 | 欧美一级片在线观看 | 久久一| 国产精品久久久久久影视 | 在线国产一区二区 | 伊人一区| 黄色一级大片在线免费看产 | 久久一区二区视频 | 一区二区三区四区在线视频 | 成人av在线播放 | 国产精品一级 | 国产精品99久久久久久www | 国产一区日韩在线 | 久久精品亚洲一区二区三区浴池 | 欧美精品久久久久久 | 久久一区二区av | 99色在线视频 | 成人精品鲁一区一区二区 | 国产精品明星裸体写真集 | 亚洲草草视频 |