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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1954|回復(fù): 8
收起左側(cè)

單片機(jī)動(dòng)態(tài)數(shù)碼管和中斷結(jié)合的程序問題

[復(fù)制鏈接]
ID:1007138 發(fā)表于 2022-3-4 18:12 | 顯示全部樓層 |閱讀模式
我想實(shí)現(xiàn)一個(gè)計(jì)分板左三個(gè)數(shù)碼管和右三個(gè)數(shù)碼管是分?jǐn)?shù)中間兩個(gè)是--,按鍵處理的時(shí)候如果把按鍵處理封裝成一個(gè)函數(shù)的話,再按按鍵的時(shí)候數(shù)碼管不會(huì)顯示,我想沒有這個(gè)空窗期,想用中斷試下看,但是不明白這個(gè)為什么不行?難道要用定時(shí)器計(jì)數(shù)器?

單片機(jī)源程序如下:
  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;          //下降沿觸發(fā)
  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. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-3-4 21:02 | 顯示全部樓層
不要用delay和while(!Key1)!
不要用delay和while(!Key1)!
不要用delay和while(!Key1)!
沒必要用中斷
把keypros()函數(shù)放進(jìn)main()的while(1)里
  1. void keypros()//多鍵短按
  2. {
  3.         static uchar Delay_XD=0;                        //消抖計(jì)數(shù)
  4.         if(!key1 || !Key2 || !Key3)
  5.         {
  6.                 if(Delay_XD<0xFF)Delay_XD++;
  7.                 if(Delay_XD==50)                        //調(diào)節(jié)消抖時(shí)間
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-3-4 21:13 | 顯示全部樓層
按鍵掃描和數(shù)碼管動(dòng)態(tài)顯示代碼,常見有十多鐘寫法。你選擇了兩個(gè)最差的寫法。給你改了一下,你試試。 無標(biāo)題.jpg

  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. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:1007138 發(fā)表于 2022-3-5 13:04 | 顯示全部樓層
wulin 發(fā)表于 2022-3-4 21:13
按鍵掃描和數(shù)碼管動(dòng)態(tài)顯示代碼,常見有十多鐘寫法。你選擇了兩個(gè)最差的寫法。給你改了一下,你試試。

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

使用道具 舉報(bào)

ID:1007138 發(fā)表于 2022-3-5 13:17 | 顯示全部樓層
小小彩姬 發(fā)表于 2022-3-5 13:04
請問++count>=10是消抖用嗎?還有P1&=0xc7;
        P1|=i

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

使用道具 舉報(bào)

ID:1007138 發(fā)表于 2022-3-5 13:24 | 顯示全部樓層
wulin 發(fā)表于 2022-3-4 21:13
按鍵掃描和數(shù)碼管動(dòng)態(tài)顯示代碼,常見有十多鐘寫法。你選擇了兩個(gè)最差的寫法。給你改了一下,你試試。

怎么感覺++count>=10實(shí)現(xiàn)不了呢?如果有按鍵按下的話,count才加1.這里好像不會(huì)循環(huán)判斷吧為什么會(huì)超過10呢?不解
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-3-5 14:35 | 顯示全部樓層
小小彩姬 發(fā)表于 2022-3-5 13:24
怎么感覺++count>=10實(shí)現(xiàn)不了呢?如果有按鍵按下的話,count才加1.這里好像不會(huì)循環(huán)判斷吧為什么會(huì)超過10 ...

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

使用道具 舉報(bào)

ID:1007138 發(fā)表于 2022-3-5 15:47 | 顯示全部樓層
wulin 發(fā)表于 2022-3-5 14:35
非特殊情況不要用delay阻滯型延時(shí)和 while (x)死等。在幾乎所有程序中都要讓主循環(huán)不停跑起來。在這個(gè)示 ...

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

使用道具 舉報(bào)

ID:1007138 發(fā)表于 2022-3-5 16:06 | 顯示全部樓層
小小彩姬 發(fā)表于 2022-3-5 15:47
這個(gè)count的意思是等一段時(shí)間先讓數(shù)碼管先亮起來,然后再做按鍵處理吧?最后的延時(shí)1ms好像可以去掉

請問這里為什么可以不延時(shí)1ms數(shù)碼管顯示,以前那個(gè)為什么要延時(shí)的
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 西西裸体做爰视频 | 国产精品久久久久久久久久了 | 国产精品久久久久久一区二区三区 | 久久久久91 | www.国产.com | 在线欧美小视频 | 欧美精品一区二区三区蜜桃视频 | 国产精品伦理一区二区三区 | 欧美日韩一 | 亚洲区一区二区 | 日本视频免费观看 | 欧美色综合一区二区三区 | 国产精彩视频在线观看 | 一级毛片视频在线 | 在线免费中文字幕 | 亚洲精品乱码久久久久久9色 | 成人精品国产免费网站 | 看一级毛片视频 | 久久精品国产一区老色匹 | 国产伊人精品 | 日韩欧美在线视频播放 | 久久精品电影 | 国产在线不卡 | 丝袜美腿一区二区三区 | 久久久婷婷| 国产精品欧美精品 | 久久伊人免费视频 | 精品亚洲一区二区三区四区五区 | 久久精品手机视频 | 高清视频一区二区三区 | 午夜在线小视频 | 亚洲一区二区三区视频 | 国产精品视频观看 | 一区二区三区精品视频 | 国产精品久久精品 | 美女啪啪国产 | 精品一区二区av | 国产乱码高清区二区三区在线 | 黄视频在线网站 | 第四色影音先锋 | 亚洲电影在线播放 |