软件流程如下:
①定义1个变量,KEY_Counter=按键闭合计数器。
②定义1个常数,c_keyover_time=按键长击时间常数。
③定时检测按键,当按键闭合时,KEY_Counter按一定的频率递增。
④当KEY_Counter≥c_keyover_time时,确认一次有效长击。
⑤当按键释放时,再判断一次KEY_Counter,如果KEY_Counter
◆一般来说,长击一旦被检测到就立即执行;
◆当按键刚被按下时,系统无法预知本次击键的时间长度,所以短击必须在释放后再执行。
⑥当按键释放后,KEY_Counter应当被清零。
2.2单击和连击的软件识别
一般来说,连击和单击是相伴随的。事实上,连击的本质就是多次单击。软件流程如下:
①定义1个变量,KEY_Counter=按键响应延时时间寄存器。
②定义2个常数:
◆c_wobble_time=按键初按(消抖)延时(用来确定消抖时间,一般取4~20 ms);
◆c_keyover_time=按键连按延时(用来确定连击的响应频率。比如,如果要每秒执行10次连击,则这个参数=100 ms)。
③按键未闭合前,先令KEY_Counter=0。
④当按键闭合时,KEY_Counter以一定的频率加1。抖动期间,若检测到按键抬起,令KEY_Counter=0。当KEY_Counter=c_wobble_time时,抖动时间已经过去,即可先执行一次按键功能,此为首次单击。之后,若按键一直处于闭合状态,则进入下一进程。
⑤KEY_Counter超过c_wobble_time,且按键一直闭合时,KEY_Counter仍以一定的频率加1。当KEY_Counter=c_keyover_time时,KEY_Counter=0,形成一次长击。
⑥当再次出现KEY_Counter=c_wobble_time时,即可再执行一次按键功能,此为连击。
⑦如果按键一直闭合,就重复执行⑤~⑦三个步骤,直到按键释放。
单击/连击示意图如图3所示。

本文以AVR单片机为例给出设计软件。例程中4个按键分别连接到PD口的低4位(若按钮更多,甚至是矩阵键盘也很好仿写)。WINAVR20071221例程如下(假定连接按键的I/O口已经成功地初始化):
工程应用中随着主函数死循环中程序量的不同,需要调整3个参数。不过,该程序利用系统的嘀嗒定时中断定时读取,只需调整好一组参数。
上面的例程中要深入理解static的作用,即静态变量会被分配一个内存固定、每次操作的值不会丢失、却又被函数私有处理的类似全局变量的变量。
结语
本文针对实时应用的嵌入式系统中智能键盘软件设计的软件去抖动问题、等待按键抬起问题和连击处理问题,给出基于查询结构的软件解决方案。该方案不但能够满足系统的实时性要求,而且软件直接调用,大大降低了系统开发的难度。