键盘电路
在单片机应用系统中,除了复位按键外,可能还需要其他按键,如键盘按键,以便控制系统的运行状态或向系统输入运行参数。
键盘电路一般由键盘接口电路、按键(由控制系统运行状态的功能键和向系统输入数据的数字键组合)以及键盘扫描程序等部分组成。
1、按键结构及其电压波形
在单片机控制系统中广泛使用的机械键盘的工作原理是:按下键帽时,按键内的复位弹簧被压缩,动片触点与静片触点相连,按键两个引脚连通,接触电阻大小与按键触点面积及材料有关,一般在数十欧姆以下;松手后,复位弹簧将动片弹开,使动片触点与静片触点脱离接触,两引脚返回断开状态。
可见,机械键盘或按扭的基本工作原理就是利用动片触点和静片触点的接触和断开来实现键盘或按钮两引脚的通、断。
在如图所示的键盘电路中,按键没有被按下时,P1口内部上拉电阻将P1.3-P1.0引脚置为高电平,而当S3-S0之一被按下时,相应按键两引脚连通,P1口对应引脚接地。
在理想状态下,按键引脚电压变化如图6-29(a)所示。
但实际上,在按键被按下或释放的瞬间,由于机械触点弹跳现象,实际按键电压波形如图6-29(b)所示,即机械按键在按下和释放瞬间存在抖动现象。
抖动时间的长短与按键的机械特性有关,一般在5~10ms之间,而按键稳定闭合期的长短与按键时间有关,
从数百毫秒到数秒不等。
为了保证按键由按下到松开之间仅视为一次或数次输入(对于具有重复输入功能的按键),必须在按键或软件上采取去抖动措施,避免一次按键输入一串数码。
硬件上,可利用单稳态电路或RS触发器消除按键抖动现象,但在单片机应用系统中最常采用的方法是利用软件延迟方式消除按键抖动问题,这样可以不增加硬件成本。
因此,在单片机系统中按键识别过程是:通过随机扫描、定时中断扫描或中断监控方式发现按键被按下后,延时10~20ms(因为机械按键由按下到稳定闭合的时间为5~10ms)再去判断按键是否处于按下状态,并确定是哪个按键被按下。
对于每按一次仅视为一次输入的按键设定来说,在按键稳定闭合后对按键进行扫描,读出按键的编码(或称为键号),执行相应操作;对于具有重复输入功能的按键设定来说,在按键稳定闭合期内,每个特定时间,如250ms或500ms 对按键进行检测,当发现按键仍处于按下状态时,就输入该键,直到按键被释放。
2.键盘电路形式
根据所需按键个数、I/O引脚输出级电路结构以及可利用的I/O引脚数目,确定键盘电路形式。
对于仅需要少量按键的控制系统,可采用直接编码输入方式,其特点是键盘接口电路简单。
例如,在空调控制系统中,往往仅需要“开/关”、“工作模式转换”等按键。
(1)直接编码输入键盘
通过检测单片机I/O引脚电平状态来判别有无按键输入就构成了直接编码
输入键盘。
直接编码输入键盘的优点是键盘接口电路简单,但占用I/O引脚多,仅适用于需少量按键的场合。
(2)矩阵键盘
当系统所需按键个数较多时,为减少键盘电路占用的I/O 引脚数目,一般采用矩阵键盘形式,如图6-30所示,在矩阵键盘电路中,行线是输入引脚,列线是输出引脚。
图6-30使用了MCS-51 CPU的P1口作矩阵键盘的行、列线,其中P1、3~P1、0作为行线,输入;P1、7~P1、4作为列线,输出。
由于P1、3~P1、0引脚内置了上拉电阻,因此无需外接上拉电阻。
在图6-30中,P1、7~P1、4四条列扫描线轮流输出低电平,然后读P1、3~P1、0,如果没有按键被按下,则P1、3~P1、0引脚均为高电平;如果其中某一按键被按下,P1、3~P1、0就有一引脚为低电平。
图6-30
3、按键编码
在键盘电路中,按键的个数不止一个,即存在键盘按键编码问题。
按键编码与按键功能有关联。
键盘电路结构不同,确定键值的方式也不同,例如对于图6-28这样简单键盘接口电路,可将S0对应的键值定义为“0”;S1对应的键值为“1”;以此类推。
对于图6-30所示的矩阵键盘接口电路,确定键值的方法很多,如可用行、列对应的二进制值作为键值。
4.键盘监控方式
在单片机应用系统中,可采用查询方式(包括随机扫描方式和定时中断扫描方式)或硬件中断方式监控键盘有无按键输入。
(1)随机扫描方式
在随机扫描方式中,CPU完成某一特定任务后,执行键盘扫描程序,以确定键盘有无按键被按下,然后根据按键功能执行相应的操作。
但这种方式不能再执行按键规定操作中检测键盘有无输入,失去了对系统的控制;此外该方式只能通过调用延迟程序去除抖动现象,降低了系统的实用性,因此很少采用。
(2)定时扫描方式
定时扫描方式与随机扫描方式基本相同,通过定时中断方式,每隔一定时间扫描键盘有无按键按下,键盘反应速度快,在执行按键功能规定操作过程中,可通过键盘命令进行干预,如取消或暂停等。
在定时扫描方式中,为提高CPU利用率,应避免通过被动延迟10~20ms方式等待按键稳定闭合,可在定时中断服务程序中,用3个位存储单元记录最近三次中断检测到的按键状态(可初始化为111态)。
如果规定没有按键被按下时为“1”,有按键被按下时为“0”,则按键状态含义如下:
111---表示最近三次定时中断均未发现按键被按下;
110---表示前两次定时中断未检测到按键被按下,只在本次定时检测到按键被按下,未延迟,不对按键进行扫描。
100---表示最近两次定时中断检测到按键被按下,且已延迟了一次定时中断时间。
可对按键进行扫描,确定哪一个按键被按下,并执行按键规定的动作。
000---表示按键处于稳定闭合期。
001---表示按键可能处于释放阶段。
011---表示按键已经释放。
010---在很短的时间内(小于两次中断时间间隔)检测到按键处于释放状态,视为干扰,作000态处理。
101---在很短的时间内(小于两次中断时间间隔)检测到按键处于按下状态,实际上是按键过程中的无意松动,作111态处理。
在以上按键状态中,对于没有重复输入功能的按键设定来说,只需要检查100、010、101态;面对于具有重复输入功能的按键来说,只需要检查并处理100、010、101、000四个状态,
再利用一字节内部RAM单元保存按键值和按键有效标志。
这样不仅能记录最近按了哪一个按键,也能记录是否已执行了按键规定的动作。
对于只有16个的小键盘,可使用一个字节记录键盘的状态和按键值,其中b7为记录按键有效标志,b6~b4记录按键的状态;b3~b0记录按键值。
对图6-31所示矩阵键盘按键进行编码;将PC0引脚对应行线的行号定义为0,PC1引脚对应行线的行号定义为1, PC2 引脚对应的行线的行号定义为2,PC3引脚对应的行线的行号定义为3;PB0引脚对应的列线的列号定义为0,PB,1
引脚对应的列线的列号定义为1,PB2引脚对应的列线的列号定义为2,PB3引脚对应的列线的列号定义为3,则键盘任意按键的扫描码为4*列号+行号。
定时中断键盘按键扫描流程如图6-32所示
(a)按键状态流程(b)按键扫描流程
3.中断检测方式
在控制系统中,并不需要经常监控键盘有无按键输入。
因此,在查询扫描方式和定时中断扫描方式中,CPU常处于空扫描方式,这在一定程度上降低了CPU 的利用率,为此,也可采用中断检测方式来监控键盘有无按键按下。