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

標題: 想把單片機獨立按鍵和數碼管倒計時程序結合起來,遇到一些問題 [打印本頁]

作者: Pikachu233    時間: 2024-2-6 14:28
標題: 想把單片機獨立按鍵和數碼管倒計時程序結合起來,遇到一些問題
想實現KEY1按下開始倒計時,再按一下結束倒計時的功能。
主要是第五張圖片的程序,把這個smg_fuc()數碼管倒計時的程序和獨立按鍵的程序關聯一下,但是獨立按鍵那個波形不是自鎖開關,按下就保持低電平,它又回到高電平,我想在低電平的情況下關聯smg函數只能加個while(1),不然得一直按保持低電平。不知道該怎么改單片機代碼

IMG_20240206_141053.jpg (1.4 MB, 下載次數: 91)

IMG_20240206_141053.jpg

IMG_20240206_141143.jpg (1.42 MB, 下載次數: 91)

IMG_20240206_141143.jpg

IMG_20240206_141216.jpg (1.55 MB, 下載次數: 99)

IMG_20240206_141216.jpg

IMG_20240206_141226.jpg (1.47 MB, 下載次數: 104)

IMG_20240206_141226.jpg

IMG_20240206_141235.jpg (1.57 MB, 下載次數: 95)

IMG_20240206_141235.jpg

IMG_20240206_141245.jpg (1.6 MB, 下載次數: 87)

IMG_20240206_141245.jpg

