找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3749|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表