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

標題: 好用實在的MCU按鍵掃描處理短按長按方法,程序拿走不謝 [打印本頁]

作者: whwteng    時間: 2021-1-8 18:16
標題: 好用實在的MCU按鍵掃描處理短按長按方法,程序拿走不謝
自己做項目總結出來覺得比較好用,拿出來分享一下

單片機源程序如下:
  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. }
復制代碼


作者: ii11nnocent    時間: 2021-1-11 10:24
慢慢學習了,狀態機方法確實值得使用,可以解放CPU。
作者: xyllovezuu    時間: 2021-1-14 12:48
很好,簡潔明了!
作者: sdarling    時間: 2021-3-1 23:58
將長按處理的函數放在外邊,應該就可以處理到長按時間直接處理的功能,不需要等按鍵松開再執行了吧,就是還要多一個標志位,防止一直長按一直多次執行




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91亚洲精品国偷拍自产在线观看 | 色婷婷久久久久swag精品 | 国产精品久久久久久久久久久久久 | 久久伊人精品 | 国产日韩欧美电影 | 久久精品在线播放 | 毛片久久久 | 亚洲一区二区精品视频 | 狠狠色狠狠色综合系列 | 婷婷99 | 亚洲成人一区二区 | 天天躁日日躁狠狠躁白人 | 中文字字幕在线中文乱码范文 | 狠狠色狠狠色综合系列 | 看片一区 | 亚洲激情综合 | 午夜黄色 | 国产精品国产精品国产专区不卡 | 天天操网 | 一区二区日韩 | 亚洲激情第一页 | 欧美在线天堂 | 成人精品一区 | 不卡视频一区二区三区 | 欧美另类视频在线 | 三级在线免费 | 在线观看亚洲专区 | 午夜视频一区 | 久热9| 亚洲欧美一区二区三区在线 | 久久久久久久亚洲精品 | 免费国产一区二区 | 日本成人在线观看网站 | 久久天堂 | 国产精品久久久久久久久久尿 | 欧美激情免费在线 | 国产日韩欧美电影 | 国产精品自产拍在线观看蜜 | 亚洲精品免费视频 | xxxcom在线观看 | 国产色网站 |