书城工业技术智能仪器设计基础
19100400000008

第8章 人机接口技术(3)

“n键锁定”技术只处理一个键,任何其他按下又松开的键不产生任何码,通常是第一个被按下或最后一个松开的键产生码。这种方法最简单也最常用。

3.3.3非编码式键盘接口电路

非编码式键盘目前大都采用行扫描法来识别按键。行扫描法是以步进扫描的方式,每次在键盘的一行发出扫描信号,同时检查列线输入信号。若发现某列输入信号与扫描信号一致,则位于该列和扫描行交点的键被按下。4行4列键盘接口电路,共有16个键,4条行线接到输出口,4条列线接至输入口。两端口的数据端和控制端分别与单片机的数据线和控制线相连。

采用这种方法时,一般先用全“0”[也可用全“1”]测试是否有键按下。如果有,才在各输出线上依次送“0”,这可减少在没有按键时的扫描时间。假设K9键闭合,其余断开。程序在判出有键按下后,再逐行扫描,以确定所按键的号数。

8155的PA、PB口为输出口,PA口除输出显示器的扫描控制信号外,又是键盘的行扫描口。8155的PC口为键输入口。7407和75452分别为同相和反相驱动器。下面给出判别按键号的程序,该程序计算键号的方法是先确定列线号,再与键号寄存器内容相加得到按键号。这种方法程序较长,但易于理解。

89C51判键号程序:

KEY:MOVX DPTR,#7F00H;置8155 PA、PB 口为输出方式

MOV A,#03H;PC 口为输入方式

MOVX @DPTR,A

MOV R4,#00H;0→键号寄存器R4

MOV R2,#01H;扫描模式01H→R2

KEY1:MOV DPTR,#7F0lH、MOV A,R2

MOVX @DPTR,A;扫描模式→8155 PA 口

INC DPTR

INC DPTR

MOVX A,@DPTR;读8155 PC 口

JB ACC. 0,KEY2;0 列无键闭合,转判1 列

MOV A,#00H;0 列有键闭合0→A

AJMP KEY5

KEY2:JB ACC.1,KEY3;1 列无键闭合,转判2 列

MOV A,#01H;1 列有键闭合,1→A

AJMP KEY5

KEY3:JB ACC.2,KEY4;2 列无键闭合,转判3 列

MOV A,#02H;2 列有键闭合2→A

AJMP KEY5

KEY4:JB ACC.3,NEXT;3 列无键闭合,转判下一行

MOV A,#03H;3 列有键闭合,3→A

KEY5:ADD A,R4;列线号+(R4)→R4

MOV R4,A

RET

NEXT:MOV A,R4

ADD A,#04H;键号寄存器加4

MOV R4,A

MOV A,R2

JB ACC.3,NEXTI;判是否已扫到最后1 行

RL A;扫描模式左移1 位

MOV R2,A

AJMP KEY1

NEXT1:MOV R4,#0FFH;置无键闭合标志

RET

3.3.4编码式键盘接口电路

上面都是采用软件方法实现对键盘和显示器的扫描,不但程序比较复杂,而且实时性差。若要简化键盘编码所需的软件和减少占用CPU的时间,可以选用供键盘编码用的LSI接口电路来构成编码式键盘。电路矩阵发现有键按下后,提供相应的消除抖动和串键措施,以正确识别按下的键,同时提供一个内部ROM查阅表,用以产生与按下的键相应的代码。

集成芯片8279就是如上所述的一种功能较完善的键盘接口电路,它还具备显示接口的功能。8279芯片作为通用接口电路,一方面接收来自键盘的输入数据并进行预处理,另一方面实现对显示数据的管理和对数码显示器的控制。

3.3.4.1键盘、显示接口芯片8279

它的读写信号RD、WR,片选信号CS,复位信号RESET,同步时钟信号CLK以及数据总线D0~D7均能与CPU相应的管脚直接相连。C/D(A0)端用于区别数据总线上所传递的信息是数据或者是命令字。IRQ为中断请求端,通常在键盘有数据输入或传感器(通断)状态改变时产生中断请求信号。SL0~SL3是扫描信号输出线,RL0~RL7是回馈信号线。OUTB0~B3、OUTA0~A3是显示数据的输出线。BD为消隐端,在更换数据时,其输出信号可使显示器熄灭。

1.数据输入

数据输入有三种方式可供选用:键扫描方式、传感器扫描方式和选通输入方式。

