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

QQ登錄

只需一步,快速開始

搜索
查看: 4494|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

好用實(shí)在的MCU按鍵掃描處理短按長按方法,程序拿走不謝

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:327265 發(fā)表于 2021-1-8 18:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
自己做項(xiàng)目總結(jié)出來覺得比較好用,拿出來分享一下

單片機(jī)源程序如下:
  1. //------------------------自己的按鍵掃描-短按-長按處理--------------------------------
  2. u8   uiKeyTimeCnt1;      //按鍵1計(jì)數(shù)
  3. u8   uiKeyTimeCnt2;   //按鍵2計(jì)數(shù)
  4. u8   uiKeyTimeCnt3;     //按鍵3計(jì)數(shù)
  5. u8   uiKeyTimeCnt4;     //按鍵4計(jì)數(shù)
  6. u8   uiKeyTimeCnt5;     //按鍵5計(jì)數(shù)
  7. u8   uiKeyTimeCnt6;     //按鍵6計(jì)數(shù)
  8. u8   ucShortTouchFlag1;     //短按按鍵有效標(biāo)志
  9. u8   ucLongTouchFlag1;      //長按按鍵有效標(biāo)志

  10. void Key_control(void)
  11. {
  12.         //每10ms論巡一次
  13.         //KEY_DATA:按鍵數(shù)據(jù)--并先清一次零
  14.         //按鍵數(shù)據(jù)的獲取---這里是通過觸摸IC的IIC通信
  15.         KEY_DATA=0X0000;
  16.         I2C_ReadDeviceDataTo(0x80,&KEY_DATA,1);
  17.         KEY_DATA=KEY_DATA^0xffff;
  18.         switch(KEY_DATA)
  19.         {
  20.                 case(0x1000):
  21.                         uiKeyTimeCnt1++; //累加計(jì)時(shí)
  22.                         if(uiKeyTimeCnt1>2)    //這里是消抖,20ms足矣
  23.                                 ucShortTouchFlag1|=0x01;   //激活按鍵1短按的有效標(biāo)志
  24.                        
  25.                         if(uiKeyTimeCnt1>999)
  26.                         {
  27.                                 ucShortTouchFlag1&=~0x01;   //清除按鍵1短按有效標(biāo)志
  28.                                 ucLongTouchFlag1=1;        //按鍵1長按10s有效標(biāo)志
  29.                         }
  30.                         break;
  31.                 case(0x0800):
  32.                         uiKeyTimeCnt2++; //累加計(jì)時(shí)
  33.                         if(uiKeyTimeCnt2>2)
  34.                                 ucShortTouchFlag1|=0x02;   //激活按鍵2短按的有效標(biāo)志
  35.                        
  36.                         if(uiKeyTimeCnt2>999)
  37.                         {
  38.                                 ucShortTouchFlag1&=~0x02;   //清除按鍵2短按有效標(biāo)志
  39.                                 ucLongTouchFlag1=2;        //按鍵2長按10s有效標(biāo)志
  40.                         }
  41.                         break;
  42.                 case(0x0400):
  43.                         uiKeyTimeCnt3++; //累加計(jì)時(shí)
  44.                         if(uiKeyTimeCnt3>2)
  45.                                 ucShortTouchFlag1|=0x03;  //激活按鍵3短按的有效標(biāo)志
  46.                                
  47.                         if(uiKeyTimeCnt3>999)
  48.                         {
  49.                                 ucShortTouchFlag1&=~0x03;  //清除按鍵3短按有效標(biāo)志
  50.                                 ucLongTouchFlag1=3;        //按鍵3長按10s有效標(biāo)志
  51.                         }
  52.                         break;
  53.                 case(0x0200):
  54.                         uiKeyTimeCnt4++;  //累加計(jì)時(shí)
  55.                         if(uiKeyTimeCnt4>2)
  56.                                 ucShortTouchFlag1|=0x04;  //激活按鍵4短按的有效標(biāo)志
  57.                                
  58.                         if(uiKeyTimeCnt4>999)
  59.                         {
  60.                                 ucShortTouchFlag1&=~0x04;   //清除按鍵4短按有效標(biāo)志
  61.                                 ucLongTouchFlag1=4;       //按鍵4長按10s有效標(biāo)志
  62.                         }
  63.                         break;
  64.                 case(0x0100):
  65.                         uiKeyTimeCnt5++;  //累加計(jì)時(shí)
  66.                         if(uiKeyTimeCnt5>2)
  67.                                 ucShortTouchFlag1|=0x05;  //激活按鍵5短按的有效標(biāo)志
  68.                                
  69.                         if(uiKeyTimeCnt5>999)
  70.                         {
  71.                                 ucShortTouchFlag1&=~0x05;  //清除按鍵5短按有效標(biāo)志
  72.                                 ucLongTouchFlag1=5;       //按鍵5長按10s有效標(biāo)志
  73.                         }
  74.                         break;
  75.                 case(0x0080):
  76.                         uiKeyTimeCnt6++;  //累加計(jì)時(shí)
  77.                         if(uiKeyTimeCnt6>2)
  78.                                 ucShortTouchFlag1|=0x06;  //激活按鍵6短按的有效標(biāo)志
  79.                                
  80.                         if(uiKeyTimeCnt6>999)
  81.                         {
  82.                                 ucShortTouchFlag1&=~0x06;  //清除按鍵6短按有效標(biāo)志
  83.                                 ucLongTouchFlag1=6;       //按鍵6長按10s有效標(biāo)志
  84.                         }
  85.                         break;
  86.                 default:
  87.                         uiKeyTimeCnt1=uiKeyTimeCnt2=uiKeyTimeCnt3=uiKeyTimeCnt4=uiKeyTimeCnt5=uiKeyTimeCnt6=0;
  88.                        
  89.                         //短按處理
  90.                         switch(ucShortTouchFlag1)
  91.                         {
  92.                                 case(0x01):
  93.                                         ucShortTouchFlag1=0x00;           //這里處理完短按之后清零按鍵標(biāo)志
  94.                                         break;
  95.                                 case(0x02):
  96.                                         ucShortTouchFlag1=0x00;
  97.                                         break;
  98.                                 case(0x03):
  99.                                         ucShortTouchFlag1=0x00;
  100.                                         break;
  101.                                 case(0x04):
  102.                                         ucShortTouchFlag1=0x00;
  103.                                         break;
  104.                                 case(0x05):
  105.                                         ucShortTouchFlag1=0x00;
  106.                                         break;
  107.                                 case(0x06):
  108.                                         ucShortTouchFlag1=0x00;
  109.                                         break;
  110.                         }
  111.                        
  112.                         //處理長按
  113.                         switch(ucLongTouchFlag1)
  114.                         {
  115.                                 case 1:
  116.                                            ucLongTouchFlag1=0;    //這里處理完長按之后清零按鍵標(biāo)志
  117.                                            break;
  118.                                 case 2:
  119.                                           ucLongTouchFlag1=0;   
  120.                                           break;
  121.                                 case 3:
  122.                                           ucLongTouchFlag1=0;   
  123.                                           break;
  124.                                 case 4:
  125.                                          ucLongTouchFlag1=0;   
  126.                                          break;
  127.                                 case 5:
  128.                                          ucLongTouchFlag1=0;   
  129.                                          break;
  130.                                 case 6:
  131.                                         ucLongTouchFlag1=0;   
  132.                                         break;
  133.                         }break;
  134.         }
  135. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:702127 發(fā)表于 2021-1-11 10:24 | 只看該作者
慢慢學(xué)習(xí)了,狀態(tài)機(jī)方法確實(shí)值得使用,可以解放CPU。
回復(fù)

使用道具 舉報(bào)

板凳
ID:754694 發(fā)表于 2021-1-14 12:48 來自手機(jī) | 只看該作者
很好,簡(jiǎn)潔明了!
回復(fù)

使用道具 舉報(bào)

地板
ID:886945 發(fā)表于 2021-3-1 23:58 | 只看該作者
將長按處理的函數(shù)放在外邊,應(yīng)該就可以處理到長按時(shí)間直接處理的功能,不需要等按鍵松開再執(zhí)行了吧,就是還要多一個(gè)標(biāo)志位,防止一直長按一直多次執(zhí)行
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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