[研电赛技术支持] 使用定时器的长短按键

[复制链接]
 楼主| 两只袜子 发表于 2020-11-12 09:15 | 显示全部楼层 |阅读模式

在我提交的作品当中使用的是在主循环中轮询的方式来获得长短键值,简单实用,已经能够满足项目需要。正如广大坛友指出的那样,轮询方法在读取按键长短时MCU不能做其他事情,效率太低,在一些场合还会对MCU处理其他事务造成影响,不少坛友建议采用定时器的方法,但当时为了不影响项目作品提交进度,就先将就使用轮询法了。这段时间稍得空闲,我对项目代码中的按键获得进行优化,使用了定时器累计键值的方式来识别长短按键,经过测试,完全达到预计目的。

    使用定时器法的基本思路是设置两个全局变量keys和keyf,前者计数,后者作按键结束标志,定时器的定时时间为10毫秒,keys是8位的变量,最大计数为255,可以分辨2.55秒之内的按键时间(大于2.55秒则按2.55秒计算),通过实验,快按快松(点击)按键时返回的键值通常在10左右,按下后再松开(短按)返回的键值约在30~40左右,按下后稍等片刻再松开(中按)返回的键值约在60~90左右,按下后数两下再松开(长按)返回的键值大约在120~180左右,按下后数四下再松开(超长按)返回的键值大约会大于200,在我的项目中,键值与功能的对应关系见下表:


277805fac8c3acb83d.png

下面是定时器2配置的代码:

625955fac8c595c2a6.png


在我的项目中,定时器2除按键计数外还兼作报警声延时作用,详见下面的中断处理代码:

67195fac8c739f645.png


下面是在主循环中检测按键的代码,当检测到有按键事件时除调用按键处理函数外,还要将按键值归零并置按键事件处理完毕标志:

267025fac8c8acab7a.png



晓伍 发表于 2020-12-4 11:40 | 显示全部楼层
软件上做起来就比较麻烦了
八层楼 发表于 2020-12-4 11:42 | 显示全部楼层
这下定时器就比较繁忙了
观海 发表于 2020-12-4 11:44 | 显示全部楼层
调试过程中出现过bug吗
guanjiaer 发表于 2020-12-4 11:45 | 显示全部楼层
这样做可以大大的节省按键
heimaojingzhang 发表于 2020-12-4 11:46 | 显示全部楼层
是的 轮询的效率太低了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8117

帖子

11

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