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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機動態數碼管和中斷結合的程序問題

[復制鏈接]
跳轉到指定樓層
樓主
我想實現一個計分板左三個數碼管和右三個數碼管是分數中間兩個是--,按鍵處理的時候如果把按鍵處理封裝成一個函數的話,再按按鍵的時候數碼管不會顯示,我想沒有這個空窗期,想用中斷試下看,但是不明白這個為什么不行?難道要用定時器計數器?

單片機源程序如下:
  1. #include <reg52.h>

  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;

  4. sbit key1 = P1^0;
  5. sbit key2 = P1^1;
  6. sbit key3 = P1^2;

  7. sbit LSA = P1^3;
  8. sbit LSB = P1^4;
  9. sbit LSC = P1^5;


  10. uint point1 = 0,point2 = 0;
  11. uchar code duan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  12. uchar disp[8];

  13. void delay(uint z) {
  14.         uint y;
  15.         for (;z>0;z--) {
  16.                 for (y = 0; y < 110; y++) {
  17.                 }
  18.         }
  19. }

  20. void keyzhongduanInit() {
  21.         EA = 1;
  22.         EX0 = 1;
  23.         IT0 = 1;          //下降沿觸發
  24. }


  25. void keypros() interrupt 0 {
  26.         if (key1 == 0) {
  27.                 delay (10);
  28.                 if (key1 == 0) {
  29.                         point1++;               
  30.                 }
  31.                 while (!key1);
  32.         }
  33.         if (key2 == 0) {
  34.                 delay (10);
  35.                 if (key2 == 0) {
  36.                         point2++;               
  37.                 }
  38.                 while (!key2);
  39.         }
  40.         if (key3 == 0) {
  41.                 delay (10);
  42.                 if (key3 == 0) {
  43.                         point1 = 0;
  44.                         point2 = 0;
  45.                 }
  46.                 while (!key3);
  47.         }
  48. }

  49. void DisplayData() {
  50.         disp[0] = duan[point1 / 100];
  51.         disp[1] = duan[point1 % 100 / 10];
  52.         disp[2] = duan[point1 % 10];
  53.         disp[3] = 0x40;
  54.         disp[4] = 0x40;
  55.         disp[5] = duan[point2 / 100];
  56.         disp[6] = duan[point2 % 100 / 10];
  57.         disp[7] = duan[point2 % 10];
  58. }

  59. void weixuan() {
  60.         uchar i;
  61.         for (i = 0; i < 8; i++) {
  62.                 switch (i) {
  63.                         case (0): LSA = 0;LSB = 0;LSC = 0;break;
  64.                         case (1): LSA = 1;LSB = 0;LSC = 0;break;
  65.                         case (2): LSA = 0;LSB = 1;LSC = 0;break;
  66.                         case (3): LSA = 1;LSB = 1;LSC = 0;break;
  67.                         case (4): LSA = 0;LSB = 0;LSC = 1;break;
  68.                         case (5): LSA = 1;LSB = 0;LSC = 1;break;
  69.                         case (6): LSA = 0;LSB = 1;LSC = 1;break;
  70.                         case (7): LSA = 1;LSB = 1;LSC = 1;break;
  71.                 }
  72.                 P0 = disp[i];
  73.                 delay(1);
  74.                 P0 = 0x00;
  75.         }
  76. }

  77. void main() {
  78.         keyzhongduanInit();
  79.         while (1) {
  80.                 DisplayData();
  81.                 weixuan();
  82.         }               
  83. }
復制代碼

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

使用道具 舉報

沙發
ID:161164 發表于 2022-3-4 21:02 | 只看該作者
不要用delay和while(!Key1)!
不要用delay和while(!Key1)!
不要用delay和while(!Key1)!
沒必要用中斷
把keypros()函數放進main()的while(1)里
  1. void keypros()//多鍵短按
  2. {
  3.         static uchar Delay_XD=0;                        //消抖計數
  4.         if(!key1 || !Key2 || !Key3)
  5.         {
  6.                 if(Delay_XD<0xFF)Delay_XD++;
  7.                 if(Delay_XD==50)                        //調節消抖時間
  8.                 {
  9.                         if(!key1)
  10.                         {
  11.                                 point1++;
  12.                         }
  13.                         if(!Key2)
  14.                         {
  15.                                 point2++;
  16.                         }
  17.                         if(!key3)
  18.                         {
  19.                                 point1 = 0;
  20.                                 point2 = 0;
  21.                         }
  22.                 }
  23.         }
  24.         else                                                        //按鍵抬起
  25.                 Delay_XD=0;                                        //Delay_XD清0
  26. }
復制代碼
回復

使用道具 舉報