采用键扫描方式时,扫描线为SL0~SL3,回馈线为RL0~RL7。每按下一键,便由8279自动编码,并送入先进先出堆栈FIFO,同时产生中断请求信号IRQ。

如果芯片的控制端CNTL和换挡端SHIFT接地,则编码的最高两位均取“0”。例如被按下键的位置在第2行(扫描行序号为010),且与第4列回馈线(列序号为100)相交,则该键所对应的代码为00010100,即为14H。

8279的扫描输出有两种方式:译码扫描和编码扫描。所谓译码扫描。即4条扫描线在同一时刻只有一条是低电平,并且以一定的频率轮流更换。如果用户键盘的扫描线多于4时,则可采用编码输出方式。此时SL0~SL3输出的是从0000至1111的二进制计数代码。

在编码扫描时,扫描输出线不能直接用于键盘扫描,而必须经过低电平有效输出的译码器。

例如将SL0~SL2输入到通用的38译码器(74LS138)即可得到直接可用的扫描线(由8279内部逻辑所决定,不能直接用416译码器对SL0~SL3进行译码,即在编码扫描时SL3仅用于显示器,而不能用于键扫描)。

暂存于FIFO中的按键代码,在CPU执行中断处理子程序时取出,数据从FIFO取走后,中断请求信号IRQ将自动撤销。在中断子程序读取数据前,下一个键被按下,则该键代码自动进入FIFO,FIFO堆栈由8个8位的存储单元组成,它允许依次暂存8个键的代码。这个栈的特点是先进先出。因此由中断子程序读取的代码顺序与键被按下的次序相一致。在FIFO中的暂存数多于一个时,只有在读完(每读一个数据则它从栈顶自动弹出)所有数据时,IRQ信号才会撤销。虽然键的代码暂存于8279的内部堆栈,但CPU从栈内读取数据时只能用“输入”或“取数”指令而不能用“弹出”指令,因为8279芯片在微机系统中是作为I/O接口电路而设置的。

在传感器扫描方式工作时,将对开关阵列中每一个结点的通、断状态(传感器状、态)进行扫描,并且当阵列(最多是8×8位)中的任何一位发生状态变化时,便自动产生中断信号IRQ。此时,FIFO的8个存储单元用于寄存传感器的现时状态,称状态存储器。其中存储器的地址编号与扫描线的顺序一致。中断处理子程序将状态存储器的内容读入CPU,并与原有的状态比较后,便可由软件判断哪一个传感器的状态发生了变化。所以8279用来检测开关(传感器)的通断状态是非常方便的。如采用PIO接口芯片对64点的通断状态监测,将占用8个并行通道,即需要多片PIO接口电路。

键盘扫描方式和传感器扫描方式的主要区别在于前者每按一次产生一个中断,而后者则会产生两次中断。

在选通输入方式工作时,RL0~RL7与8255的选通并行输入端口的功能完全一样。此时,CNTL端作为选通信号STB的输入端,STB为高电平有效。

此外,在使用8279时,不必考虑按键的抖动和串键问题。因在芯片内部已设置了消除触头抖动和串键逻辑电路,这给使用带来了很大方便。

2.显示输出

8279内部设置了16×8显示数据存储器(RAM),每个单元寄存一个字符的8位显示代码。8个输出端与存储单元各位的对应关系为:

D7 D6 D5 D4 D3 D2 D1 D0

A3 A2 A1 A0 B3 B2 B1 B0

A3~A0、B3~B0分别送出16个(或8个)单元存储的数据,并在16个显示器上显示出来。

显示器的扫描信号与键盘输入扫描信号是公用的,当实际数码显示器多于4个时,必须采用编码扫描输出,经过译码器后,方能用于显示器的扫描。

显示数据经过数据总线D7~D0及写信号WR(同时CS=0,C/D=0),可以分别写入显示存储器的任何一个单元。一旦数据写入后,8279的硬件便自动管理显示存储器的输出及同步扫描信号。因此,对操作者仅要求完成向显示存储器写入信息的操作。

8279的显示管理电路亦可在多种方式下工作,如:左端输入、右端输入、8字符显示、16字符显示等。各种方式的设置下面加以说明。

3.命令字格式及含义

8279的工作方式是由各种控制命令决定的。CPU通过数据总线向芯片传送命令时,应使WR=0、CS=0及C/D=1。

