一个4×4的键盘结构如图8-1所示。图中键盘的行线X0~X3通过电阻接+5V。当键盘上没有键闭合时。所有的行线和列线都断开,行线都呈高电平。当键盘上某一个键闭合时,该键所对应的行线和列线被短路。例如6号键被按下闭合时,行线X1和列线Y2被短路,此时X1的电平由Y2的电位决定。如果把行线接到单片机的输入口,列线接到单片机的输出口,则在单片机的控制下,先使列线Y0为低电平“0”,其余三根列线Y1、Y2、Y3都为高电平“1”,读行线状态,如果X0、X1、X2、X3都为高电平,则Y0这一列上没有键闭合。如果读出的行线不全为高电平,则为低电平的行线和Y0相交的键处于闭合状态。如果Y0这一列上没有键闭合,则使列线Y1为低电平,其余列线为高电平,用同样方法检查Y1这一列上是否有键闭合。这种逐行逐列地检查键盘状态的过程称为对键盘的一次扫描。
目前大部分按键都是利用机械触点的合、断原理制作的。由于弹性的影响,机械触点在闭合及断开瞬间均有抖动过程,从而使电压信号波动,如图8-2所示。波动时间长短与开关的机械特性有关,一般为5~10ms,按键的稳定闭合时间,由操作人员的按键动作确定,一般为几百毫秒至几秒。为了保证CPU对键的一次闭合仅作一次键输入处理,必须消除抖动影响。
图8-1 键盘结构
通常消除抖动影响的措施有硬、软件两种。在硬件上采取的措施是:在键输出端加R-S触发器或单稳态电路构成去抖动电路。在软件上采取的措施是:在检测到有键按下时,执行一个10ms左右的延时程序后,再确认该键电平是否保持闭合状态电平。若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除了抖动影响。下面介绍几个消抖电路。
图8-2 键闭合及断开时的电压波动
图8-3 双稳态消抖电路
1.双稳态消抖
双稳态消抖电路如图8-3所示。图中用两个与非门U1、U2构成一个R-S触发器。当按键未按下(a闭合),输出为“1”;当键按下时(b闭合),输出为“0”。此时即使按键因弹性抖动而产生瞬间不闭合(抖动跳开b),只要按键不返回原始状态。双稳态电路的状态就不会改变,输出保持为0,不产生抖动的波形。就是说即使b点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的方波,这一点可通过分析R-S触发器的工作过程得到验证:设开关S首先处于a位置,此时R-S触发器的输出端(U1输出端)OUT1为高电平“1”,与非门U2的输出为“0”,此输出引入到与非门U2的一个输入端,将与非门U2锁住,使其固定输出为“1”。如果这时按动开关S,即使S在a位置因弹性而瞬间抖动,在A处形成一连串抖动的波形,即A输入端出现一连串的“0”和“1”,由于与非门U1另一个输入端B在S未到达位置b以前始终为“0”,所以无论与非门U1与a相连输入端的电平如何变化,OUT1恒为“1”;当S到达位置b时,一旦出现收输入端D=0,R-S触发器将出现状态的翻转。此时OUT2=1,导致OUT1=0,0UTl又引回到门U2的输入端,锁死门U2,让其输出恒为“1”,即使b处的电压波形出现一连串的抖动,即D输入端的电平出现一连串的“0”和“1”,也不会影响OUT2的输出,因此OUT1也将恒为“0”。如果将R-S触发器看作一个“黑盒”,只看输入与输出的波形,将会发现输出是消除了抖动的输入。同样在松开按键的过程中,只要接通,输出为“1”,在接通过程中,即使产生弹性抖动而瞬间离开,只要开关不再与b发生接触,双稳态电路的输出也将不会改变。
2.滤波消抖电路
因为RC积分电路具有吸收干扰脉冲的作用,所以只要选择好适当的时间常数,让按键的抖动通过此滤波电路,便可消除抖动的影响,如图8-4所示。
当S未按下时,电容两端电压为0,与非门输出为1。当S按下时,由于C1两端的电压不能突变,即使在接触过程中出现了抖动,只要C1两端的放电电压波动不超过门的开启电压(TTL为0.8V左右),门的输出将不会改变,这可通过适当选取R1、R2和C1的值来实现。
图8-4 滤波消抖电路(www.daowen.com)
同样S在断开的过程中,即使出现抖动,由于C1两端电压不能突变,它要经过RC放电,只要C1两端的放电电压波动不超过门的关闭电压,门的输出也不会改变。所以,关键在于R1、R2和C1时间常数的选取,必须保证C由稳态电压的充电到开启电压或放电到关闭电压的延迟时间大于或等于10ms。
这既可由计算确定,也可由实验确定,图8-4中的参数仅供参考,需要指出的是对于TTL电路,当输入的等效接地电阻大于1.4kΩ时,通常输入就成为“1”,所以在设计参数值时需要注意,对于CMOS电路通常最好也将此因素考虑在内,不要使输入端悬空。
3.软件消抖
1)如果按键较多,硬件消除抖动将十分复杂。常采用软件的方法进行消抖。在第一次检测到有键按下时,执行一段延时20ms的子程序后,再确认该键电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,从而消除了抖动的影响。
2)对按键进行编码以给定键值或直接给出键号,一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构不同,采用不同的编码方法。
但无论有无编码,或是采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的散转转移。
3)编制键盘程序。一个完善的键盘控制程序应完成下述任务:
①监测有无键按下。
②有键按下后,在无硬件消抖电路的情况下,应用软件延时方法消除抖动影响。
③有可靠的逻辑处理办法,如键锁定,即只处理一个键,其间任何按下又松开的键不产生影响,不管一次按键持续有多长时间,仅执行一次校键功能程序。
④输出确定的键号,以满足散转指令要求。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。