打印
[程序源码]

写了一个非阻塞式的按键驱动分享给大家

[复制链接]
1909|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qinlu123|  楼主 | 2017-5-16 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qinlu123 于 2017-5-16 16:34 编辑

该驱动支持单键短按、长按和组合键。 Key.rar (20.03 KB)

相关帖子

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

static void Key_Scan(Key_Para* Key,uint8_t KPN,GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
        if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==0)
        {
                Key->KCC_EN=0;//按键按下立即清除(松开)计数
                if(Key->KeyOnCount>KEY_PRESS_TIME)
                {
                        /*消抖方法为检测到按键被(持续)按下超过20ms*/
                        Key_Phy_Num|=KPN;//消抖完毕后记录被按下的按键的键值
                        if(Key->KeyOnCount>KEY_LONG_PRESS_TIME)
                        {
                                /*检测到按键被(持续)按下超过3秒*/
                                Key->KEY_LONG_PRESS=KPL_ENABLE;
                                Key->KOC_EN=0;
                        }
                }
                else
                {
                        /*时间不够启动计数*/
                        Key->KOC_EN=1;
                }
        }
        else
        {
                Key->KOC_EN=0;//按键松开立即清除(按下)计数
                if(Key->KeyCloseCount>KEY_PRESS_TIME)
                {
                        /*检测到(持续)松开20ms*/
                        Key->KEY_LONG_PRESS=KPL_DISABLE;//长按松开带消抖,普通单按和组合键松开不需要消抖
                        Key->KCC_EN=0;
                }
                else
                {
                        Key->KCC_EN=1;
                }
        }
}

使用特权

评论回复
板凳
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放到中断里去做?

使用特权

评论回复
5
qinlu123|  楼主 | 2017-5-17 20:28 | 只看该作者
本帖最后由 qinlu123 于 2017-5-17 20:29 编辑
yearnext 发表于 2017-5-17 16:32
楼主是把KeyCount_Run放到中断里去做?

是的,1ms执行一次。消抖计时用的。

使用特权

评论回复
6
lnulibin| | 2017-5-19 17:00 | 只看该作者
逻辑没错。值得借鉴。

使用特权

评论回复
7
青蓝pisces| | 2017-5-19 18:22 | 只看该作者
楼主很有想法,希望能做好封装,做成通用的框架,完整的具有良好接口的库

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

1355

帖子

12

粉丝