(1)键盘、显示器工作模式设置命令编码格式为:

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 D1 D0 K2 K1 K0

命令字节的最高3位000是本命令的特征码(操作码)。

8279可外接8位或16位的LED显示器,每一位显示器对应一个8位的显示RAM单元。显示RAM中的字符代码与扫描信号同步地依次送上输出线A3~A0,B3~B0。当实际的数码显示器少于8位时,也必须设置8字符或16字符显示模式之一。如果设置16字符显示,显示RAM中从“0”单元到“15”单元的内容同样依次轮流输出,而不管扫描线上是否有数码显示器存在。

左端输入方式是一种简单的显示模式,显示器的位置(最左边由SL0驱动的显示器为零号位置)编号与显示RAM的地址一一对应,即显示RAM中的“0”地址的内容在“0”(最左端)位置显示。CPU依次从“0”地址或某一地址开始将字符代码写入显示RAM。地址大于15时,再从0地址开始写入。写入过程如下:

0 1 14 15 ←显示RAM 地址

第1次写入X1 X1 ………

0 1 14 15

第2次写入X2 X1 X2 ………

……

0 1 14 15

第16次写入X16 X1 X2 ……… X15 X16

0 1 14 15

第17次写入X17 X17 X2 ……… X15 X16

右端输入方式也是一种常用的显示方式,一般的电子计算器都采用这种方式。从右端输入信息与前者比较,一个重要的特点是显示RAM的地址与显示器的位置不是一一对应的,而是每写入一个字符,左移一位,显示器最左端的内容被移出丢失。写入过程如下:

1 2 14 15 0 ←显示RAM 地址

第1次写入X1 ……… X1

2 3 15 0 1

第2次写入X2 ……… X1 X2

0 1 …… 13 14 15

第16次写入X16 X1 X2 ……… X14 X15 X16

0 1 15 16 17

第17次写入X17 X2 X3 ……… X15 X16 X17

键盘扫描方式中,两键互锁是指当被按下键未释放而第二键又被按下时,FIFO堆栈仅接收第一键的代码,第二键作为无效键处理。如果两个键同时按下,则后释放的键为有效键,而先释放键作为无效键处理。多键有效方式是指当多个键同时按下,则所有键依扫描顺序被识别,其代码依次写入FIFO堆栈。虽然8279具有两种处理串键的方式,但通常选用两键互锁方式,以消除多余的被按下键所带来的错误输入信息。

RESET信号自动设置编码扫描,键盘输入(两键互锁)左端输入的16字符显示,该信号的作用等效于编码为08H的命令。

(2)扫描频率设置命令

编码格式为:

D7 D6 D5 D4 D3 D2 D1 D0

0 0 1 P4 P3 P2 P1 P0

最高3位001是本命令的特征码。P4P3P2P1P0取值为2到31,它是外接时钟的分频系数,经分频后得到内部时钟频率。在接到RESET信号后,如果不发送本命令,分频系数取值31。

(3)读FIFO堆栈的命令

编码格式为:

D7 D6 D5 D4 D3 D2 D1 D0

0 1 0 AI × A2 A1 A0

最高3位010是本命令的特征码。在读FIFO之前,CPU必须先输出这条命令。8279接收到本命令后,CPU执行输入指令,从FIFO中读取数据。地址由A2A1A0决定,例如A2A1A0=0H,则输入指令执行的结果是将FIFO堆栈顶(或传感器列阵状态存储器)的数据读入CPU的累加器。AI是自动增1标志,当AI=1时,每执行一次输入指令,地址A2A1A0自动加1。显然,键盘输入数据时,每次只需从栈顶读取数据,故AI应取“0”。如果数据输入方式为检测传感器阵列的状态,则AI取1,扫描8次输入指令,依次把FIFO的内容读入CPU。利用AI标志位可省去每次读取数据前都要设置读取地址的操作。

(4)读显示RAM的命令

编码格式为:

D7 D6 D5 D4 D3 D2 D1 D0

0 1 1 AI A3 A2 A1 A0

最高3位011是本命令的特征码。在读显示RAM之前,CPU必须先输出这条命令。

8279接收到本命令后,CPU执行输入指令,从显示RAM读取数据。A3A2A1A0是用于区别该RAM的16个地址,AI是地址自动增“1”标志。

(5)写显示RAM的命令

编码格式为:

D7 D6 D5 D4 D3 D2 D1 D0

100AI A3 A2 A1 A0