按键检测 - 各类方法比较

一、写在前面:

        按键是最常见的一种外设,按键检测的方式有多种,现在来分析各种方式的优缺点,哪种是最合理的、效率最高的。

二、裸机+延时方式:最差

        此方式为死等,耗费CPU资源,影响到其他功能的运行,是不可取的方式。

        此方式加上RTOS,开一个任务,还是使用延时,但延时非裸机的死等而是任务切换了,即可做到不影响其他功能的运行。

三、裸机+轮询检测方式:较优

        轮询方式,加上RTOS可保证及时性。实际上如果对于实时性并非要求很高的话,此方式也可行,胜在实现很简单(系统开机时间,每隔xms判断一次即可大概做到跟定时器扫描一样的效果,虽很可能受到影响,时间不够准确)。

四、外部中断方式:优,但需注意干扰的处理(对硬件设计有更高的要求)

        如果是玩游戏等,那种响应要非常快的,就非此方式莫属了。此方式最快,但是因为要进中断所以占用了CPU资源,有利也有弊。因为要消抖,所以也要加上定时器中断,所以占用的资源更多,如:

        以上方法也可以不开启定时器中断,而使用轮询的方法,在外部中断里将按键按下的标志位置为true,到轮询中进行”消抖“检测,例如过10ms后是否还是按下,如是则认为按下了。

        因为是外部中断,所以要注意引脚的选择,不能随意选择,比如PA0和PB0引脚就不能同时作为按键了,选择上会受限。

缺点:对硬件设计有更高的要求

        外部中断是边缘触发(按下和松开都可以被检测到),按键按下或松开的时候是极有可能会有多次抖动的。那么也就是会触发中断,外部受到干扰的时候也会触发中断,所以对于硬件设计而言,就有一定的要求了。

五、定时器扫描:优

        此方式占用资源少,就一个定时器中断即可。适用性也很强,所有的GPIO口都适合。

六、关于状态机实现按键检测:是一种思想,而不是方式

        状态机是一种实现按键检测的思想,可以基于延时、轮询、定时器、中断等方式实现。所有的实现方式都可与状态机思想结合,状态机有很多优点:

        状态机思想应用非常广泛,按键可以说是一个很简单的应用场景(只分了“按下”和“松开”)。例如机器人的移动、抓取、放置、返回等,机器人的动作可以分类成很多情况,所以对应的状态机构成会比较庞大。

        常见的状态机还有:

协议解析:等待起始位、接收数据位、接收校验位、接收停止位。==>也就是帧头解析正确的情况下,跳转到下一状态:数据长度、数据、校验位做校验等。

交通信号灯(状态:红黄蓝灯交替;转换条件:时间计时)、电机控制(状态:停止、加速、运行、减速;转换条件:用户输入(如按钮按下)、速度传感器信号)、用户界面交互(状态:待机、选择商品、支付、出货、找零;转换条件:用户输入(如按键、投币)、商品库存),等等。

七、总结:

        综上所述,一般而言,选择定时器或RTOS来扫描按键状态,同时使用状态机的思想,是最优的方式。如果是游戏的话,那么响应就必须要够快,那么可能中断是最为合适的。但一般而言,扫描的方式,适用性更高、更广泛。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值