[程序源码] 写了一个非阻塞式的按键驱动分享给大家

[复制链接]
2254|6
 楼主| qinlu123 发表于 2017-5-16 16:00 | 显示全部楼层 |阅读模式
本帖最后由 qinlu123 于 2017-5-16 16:34 编辑

该驱动支持单键短按、长按和组合键。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hgjinwei 发表于 2017-5-16 17:17 | 显示全部楼层
当 “滴答中” 和 “大循环” 神同步时,即 “大循环”运行到 “Key_Scan_GKPN_Run” 时,"滴答" 也恰好发生,
那么,就有可能在 “Key->KCC_EN=0” 后 “Key->KCC_EN=1” 前,“Key->KeyOnCount” 被 “滴答” 清零,
然后,按键就失灵了。

  1. static void Key_Scan(Key_Para* Key,uint8_t KPN,GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  2. {
  3.         if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==0)
  4.         {
  5.                 Key->KCC_EN=0;//按键按下立即清除(松开)计数
  6.                 if(Key->KeyOnCount>KEY_PRESS_TIME)
  7.                 {
  8.                         /*消抖方法为检测到按键被(持续)按下超过20ms*/
  9.                         Key_Phy_Num|=KPN;//消抖完毕后记录被按下的按键的键值
  10.                         if(Key->KeyOnCount>KEY_LONG_PRESS_TIME)
  11.                         {
  12.                                 /*检测到按键被(持续)按下超过3秒*/
  13.                                 Key->KEY_LONG_PRESS=KPL_ENABLE;
  14.                                 Key->KOC_EN=0;
  15.                         }
  16.                 }
  17.                 else
  18.                 {
  19.                         /*时间不够启动计数*/
  20.                         Key->KOC_EN=1;
  21.                 }
  22.         }
  23.         else
  24.         {
  25.                 Key->KOC_EN=0;//按键松开立即清除(按下)计数
  26.                 if(Key->KeyCloseCount>KEY_PRESS_TIME)
  27.                 {
  28.                         /*检测到(持续)松开20ms*/
  29.                         Key->KEY_LONG_PRESS=KPL_DISABLE;//长按松开带消抖,普通单按和组合键松开不需要消抖
  30.                         Key->KCC_EN=0;
  31.                 }
  32.                 else
  33.                 {
  34.                         Key->KCC_EN=1;
  35.                 }
  36.         }
  37. }

 楼主| qinlu123 发表于 2017-5-16 23:21 | 显示全部楼层
hgjinwei 发表于 2017-5-16 17:17
当 “滴答中” 和 “大循环” 神同步时,即 “大循环”运行到 “Key_Scan_GKPN_Run” 时,"滴答" 也恰好发 ...

既然执行了 “Key->KCC_EN=0” 后 了怎么还会执行“Key->KCC_EN=1” 前呢,再说了,“Key->KeyOnCount” 被 “滴答” 清零只有在Key->KOC_EN=0的时候才会执行啊。
yearnext 发表于 2017-5-17 16:32 | 显示全部楼层
楼主是把KeyCount_Run放到中断里去做?
 楼主| qinlu123 发表于 2017-5-17 20:28 | 显示全部楼层
本帖最后由 qinlu123 于 2017-5-17 20:29 编辑
yearnext 发表于 2017-5-17 16:32
楼主是把KeyCount_Run放到中断里去做?

是的,1ms执行一次。消抖计时用的。
lnulibin 发表于 2017-5-19 17:00 | 显示全部楼层
逻辑没错。值得借鉴。
青蓝pisces 发表于 2017-5-19 18:22 | 显示全部楼层
楼主很有想法,希望能做好封装,做成通用的框架,完整的具有良好接口的库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

2223

帖子

14

粉丝
快速回复 在线客服 返回列表 返回顶部