在我提交的作品当中使用的是在主循环中轮询的方式来获得长短键值,简单实用,已经能够满足项目需要。正如广大坛友指出的那样,轮询方法在读取按键长短时MCU不能做其他事情,效率太低,在一些场合还会对MCU处理其他事务造成影响,不少坛友建议采用定时器的方法,但当时为了不影响项目作品提交进度,就先将就使用轮询法了。这段时间稍得空闲,我对项目代码中的按键获得进行优化,使用了定时器累计键值的方式来识别长短按键,经过测试,完全达到预计目的。 使用定时器法的基本思路是设置两个全局变量keys和keyf,前者计数,后者作按键结束标志,定时器的定时时间为10毫秒,keys是8位的变量,最大计数为255,可以分辨2.55秒之内的按键时间(大于2.55秒则按2.55秒计算),通过实验,快按快松(点击)按键时返回的键值通常在10左右,按下后再松开(短按)返回的键值约在30~40左右,按下后稍等片刻再松开(中按)返回的键值约在60~90左右,按下后数两下再松开(长按)返回的键值大约在120~180左右,按下后数四下再松开(超长按)返回的键值大约会大于200,在我的项目中,键值与功能的对应关系见下表:
下面是定时器2配置的代码:
在我的项目中,定时器2除按键计数外还兼作报警声延时作用,详见下面的中断处理代码:
下面是在主循环中检测按键的代码,当检测到有按键事件时除调用按键处理函数外,还要将按键值归零并置按键事件处理完毕标志:
|