找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

想把單片機(jī)獨(dú)立按鍵和數(shù)碼管倒計(jì)時(shí)程序結(jié)合起來(lái),遇到一些問(wèn)題

[復(fù)制鏈接]
ID:1101371 發(fā)表于 2024-2-6 14:28 來(lái)自手機(jī) | 顯示全部樓層 |閱讀模式
50黑幣
想實(shí)現(xiàn)KEY1按下開(kāi)始倒計(jì)時(shí),再按一下結(jié)束倒計(jì)時(shí)的功能。
主要是第五張圖片的程序,把這個(gè)smg_fuc()數(shù)碼管倒計(jì)時(shí)的程序和獨(dú)立按鍵的程序關(guān)聯(lián)一下,但是獨(dú)立按鍵那個(gè)波形不是自鎖開(kāi)關(guān),按下就保持低電平,它又回到高電平,我想在低電平的情況下關(guān)聯(lián)smg函數(shù)只能加個(gè)while(1),不然得一直按保持低電平。不知道該怎么改單片機(jī)代碼

IMG_20240206_141053.jpg
IMG_20240206_141143.jpg
IMG_20240206_141216.jpg
IMG_20240206_141226.jpg
IMG_20240206_141235.jpg
IMG_20240206_141245.jpg
回復(fù)

使用道具 舉報(bào)

ID:1101371 發(fā)表于 2024-2-6 15:02 來(lái)自手機(jī) | 顯示全部樓層
現(xiàn)在就是我想像獨(dú)立按鍵控制led一樣加個(gè)取反讓這個(gè)smg的函數(shù)取反,不然就只按一下數(shù)碼管確實(shí)開(kāi)始動(dòng)了,能夠?qū)崿F(xiàn)倒計(jì)時(shí),但是再按就停不下來(lái)了
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-2-6 16:52 | 顯示全部樓層
你這樣就是停在key_func()里面的那根while里面了,無(wú)法再響應(yīng)按鍵了。調(diào)整一下思路,不要總是用while。
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-2-6 18:48 | 顯示全部樓層
另外無(wú)覺(jué)得你還是粘貼代碼吧,這樣看著太費(fèi)勁
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2024-2-6 21:12 | 顯示全部樓層
單鍵控制9分59秒倒計(jì)時(shí)
  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. //定義需要顯示的數(shù)字
  10. //反序共陰極數(shù)碼管段碼表,段碼a-h順序接PX7-PX0
  11. unsigned char code dis[]={//共陰數(shù)碼管段碼"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;                  //設(shè)置標(biāo)志
  18. uint cnt=0,cnt1=0;            //中斷計(jì)數(shù)
  19. uint count=0;                 //長(zhǎng)/短按計(jì)數(shù)
  20. uint rst=0;                                             //復(fù)位計(jì)數(shù)
  21. bit flag_ms=0;                //1ms中斷標(biāo)志
  22. bit flicker=0;                //閃爍標(biāo)志
  23. bit start=0;                  //開(kāi)始標(biāo)志
  24. bit On_Off=1;                 //開(kāi)關(guān)標(biāo)志


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

  35. //數(shù)碼管顯示函數(shù)
  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)         //長(zhǎng)按時(shí)長(zhǎng)
  98.                         count=1001;
  99.                 if(count==10)          //大于10ms小于500ms算短按
  100.                 {
  101.                         Key_value=0x01;
  102.                 }
  103.                 if(count==1000)          //達(dá)到1s算長(zhǎng)按
  104.                 {
  105.                         Key_value|=0x10;
  106.                 }
  107.         }
  108.         else    //按鍵松手
  109.         {
  110.                 if(count>0)rst=5000;//復(fù)位計(jì)數(shù)賦值
  111.                 count=0;//長(zhǎng)/短按計(jì)數(shù)清0
  112.         }
  113. }      
  114. //按鍵服務(wù)程序
  115. void key_service()
  116. {
  117.         //短按等待松手后響應(yīng),長(zhǎng)按達(dá)1s不論是否松手立即響應(yīng)
  118.         if((count==0||count==1000) && Key_value!=0x00)
  119.         {
  120.                 switch(Key_value)
  121.                 {
  122.                         case 0x01://短按1任務(wù)
  123.                                 if(On_Off==0 && !start && set==0)On_Off=1;//開(kāi)機(jī)
  124.                                 else if(On_Off && !start && set==0){min=min_1;sec=sec_1;start=1;}//啟動(dòng)倒計(jì)時(shí)
  125.                                 else if(On_Off && !start && set>0)//設(shè)置時(shí)間
  126.                                 {
  127.                                         switch(set)
  128.                                         {
  129.                                                 case 1: min++;  if(min>9)min=0; break;//設(shè)置分
  130.                                                 case 2: sec+=10;if(sec>=60)sec%=10; break;//設(shè)置秒十位
  131.                                                 case 3: sec++;  if(sec%10==0)sec-=10; break;//設(shè)置秒個(gè)位
  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;//操作設(shè)置狀態(tài)
  141.                                         rst=5000;
  142.                                 }
  143.                         break;
  144.                 }
  145.                 Key_value=0x00;//鍵值清0
  146.         }
  147. }
  148. //復(fù)位/關(guān)機(jī)函數(shù)
  149. void reset()
  150. {
  151.         if(rst>0)
  152.         {
  153.                 rst--;
  154.                 if(rst==0)
  155.                 {
  156.                         if(count==0)//按鍵已松手
  157.                                 set=0;//設(shè)置狀態(tài)復(fù)位
  158.                         else if(!start)//長(zhǎng)按5秒不松手關(guān)機(jī)(倒計(jì)時(shí)運(yùn)行中不可關(guān)機(jī))
  159.                         {
  160.                                 set=0;//設(shè)置狀態(tài)復(fù)位
  161.                                 On_Off=0;//關(guān)機(jī)
  162.                         }
  163.                 }
  164.         }
  165. }
  166. //主函數(shù)
  167. void main()
  168. {
  169.         Timer0Init();
  170.         while(1)
  171.         {
  172.                 if(flag_ms)
  173.                 {
  174.                         flag_ms=0;//1ms標(biāo)志清0
  175.                         display();//數(shù)碼管顯示函數(shù)
  176.                         key_scan();//按鍵掃描函數(shù)
  177.                         key_service();//按鍵服務(wù)函數(shù)
  178.                         reset();//復(fù)位/關(guān)機(jī)函數(shù)
  179.                 }
  180.         }
  181. }

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

使用道具 舉報(bào)

ID:584814 發(fā)表于 2024-2-7 08:13 | 顯示全部樓層
對(duì)用圖片求助表示呵呵,如果程序保密不如找個(gè)算命的可能幫助更大
回復(fù)

使用道具 舉報(bào)

ID:619259 發(fā)表于 2024-4-18 22:12 | 顯示全部樓層
思路:按鍵第一次按下,啟動(dòng)定時(shí)器,TR0 = 1;第二次按下,停止定時(shí)器,TR0 = 0;
按鍵加個(gè)狀態(tài)標(biāo)示。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表