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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

想把單片機獨立按鍵和數碼管倒計時程序結合起來,遇到一些問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1101371 發表于 2024-2-6 14:28 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
想實現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
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1101371 發表于 2024-2-6 15:02 來自手機 | 只看該作者
現在就是我想像獨立按鍵控制led一樣加個取反讓這個smg的函數取反,不然就只按一下數碼管確實開始動了,能夠實現倒計時,但是再按就停不下來了
回復

使用道具 舉報

板凳
ID:1109793 發表于 2024-2-6 16:52 | 只看該作者
你這樣就是停在key_func()里面的那根while里面了,無法再響應按鍵了。調整一下思路,不要總是用while。
回復

使用道具 舉報

地板
ID:1109793 發表于 2024-2-6 18:48 | 只看該作者
另外無覺得你還是粘貼代碼吧,這樣看著太費勁
回復

使用道具 舉報

5#
ID:213173 發表于 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. }
復制代碼
回復

使用道具 舉報

6#
ID:584814 發表于 2024-2-7 08:13 | 只看該作者
對用圖片求助表示呵呵,如果程序保密不如找個算命的可能幫助更大
回復

使用道具 舉報

7#
ID:619259 發表于 2024-4-18 22:12 | 只看該作者
思路:按鍵第一次按下,啟動定時器,TR0 = 1;第二次按下,停止定時器,TR0 = 0;
按鍵加個狀態標示。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品久久久久久国产越南 | 奇色影视 | 天天操天天天干 | 国产日韩欧美精品 | 亚州精品成人 | 久久综合一区二区三区 | 久久免费电影 | 久久一区 | 成人精品视频在线观看 | 国产高清久久久 | 一二三四在线视频观看社区 | 欧美a在线 | 日韩免费在线 | 国产福利91精品一区二区三区 | 精品国产伦一区二区三区观看体验 | 日韩在线免费电影 | 国产精品无码久久久久 | 色频| 久久99视频这里只有精品 | 亚洲精品第一 | 国产精品久久久久久久久免费相片 | 在线午夜 | 日本三级全黄三级a | www.亚洲一区二区三区 | 国产精品美女久久久久久免费 | 一区二区三区视频在线观看 | 亚洲九九精品 | 欧美日韩国产精品激情在线播放 | 亚洲精品乱码久久久久久9色 | 国产精品1区2区3区 欧美 中文字幕 | 中文字幕电影在线观看 | 国产精品区一区二区三 | 自拍视频国产 | 欧美日韩专区 | 亚洲三区在线播放 | 日韩在线一区二区 | 日韩中文字幕网 | 国产成人99久久亚洲综合精品 | 欧美福利视频 | 91国产精品在线 | 色av一区二区三区 |