引言
键盘是智能化测控系统主要的信息输入方式,是实现人机对话的重要途径,因此如何有效地控制键盘并为系统服务是每个设计者需要切实考虑的问题。
嵌入式系统键盘软件设计存在3方面问题:软件去抖动、等待按键抬起和连击处理。
1嵌入式系统键盘软件设计的3个问题
1.1软件去抖动问题
一次完整按键过程的时序波形如图1所示。当按键未被按下时,单片机端口输入为通过上拉电阻获得的高电平;按下时,端口接至地,端口输入为低电平。当机械触点断开、闭合时会有抖动,这种抖动对人来说是感觉不到的,但对计算机来说,则是完全可以感应到的。计算机处理的速度是us级,而机械抖动的时间至少是ms级,对计算机而言,这已是漫长的时间了。
为使单片机能正确地读出端口的状态,对每一次按键只作一次响应,这就必须考虑如何去除抖动的问题。嵌入式系统一般采用软件延时去除抖动。软件延时去除抖动其实很简单,就是在单片机获得端口有按键动作时,不是立即认定按键开关已被按下,而是延时10 ms或更长一段时间后再次检测端口,如果仍为动作电平,则说明按键开关的确按下了,这实际上是避开了按键按下时的抖动时间;而在检测到按键释放后(端口为高)再延时5~10 ms,消除后沿的抖动,然后再对键值处理。当然,实际应用中对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是软件延时去除抖动的基本原则。
1.2等待按键抬起问题
单片机在查询读取按键时,不断地扫描键盘,扫描到有键按下后,进行键值处理。它并不等待键盘释放再退出键盘程序,而是直接退出键盘程序,返回主程序继续工作。计算机系统执行速度快,很快又一次执行到键盘程序,并再次检测到键还处于按下的状态,单片机还会去执行键值处理程序。这样周而复始,按一次按键系统会执行相应处理程序很多次。而程序员的意图一般是只执行一次,这就是等待按键抬起问题。通常的解决办法是,当按键抬起后再次按下才再次执行相应的处理程序,等待时间一般在几百ms以上。通常在软件编程中,当执行完相应处理程序后,要加一个非常大的延时函数,再向下执行。
对于软件去抖动问题和等待按键抬起问题,若采用软件延时,会大大削弱系统的实时性;若采用中断方式延时,会占用定时器,耗费了系统资源,且软件的多任务编程会增大软件设计的复杂度。
1.3连击处理问题
工业控制设备中有这样一种键盘方案设计要求:如果长时间按下同一个按键,表征有重复执行该键对应处理程序的需求。比如使用“+”和“-”二键控制显示数值,要求按一次“+”键使显示值加1,要求按一次“-”键使显示值减1。如果按“+”键超过一定时间(如2 s),则显示值将很快地增加,即连击处理,减号键也是如此。这样就可以用很少的键完成多位数的输人工作。
针对这3个问题,本文给出一个解决方案。该软件方案实现计数器自然去抖动和等待按键抬起功能,而非采取延时等待的方法,同时实现了连击处理。
2智能键盘的软件设计
为了解决智能键盘在应用中的一些技术问题,下面分析各种击键类型的软件处理方法。
2.1短击和长击区分的软件设计
图2为短击/长击的示意图。