根据前文描述,可知按键没有按下时,对应的I/O口为高电平;按键被按下时,对应的I/O口为低电平,如图3-2所示。
图3-2 按键理想动作过程
事实上,图3-2所示的按键动作过程是理想化的,真实的机械按键,在按下和松开时,都会存在一定程度上的“抖动”,如图3-3所示。在抖动期间,会出现多个高、低电平变换,这期间的高、低电平不能用于判断按键是否按下或松开。因此,必须在按键稳定状态下进行检测。这好比你去体检,不能一赶到医院就立即去做心电图,而必须稍作休息,等心跳处于平稳状态才进行检测,否则所做的心电图往往是不准确的。
图3-3 真实按键工作过程
因此,当你检测到按键口为高电平,并不一定意味着按键松开;同样,当你检测到按键口为低电平,也并不一定意味着按键按下。按键检测必须避开按键抖动期间,当按键处于稳定状态下,才能依据检测到的按键口状态判断按键是否被按下。
当按键按下或按键松开时,会出现抖动。请读者观察图3-3,这个抖动过程实际上持续时间并不长,它属于过渡过程。一般抖动若干毫秒后,就会进入稳定状态。因此,可以得出图3-4所示按键检测的基本流程。
(www.xing528.com)
图3-4 按键检测流程
说明:
➢“有键按下吗?”——这是一个判断,结果可能为真(Y,按键对应I/O口为低),也可能为假(N,按键对应I/O口为高)。在C语言中,可以使用if语句来实现判断功能。
➢“延时10ms”——这个10ms是一个常用的数值,而非固定值、精确值。用户延时20ms、30ms都可以。延时的目的是避开抖动过程。
➢“再次检测有键按下吗?”——同样是一个判断,经过延时后的按键已处于稳定状态,这时可以“一锤定音”,若还为低电平则表明按键是真的按下了,若恢复为高电平则表明是抖动造成的。同理,仍需使用if语句实现判断功能。
➢“有键释放吗?”——这是等待按键松开,避免一次按下多次响应的情形。这其实是个原地循环,按键若按下,则“原地踏步”,程序不向下执行。我们可以使用while语句实现按键是否释放。
➢“进行按键处理”——这个处理可以放在等待按键松开之前,也可以放在按键松开之后。若是放在按键松开之后,当按键长时间按下时,将会导致按键处理“严重滞后”。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。