首页 理论教育单片机基础及应用:键盘接口解析

单片机基础及应用:键盘接口解析

【摘要】:图8-23电压抖动图图8-24独立式未编码键盘图1.独立式键盘接口及处理程序独立式键盘是各按键相互独立地接通一条输入数据线,如图8-24所示。图8-25行列式键盘的结构及键盘扫描示意图如果把列线接到单片机的输入口,行线接到单片机的输出口,则在单片机的控制下,先使行线D0为低电平,其余7根行线都为高电平,读列线的状态,如果D0、D1、D2、D3都为高电平,则D0这一行没有键闭合。

单片机应用系统中为了控制系统的工作状态以及向系统输入数据,应用系统应设有按键或键盘,实现简单的人机会话。键盘是一组按键的集合,键通常是一种常开型按钮开关。平时键的两个触点处于断开状态,按下键时它们才闭合、松开后断开。从键盘的结构来分,键盘可以分为独立式和矩阵式两类,每类按其识别方法又分为编码和未编码键盘两种。键盘上闭合键的识别由专门的硬件译码器实现并产生编号或键值的称为编码键盘,由软件识别的称为未编码键盘。

在由单片机组成的测控系统及智能化仪表中,用得较多的是未编码键盘。本节主要介绍未编码键盘的原理、接口技术和程序设计。通常的按键开关为机械弹性开关,由于机械点的弹性作用,一个按键开关在闭合时并不会马上稳定地闭合,断开时也不会马上断开,因而机械开关在闭合及断开瞬间均伴随有一连串的抖动,如图8-23所示。抖动时间的长短由按键开关的机械特性及按键的人为因素决定,一般为5~20ms。

按键处理不当会引起一次按键被误处理多次。为了确保CPU对键的一次闭合仅作一次处理,则必须消除键的抖动。消除键抖动可用硬件和软件两种方法。消除键抖动,若键数较少通常用硬件的方法,键数较多时用软件的方法。

消除键抖动的硬件方法常用RS触发器、施密特门电路等。消除键抖动的软件方法是当检测出键闭合后执行一个延时程序(产生5~20ms的延时),待前沿抖动消失后再次检测键状态,如果键仍保持闭合状态则可确认有键按下。当检测到按键释放并执行延时程序,待后沿抖动消失后才转入该键的处理程序。

图8-23 电压抖动图

图8-24 独立式未编码键盘图

1.独立式键盘接口及处理程序

独立式键盘是各按键相互独立地接通一条输入数据线,如图8-24所示。这是一种简单的键盘结构,图中的电路为查询方式电路。若有任何一个键按下,则与之相连的输入数据线即被置为低电平,而平时该输入线的状态为高电平。这种键盘结构的优点是电路简单,编程简单明了;缺点是键数较多时,要占用较多的I/O线。图中按键的判别程序如下(这里没有考虑延时去抖的问题):

START:MOV P1,#0FFH ;P1口作为输入时,口锁存器保持高

独立式键盘应 用例程说明

因为以上按键判别程序是采用查询判别键是否按下,各按键会存在优先顺序,优先顺序由程序的查询顺序决定,本例依次为键号0至键号7。

2.行列式键盘原理及键盘扫描流程

为了减少键盘与单片机接口时所占用的I/O口线的数目,通常都将键盘排列成行列矩阵式,如图8-25所示。键盘的行线与列线的交叉处通过一个按键来联通,列线通过电阻接+5V,当键盘上没有键闭合时所有的行线和列线都断开,则列线都呈高电平。若键盘上某一个键闭合,则该键所对应的行线和列线被短路。例如,A交叉点的键被按下闭合时,行线D2和列线D1被短路,此时D1的电平由D2的电位所决定。

图8-25 行列式键盘的结构及键盘扫描示意图(www.chuimin.cn)

如果把列线接到单片机的输入口,行线接到单片机的输出口,则在单片机的控制下,先使行线D0为低电平,其余7根行线都为高电平,读列线的状态,如果D0、D1、D2、D3都为高电平,则D0这一行没有键闭合。如果读出的列线状态不全为高电平,则为低电平的列线和D0行线相交的键处于闭合状态。如果D0这一行上没有键闭合,接着使行线D1为低电平,其余行线为高电平,用同样的方法检查D1这一行上有没有键闭合。依此类推,最后使行线D7为低电平,其余的行线为高电平,检查D7这一行上是否有键闭合。这种逐行逐列地检查键盘状态的过程完成对键盘一次扫描方法又称为逐行扫描法。CPU对键盘扫描可以采取程序控制的随机方式,CPU空闲时扫描键盘;也可以采取定时控制方式,每隔一定时间CPU对键盘扫描一次,CPU可以随时响应键盘的输入请求;还可以采用中断的方式,当键盘上有键闭合时,向CPU请求中断,CPU响应键盘中断,对键盘扫描,以识别哪一个键处于闭合状态,并对键输入信息作出相应处理。CPU对键盘上闭合键的键号确定,可以根据行线和列线的状态计算求得,也可以根据行线和列线的状态查表求得,若以键在键盘中的位置进行编码,从0开始按自然数顺序进行编码,编码以十六进制数表示,则图8-25键盘上各键的键码如表8-5所示。

表8-5 键码表

从行扫描到键码生成的程序流程如图8-26所示。

从行来看,为形成行扫描码设置一个扫描码寄存器。参照图8-26,由于扫描是从最下行开始的,所以扫描码寄存器赋初值FEH。以后其他各行的扫描码可以通过扫描寄存器左移一位来形成。从列来看,为了与扫描过程中读回的列状态进行比较,可预先把各列的状态码写成一个数据表,成为列码表,以便每次扫描都会与列的状态进行比较。为了生成和保存键码,还设置了一个键码寄存器,并赋初值00H。行计数器和列计数器用于控制扫描。

【例8-2】以8255作为8×4键盘的接口,设计一个MCS-51单片机系统矩阵键盘,并编写键盘扫描程序。

【解】以8255的PA口为输出口,接键盘行线。PC口为输入口,以PC3~PC0接键盘的4条列线。设计电路如图8-27所示。采用线选法对8255进行片选,所以8255的端口有多个地址,以其中一组地址进行操作,假如PA口的地址为8000H,PC口的地址为8002H,控制寄存器地址为8003H。

判断有无闭合键的子程序为KS,以供在键盘扫描程序中调用。执行KS子程序的结果是:有闭合键,则(A)≠0;无闭合键,则(A)=0。程序如下:

图8-26 扫描程序流程图

图8-27 以8255为接口的8×4行列式键盘电路呼图

在单片机应用系统中常常是键盘和显示器同时存在,因此,可以把键盘程序和显示程序配合起来使用,即把显示程序作为键盘程序中的一个延时子程序使用。这样既不耽误显示驱动,又可以起到键盘定时扫描的作用。

假定本系统中显示器驱动程序为DIR,执行时间约为6 ms。键盘扫描程序如下,程序中R2为扫描码寄存器,R4为行计数器。键盘扫描程序的运行结果是将闭合键的键码放在累加器A中。键码的计算公式为:键码=列状态码起始值+行号。