stm32中非阻塞式多按键状态检测函数(1)

       最近做的项目中,关于按键检测调用比较多,因此我也做个适当用法总结。按键状态检测的原理,一般都是通过读相应IO口位是否置位来判断是否按下,并且用延时来消抖以及区分长短按。根据延时的用法,也可以区分为阻塞式和非阻塞式。阻塞式即在延时过程中一直等待到计数值,CPU一直被占用无法去执行别的过程,一般这样是不太合理的设计。所以我们都采用非阻塞式,即用轮询的方式去判断是否延时时间到达,其具体代码如下图:

       

       具体思路就是在第一次检测到按下的情况下,给计时变量赋定时器的计数值,等到大于设定长按时间值后,赋长按状态值给按键状态位。等到松手后,若判断大于消抖时间后赋值短按,然后计时变量初始化,最后返回状态值。

       但是这样的写法始终存在一个BUG,即长按结束后,会返回一个长按状态之后还会有个短按状态。在检测函数上,我暂时还没有想到解决方法,不过可以在按键处理时,加上上个状态位一起判断即可。具体代码如下:

void   key_handle()

{

     static uint32_t key_press_time=0;

      static uint32_t key_laststate ;    

     uint8_t key_nowstate ;

     uint8_t handle_flag=0;

     key_nowstate=Key_state(&key1_press_time,HOME_KEY_PORT, HOME_KEY_PIN);

            if(key_nowstate==KEY_PRESS_SHORT && key_laststate==KEY_PRESS_NULL)
            {
                handle_flag=1;
            }

      key_laststate=key_nowstate;

      return handle_flag;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值