板凳
ID:213173 發表于 2022-3-4 21:13 | 只看該作者
按鍵掃描和數碼管動態顯示代碼,常見有十多鐘寫法。你選擇了兩個最差的寫法。給你改了一下,你試試。

  1. #include <reg52.h>

  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. /*
  5. sbit key1 = P1^0;
  6. sbit key2 = P1^1;
  7. sbit key3 = P1^2;
  8. sbit LSA = P1^3;
  9. sbit LSB = P1^4;
  10. sbit LSC = P1^5;
  11. **/
  12. uint point1=0,point2=0;
  13. uchar code duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  14. uchar disp[8]={0,0,0,0x40,0x40,0,0,0};

  15. void delay(uint z)
  16. {
  17.         uint y;
  18.         for(;z>0;z--)
  19.                 for(y=0;y<110;y++);
  20. }

  21. void key_scan()
  22. {
  23.         static uchar count=0;
  24.         static bit key_sign=0;
  25.         uchar key_value=P1&0x07;
  26.         if(key_value!=0x07)
  27.         {
  28.                 if(++count>=10 && key_sign==0)
  29.                 {
  30.                         key_sign=1;
  31.                         switch(key_value)
  32.                         {
  33.                                 case 0x06: if(point1<100)point1++; break;
  34.                                 case 0x05: if(point2<100)point2++; break;
  35.                                 case 0x03: point1=0;point2=0; break;
  36.                                 default: break;
  37.                         }
  38.                 }
  39.         }
  40.         else
  41.         {
  42.                 count=0;
  43.                 key_sign=0;
  44.         }
  45. }

  46. void DisplayData()
  47. {
  48.         disp[0] = duan[point1/100%10];
  49.         disp[1] = duan[point1/10%10];
  50.         disp[2] = duan[point1%10];
  51.         disp[5] = duan[point2/100%10];
  52.         disp[6] = duan[point2/10%10];
  53.         disp[7] = duan[point2%10];
  54. }

  55. void weixuan()
  56. {
  57.         static uchar i;
  58.         P0=0x00;
  59.         P1&=0xc7;
  60.         P1|=i<<3;
  61.         P0=disp[i];
  62.         i=++i%8;
  63. }

  64. void main()
  65. {
  66.         while (1)
  67.         {
  68.                 key_scan();
  69.                 DisplayData();
  70.                 weixuan();
  71.                 delay(1);
  72.         }
  73. }
復制代碼



回復

使用道具 舉報

地板
ID:1007138 發表于 2022-3-5 13:04 | 只看該作者
wulin 發表于 2022-3-4 21:13
按鍵掃描和數碼管動態顯示代碼,常見有十多鐘寫法。你選擇了兩個最差的寫法。給你改了一下,你試試。

請問++count>=10是消抖用嗎?還有P1&=0xc7;
        P1|=i<<3;這兩句話沒看懂什么意思
回復

使用道具 舉報

5#
ID:1007138 發表于 2022-3-5 13:17 | 只看該作者
小小彩姬 發表于 2022-3-5 13:04
請問++count>=10是消抖用嗎?還有P1&=0xc7;
        P1|=i

后面兩句話懂了,但是按鍵模塊里的count和key_sign是做什么的呢?
感謝大佬指導
回復

使用道具 舉報

6#
ID:1007138 發表于 2022-3-5 13:24 | 只看該作者
wulin 發表于 2022-3-4 21:13
按鍵掃描和數碼管動態顯示代碼,常見有十多鐘寫法。你選擇了兩個最差的寫法。給你改了一下,你試試。

怎么感覺++count>=10實現不了呢?如果有按鍵按下的話,count才加1.這里好像不會循環判斷吧為什么會超過10呢?不解
回復

使用道具 舉報

7#
ID:213173 發表于 2022-3-5 14:35 | 只看該作者
小小彩姬 發表于 2022-3-5 13:24
怎么感覺++count>=10實現不了呢?如果有按鍵按下的話,count才加1.這里好像不會循環判斷吧為什么會超過10 ...

非特殊情況不要用delay阻滯型延時和 while (x)死等。在幾乎所有程序中都要讓主循環不停跑起來。在這個示例中用delay的目的是控制主循環周期約1ms,也就是1ms時間子函數輪詢一遍。按鍵按下count計數10次約10ms與按鍵狀態key_sign標志“相與”,滿足條件執行相應語句。key_sign=1,下次輪詢時沒有松手就不會重復執行。直到松手key_sign=0。數碼管動態掃描同樣是1ms顯示1位,這樣按鍵和數碼管就不會互相干擾了。
回復

使用道具 舉報

8#
ID:1007138 發表于 2022-3-5 15:47 | 只看該作者
wulin 發表于 2022-3-5 14:35
非特殊情況不要用delay阻滯型延時和 while (x)死等。在幾乎所有程序中都要讓主循環不停跑起來。在這個示 ...

這個count的意思是等一段時間先讓數碼管先亮起來,然后再做按鍵處理吧?最后的延時1ms好像可以去掉
回復

使用道具 舉報

9#
ID:1007138 發表于 2022-3-5 16:06 | 只看該作者
小小彩姬 發表于 2022-3-5 15:47
這個count的意思是等一段時間先讓數碼管先亮起來,然后再做按鍵處理吧?最后的延時1ms好像可以去掉

請問這里為什么可以不延時1ms數碼管顯示,以前那個為什么要延時的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡一区二区三区在线观看 | 国产亚洲网站 | 久久久精品一区 | 日韩在线一区二区三区 | 国产成人精品一区二区三区在线 | 99精品一区二区 | 国产精品福利在线观看 | 免费黄色成人 | 欧美乱操 | 亚洲视频免费在线播放 | 另类视频在线 | 久久99精品久久久97夜夜嗨 | 欧美一级二级在线观看 | 日日操夜夜操天天操 | 日韩一区二区三区视频 | 久久国产精品精品 | 偷拍自拍网址 | 成人激情视频免费观看 | 欧美一区二区三区久久精品 | 国产成人99 | 日韩在线播放网址 | 免费v片 | 国产在线精品一区 | 久久久精 | 精品99在线 | 国产www成人 | 91在线影院 | 国产精品九九视频 | 精品国产乱码久久久久久蜜退臀 | 97高清国语自产拍 | 亚洲高清视频在线 | 日韩手机在线看片 | 欧美第一页 | 亚洲人久久 | a黄视频 | 青草久久免费视频 | 狠狠久久综合 | 综合网视频| 午夜a v电影| 国产精品一区二区三 | 日韩欧美一区二区三区免费观看 |