« 上一篇下一篇 »

按键之单击、双击、短按、长按

最近在写按键单击双击检测的代码,折腾了大半天,搞得很恼火,好不容易才把逻辑拎清,故而撰文以记。

本文所用的按键是一个非常简单的独立按键,以往在学校用的从来都是一排按键,或者是矩阵键盘,按键个数很多,从来不担心够不够用,往往一个按键就只有一种操作,所以从来都没有去考虑、也没有写过检测双击、长按、超长按的代码,而现在到了企业,节约成本就是创造利润,一台售价几千上万的仪器,却非常吝啬的只给出一个按键,而要求实现的功能并不见得少,于是乎,就只能靠软件来补硬件的缺失。从这里也可以看出来,学校里面所教的东西和实际生产所用不同,或者叫脱节,就是学校从来不告诉你企业里面需要什么,更别说教你怎么做了。这就是教育的不足。

一般单击检测的流程就是判断按键有没有按下,如果有,做一段时间延时,再判断是否按下,如果是,则确认有键按下,之后就是判断按键是否松开,如果松开则执行相应的处理。而在有双击操作存在的情况下,单击与双击操作判别的主要思想是:把一个短暂时间段内的按键操作看成是一次事件,这次事件里面可能只包含一次按键,也可能包含两次按键,因此在此事件内,要对按键次数进行记录,如果这个时间段内只发生了一次按键,那么时间段之后就执行单击任务,并清除按键计数;如果这个时间段内发生了两次按键,那么就执行双击任务,并清除按键计数。

我的按键任务是在uC/OS-II操作系统上面跑的,所以可能会和裸机(前后台系统)编程会有点不同,不过和用定时器处理基本是一样的,反正就是周期性的触发。