作者: Pikachu233    時間: 2024-2-6 15:02
現在就是我想像獨立按鍵控制led一樣加個取反讓這個smg的函數取反,不然就只按一下數碼管確實開始動了,能夠實現倒計時,但是再按就停不下來了
作者: xiaobendan001    時間: 2024-2-6 16:52
你這樣就是停在key_func()里面的那根while里面了,無法再響應按鍵了。調整一下思路,不要總是用while。
作者: xiaobendan001    時間: 2024-2-6 18:48
另外無覺得你還是粘貼代碼吧,這樣看著太費勁
作者: wulin    時間: 2024-2-6 21:12
單鍵控制9分59秒倒計時
  1. #include <reg51.H>
  2. #include <intrins.H>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit bai=P3^0;
  6. sbit shi=P3^1;
  7. sbit  ge=P3^2;
  8. sbit key=P3^6;

  9. //定義需要顯示的數字
  10. //反序共陰極數碼管段碼表,段碼a-h順序接PX7-PX0
  11. unsigned char code dis[]={//共陰數碼管段碼"0~f-."
  12.         0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,
  13.         0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x02,0x01};
  14. uchar data buf[3];
  15. char sec=0,sec_1=0,min=1,min_1=1;      //秒、分
  16. uchar Key_value;              //鍵值
  17. uchar set=0;                  //設置標志
  18. uint cnt=0,cnt1=0;            //中斷計數
  19. uint count=0;                 //長/短按計數
  20. uint rst=0;                                             //復位計數
  21. bit flag_ms=0;                //1ms中斷標志
  22. bit flicker=0;                //閃爍標志
  23. bit start=0;                  //開始標志
  24. bit On_Off=1;                 //開關標志


  25. void Timer0Init(void)                //1毫秒@12.000MHz
  26. {
  27.         TMOD |= 0x01;                //設置定時器模式
  28.         TL0 = 0x18;                //設置定時初始值
  29.         TH0 = 0xFC;                //設置定時初始值
  30.         TF0 = 0;                //清除TF0標志
  31.         TR0 = 1;                //定時器0開始計時
  32.         EA  = 1;
  33.         ET0 = 1;
  34. }

  35. //數碼管顯示函數
  36. void display()
  37. {
  38.         static uchar i;
  39.         if(On_Off)
  40.         {
  41.                 P1=0x00;
  42.                 if(set==0)
  43.                 {
  44.                         switch(i)
  45.                         {
  46.                                 case 0: bai=0;shi=1;ge=1;P1=dis[min]|0x01; break;
  47.                                 case 1: bai=1;shi=0;ge=1;P1=dis[sec/10]; break;
  48.                                 case 2: bai=1;shi=1;ge=0;P1=dis[sec%10]; break;
  49.                         }
  50.                 }
  51.                 if(set==1)
  52.                 {
  53.                         switch(i)
  54.                         {
  55.                                 case 0: bai=0;shi=1;ge=1;
  56.                                                 if(flicker)P1=dis[min]|0x01; else P1=0x01; break;                                               
  57.                                 case 1: bai=1;shi=0;ge=1;P1=dis[sec/10]; break;
  58.                                 case 2: bai=1;shi=1;ge=0;P1=dis[sec%10]; break;
  59.                         }
  60.                 }
  61.                 if(set==2)
  62.                 {
  63.                         switch(i)
  64.                         {
  65.                                 case 0: bai=0;shi=1;ge=1;P1=dis[min]|0x01; break;
  66.                                 case 1: bai=1;shi=0;ge=1;
  67.                                                 if(flicker)P1=dis[sec/10];else P1=0x00; break;                                               
  68.                                 case 2: bai=1;shi=1;ge=0;P1=dis[sec%10]; break;
  69.                         }
  70.                 }
  71.                 if(set==3)
  72.                 {
  73.                         switch(i)
  74.                         {
  75.                                 case 0: bai=0;shi=1;ge=1;P1=dis[min]|0x01; break;
  76.                                 case 1: bai=1;shi=0;ge=1;P1=dis[sec/10]; break;
  77.                                 case 2: bai=1;shi=1;ge=0;
  78.                                                 if(flicker)P1=dis[sec%10];else P1=0x00; break;       
  79.                         }
  80.                 }
  81.         }
  82.         else
  83.         {
  84.                 P1=0xff;
  85.                 bai=1;
  86.                 shi=1;
  87.                 ge=1;
  88.         }
  89.         i=++i%4;
  90. }
  91. //按鍵掃描
  92. void key_scan()
  93. {
  94.         if(!key)
  95.         {
  96.                 count++;
  97.                 if(count>1000)         //長按時長
  98.                         count=1001;
  99.                 if(count==10)          //大于10ms小于500ms算短按
  100.                 {
  101.                         Key_value=0x01;
  102.                 }
  103.                 if(count==1000)          //達到1s算長按
  104.                 {
  105.                         Key_value|=0x10;
  106.                 }
  107.         }
  108.         else    //按鍵松手
  109.         {
  110.                 if(count>0)rst=5000;//復位計數賦值
  111.                 count=0;//長/短按計數清0
  112.         }
  113. }      
  114. //按鍵服務程序
  115. void key_service()
  116. {
  117.         //短按等待松手后響應,長按達1s不論是否松手立即響應
  118.         if((count==0||count==1000) && Key_value!=0x00)
  119.         {
  120.                 switch(Key_value)
  121.                 {
  122.                         case 0x01://短按1任務
  123.                                 if(On_Off==0 && !start && set==0)On_Off=1;//開機
  124.                                 else if(On_Off && !start && set==0){min=min_1;sec=sec_1;start=1;}//啟動倒計時
  125.                                 else if(On_Off && !start && set>0)//設置時間
  126.                                 {
  127.                                         switch(set)
  128.                                         {
  129.                                                 case 1: min++;  if(min>9)min=0; break;//設置分
  130.                                                 case 2: sec+=10;if(sec>=60)sec%=10; break;//設置秒十位
  131.                                                 case 3: sec++;  if(sec%10==0)sec-=10; break;//設置秒個位
  132.                                         }       
  133.                                         min_1=min;//緩存分
  134.                                         sec_1=sec;//緩存秒
  135.                                 }                               
  136.                         break;

  137.                         case 0x11:                
  138.                                 if(On_Off && !start)
  139.                                 {
  140.                                         if(++set==4)set=0;//操作設置狀態
  141.                                         rst=5000;
  142.                                 }
  143.                         break;
  144.                 }
  145.                 Key_value=0x00;//鍵值清0
  146.         }
  147. }
  148. //復位/關機函數
  149. void reset()
  150. {
  151.         if(rst>0)
  152.         {
  153.                 rst--;
  154.                 if(rst==0)
  155.                 {
  156.                         if(count==0)//按鍵已松手
  157.                                 set=0;//設置狀態復位
  158.                         else if(!start)//長按5秒不松手關機(倒計時運行中不可關機)
  159.                         {
  160.                                 set=0;//設置狀態復位
  161.                                 On_Off=0;//關機
  162.                         }
  163.                 }
  164.         }
  165. }
  166. //主函數
  167. void main()
  168. {
  169.         Timer0Init();
  170.         while(1)
  171.         {
  172.                 if(flag_ms)
  173.                 {
  174.                         flag_ms=0;//1ms標志清0
  175.                         display();//數碼管顯示函數
  176.                         key_scan();//按鍵掃描函數
  177.                         key_service();//按鍵服務函數
  178.                         reset();//復位/關機函數
  179.                 }
  180.         }
  181. }

  182. //T0中斷服務函數
  183. void InterruptTimer0() interrupt 1
  184. {
  185.         TL0 = 0x18;                //設置定時初始值
  186.         TH0 = 0xFC;                //設置定時初始值
  187.         if(start)
  188.         {
  189.                 if(++cnt>=1000)//1s
  190.                 {
  191.                         cnt=0;
  192.                         sec--;
  193.                         if(sec==0 && min==0)//倒計時結束
  194.                         {
  195.                                 start=0;        //開始標志清0
  196.                         }
  197.                         else if(sec<0)
  198.                         {
  199.                                 sec=59;
  200.                                 min --;
  201.                         }
  202.                 }
  203.         }
  204.         if(++cnt1>=200)        //200ms 5Hz閃爍,可以任意調整閃爍頻率
  205.         {
  206.                 cnt1=0;
  207.                 flicker=~flicker;  //閃爍標志取反
  208.         }
  209.         flag_ms=1;//1ms中斷標志賦值
  210. }
