3.4 使用并行接口驱动键盘
键盘是常用的输入设备,通过键盘可以输入各种控制信息。按键时接口电路把表示键位的编码送入计算机,从而实现操作者的命令意图。按获取编码的方式不同,可以将键盘分为编码键盘和非编码键盘两大类。
课件 使用并行口驱动键盘
视频 使用并行口驱动键盘
编码键盘由较多的按键和专用的驱动芯片构成,采用硬件编码电路来实现键盘的编码,每按一个键,就会自动产生与之对应的编码。编码键盘响应速度快,可自动处理按键抖动、连击等问题。当系统功能复杂、按键数量较多时,采用编码键盘可以简化软件的设计工作。非编码键盘利用按键直接与单片机相连,只需要判断按键是否按下,然后由软件来识别进行后续操作。和编码键盘相比,非编码键盘硬件极其简单,每个键位通过软件编程都可以重新定义,具有很大的灵活性,但其响应速度远不如编码键盘。非编码键盘主要有独立式键盘(线性键盘)和矩阵式键盘两种。因为单片机不需要进行复杂的输入,所以通常使用非编码键盘进行信息输入。下面先介绍独立式键盘与按键去抖的内容。
所谓独立式键盘,就是一个按键对应一条口线,有多少个按键,就需要多少条口线,但各个按键之间彼此独立没有相互联系,如图3-14所示。
图3-14 独立式键盘示意图
其工作原理是利用单片机的I/O口既可以作输入也可以作输出的特性来实现的。当检测按键时,使用的是输入功能,按键的连接方法是一端接地,另一端与某个I/O口线相连。开始检测时先给该I/O口赋高电平,然后让单片机不断地检测该I/O口的电平,当按下该键位时,相当于该I/O口接地,此时为低电平。一旦系统检测到这个低电平,即意味着用户按下了该键位,然后就可以去执行相关的后续操作了。
单片机系统中通常使用的按键是弹性按键开关、自锁式按键开关还有贴片式按键开关,如图3-15所示。
图3-15 常用的按键开关
弹性按键开关按下时,开关闭合;松开时,开关断开。自锁式按键开关按下时,开关闭合并能自动锁住状态;当再次按下时,才重新弹起断开。贴片式按键开关与弹性按键开关相同,只是焊接方式不同。
弹性按键开关利用的是机械触点的闭合与断开来实现信号输入的。由于机械触点的弹性作用,在按键闭合与断开的瞬间并不会立即实现闭合或断开,而是有一小段时间的“震颤”,这个现象称为按键的抖动,如图3-16所示。其时间长短与开关的机械特性有关,一般为5~10ms。这个抖动的时间虽然短暂但在CPU看来却是足够长的,因此会对CPU的按键检测产生不小的影响,所以必须“去抖”。常用的去抖方法有两种:一种是使用RS触发器去抖电路的硬件方式;另一种是使用延时函数的软件去抖方式。硬件方式需要增加硬件,增加成本,且设计上也很复杂。其原理如图3-17所示。因此一般采用软件去抖方式。
图3-16 按键的抖动
图3-17 使用触发器去抖
软件去抖的实质是在检测到按键后,先执行一段延时函数,避开抖动的时间,接着再去进行按键检测,以此来达到去除按键抖动的目的。具体的应用延时函数去抖的按键检测程序框架如图3-18所示。
图3-18 应用延时去抖的按键检测程序框架
应用该程序框架只需要将连接按键的引脚位置确定,并将框架中的省略号替换为具体操作命令即可使用。通过这个框架也清晰地看到了使用延时函数实现按键去抖的工作过程。使用这种方法去抖,节省硬件,处理比较灵活。但是也要看到这种方式的不足,就是大量的延时程序会浪费CPU时间,不利于提高CPU的使用效率。
【课堂练习】使用单片机设计一个控制电路,该电路里有8个LED,当按下S1键时,第1、3、5、7号LED点亮,松手时熄灭;当按下S2键时,第2、4、6、8号LED点亮,松手时熄灭;当按下S3时全亮,松手时全灭。其连接电路如图3-19所示。
图3-19 按键控制LED点亮的电路原理图
【分析】LED均接在P1口上,根据LED点亮的原理,要使第1、3、5、7号LED点亮,则P1的值为AAH;使2、4、6、8号LED点亮,则P1的值为55H;要使全部LED点亮,则P1的值为00H;全部熄灭,则P1的值为FFH。
3个按键分别接在P3口的P3.2、P3.3和P3.4上,程序工作时,只需要检测对应的P3.2、P3.3和P3.4引脚的值是否为低电平,就能知道是否按下了该按键。为了保证效果,要在检测到为低电平时,进行“去抖”操作,即检测到低电平后,先延迟10ms,接着再检测该按键是否还是低电平,若还是低电平,则表示确实按下了该按键,然后修改P1口的值,使对应的LED点亮即可。
参考程序如下:
独立式键盘使用起来简单灵活,检测方便,其主要缺点是占用口线太多,不利于多按键键盘扫描。