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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:327265 發表于 2021-1-8 18:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己做項目總結出來覺得比較好用,拿出來分享一下

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

  10. void Key_control(void)
  11. {
  12.         //每10ms論巡一次
  13.         //KEY_DATA:按鍵數據--并先清一次零
  14.         //按鍵數據的獲取---這里是通過觸摸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++; //累加計時
  22.                         if(uiKeyTimeCnt1>2)    //這里是消抖,20ms足矣
  23.                                 ucShortTouchFlag1|=0x01;   //激活按鍵1短按的有效標志
  24.                        
  25.                         if(uiKeyTimeCnt1>999)
  26.                         {
  27.                                 ucShortTouchFlag1&=~0x01;   //清除按鍵1短按有效標志
  28.                                 ucLongTouchFlag1=1;        //按鍵1長按10s有效標志
  29.                         }
  30.                         break;
  31.                 case(0x0800):
  32.                         uiKeyTimeCnt2++; //累加計時
  33.                         if(uiKeyTimeCnt2>2)
  34.                                 ucShortTouchFlag1|=0x02;   //激活按鍵2短按的有效標志
  35.                        
  36.                         if(uiKeyTimeCnt2>999)
  37.                         {
  38.                                 ucShortTouchFlag1&=~0x02;   //清除按鍵2短按有效標志
  39.                                 ucLongTouchFlag1=2;        //按鍵2長按10s有效標志
  40.                         }
  41.                         break;
  42.                 case(0x0400):
  43.                         uiKeyTimeCnt3++; //累加計時
  44.                         if(uiKeyTimeCnt3>2)
  45.                                 ucShortTouchFlag1|=0x03;  //激活按鍵3短按的有效標志
  46.                                
  47.                         if(uiKeyTimeCnt3>999)
  48.                         {
  49.                                 ucShortTouchFlag1&=~0x03;  //清除按鍵3短按有效標志
  50.                                 ucLongTouchFlag1=3;        //按鍵3長按10s有效標志
  51.                         }
  52.                         break;
  53.                 case(0x0200):
  54.                         uiKeyTimeCnt4++;  //累加計時
  55.                         if(uiKeyTimeCnt4>2)
  56.                                 ucShortTouchFlag1|=0x04;  //激活按鍵4短按的有效標志
  57.                                
  58.                         if(uiKeyTimeCnt4>999)
  59.                         {
  60.                                 ucShortTouchFlag1&=~0x04;   //清除按鍵4短按有效標志
  61.                                 ucLongTouchFlag1=4;       //按鍵4長按10s有效標志
  62.                         }
  63.                         break;
  64.                 case(0x0100):
  65.                         uiKeyTimeCnt5++;  //累加計時
  66.                         if(uiKeyTimeCnt5>2)
  67.                                 ucShortTouchFlag1|=0x05;  //激活按鍵5短按的有效標志
  68.                                
  69.                         if(uiKeyTimeCnt5>999)
  70.                         {
  71.                                 ucShortTouchFlag1&=~0x05;  //清除按鍵5短按有效標志
  72.                                 ucLongTouchFlag1=5;       //按鍵5長按10s有效標志
  73.                         }
  74.                         break;
  75.                 case(0x0080):
  76.                         uiKeyTimeCnt6++;  //累加計時
  77.                         if(uiKeyTimeCnt6>2)
  78.                                 ucShortTouchFlag1|=0x06;  //激活按鍵6短按的有效標志
  79.                                
  80.                         if(uiKeyTimeCnt6>999)
  81.                         {
  82.                                 ucShortTouchFlag1&=~0x06;  //清除按鍵6短按有效標志
  83.                                 ucLongTouchFlag1=6;       //按鍵6長按10s有效標志
  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;           //這里處理完短按之后清零按鍵標志
  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;    //這里處理完長按之后清零按鍵標志
  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. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:702127 發表于 2021-1-11 10:24 | 只看該作者
慢慢學習了,狀態機方法確實值得使用,可以解放CPU。
回復

使用道具 舉報

板凳
ID:754694 發表于 2021-1-14 12:48 來自手機 | 只看該作者
很好,簡潔明了!
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费看91 | 国产a视频 | 中文字幕一区在线观看视频 | 亚洲婷婷六月天 | 看片国产 | 午夜免费福利电影 | 国产精品久久国产精品 | 91免费入口 | 亚洲精选久久 | 精品日韩一区二区三区av动图 | 精品在线播放 | 欧美成人精品激情在线观看 | 精品二区视频 | 六月成人网 | 成人精品在线视频 | 日韩在线免费观看视频 | 伊人久久综合 | 国产视频久 | 黄色毛片在线播放 | 欧美日韩成人影院 | 日韩欧美亚洲一区 | 人人玩人人添人人澡欧美 | 精品国产乱码久久久 | 蜜桃毛片 | 狠狠草视频 | 狠狠的操| 99精品免费视频 | 在线不卡视频 | 91爱啪啪 | 黄色网址在线播放 | 狠狠艹 | 亚洲精品视频三区 | 日日操夜夜操视频 | 亚洲国产精久久久久久久 | 欧美日韩在线成人 | 欧美精品在线播放 | 中文字幕视频在线观看 | 91麻豆精品国产91久久久久久 | www.99热| 热99精品视频 | 欧产日产国产精品v |