復制代碼

作者: man1234567    時間: 2024-2-7 08:13
對用圖片求助表示呵呵,如果程序保密不如找個算命的可能幫助更大
作者: cy009    時間: 2024-4-18 22:12
思路:按鍵第一次按下,啟動定時器,TR0 = 1;第二次按下,停止定時器,TR0 = 0;
按鍵加個狀態標示。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩城人网站 | 欧美日韩在线看 | 亚洲另类视频 | 欧美成人精品欧美一级乱黄 | 黄色片在线 | www.亚洲精品 | 一区二区精品在线 | 亚洲一区色 | 999精品在线 | 黄色片视频网站 | 国产一区二区福利 | 亚洲综合激情网 | 国产精品久久久久久中文字 | 久久久久久久久久久久久久久久久 | 国产又粗又猛视频免费 | 久久这里有精品 | 国产美女视频网站 | 久草视频网站 | 日日日操| 天天射天天爽 | 一级黄色大片 | 国产日韩在线播放 | 一区二区三区四区免费视频 | 五月亚洲 | 久久网页| 亚洲无av在线中文字幕 | 婷婷久久综合 | 日韩欧美色 | 日韩精品视频在线播放 | 日本不卡在线 | www.亚洲精品| 国产理论在线观看 | 国产精品成人免费视频 | 久久精品欧美一区二区三区不卡 | 国产中文字幕在线播放 | 成人毛片在线 | 欧美在线激情 | 亚洲成人中文字幕 | 国产九九精品 | 午夜小视频在线观看 | 欧美黄色录像 |