340 likes | 481 Vues
一、键盘及其接口. 1. 单个按键的连接与应用. 常用的按键,都存在两种状态:断开和闭合。当某一键被按下,则为闭合状态;键释放,则为断开状态。键盘电路的功能就是将键的闭合和断开状态用“ 0” 和“ 1” 来表示,然后通过数据总线送到 CPU 内部进行键的识别。. 图 9 - 18 为单个键的输入电路。用下列两条指令可以识别按键是否被按下:. IN AL, 20H. AND AL, 01H. 程序执行结果若 AL 内容为零( ZF=1 ),说明键被按下;若 AL 内容为非零( ZF=0 ),则说明键未被按下。. 在键处理过程中,有二个问题必须注意:.
E N D
一、键盘及其接口 1. 单个按键的连接与应用 常用的按键,都存在两种状态:断开和闭合。当某一键被按下,则为闭合状态;键释放,则为断开状态。键盘电路的功能就是将键的闭合和断开状态用“0”和“1”来表示,然后通过数据总线送到CPU内部进行键的识别。
图9-18为单个键的输入电路。用下列两条指令可以识别按键是否被按下:图9-18为单个键的输入电路。用下列两条指令可以识别按键是否被按下: IN AL, 20H AND AL, 01H 程序执行结果若AL内容为零(ZF=1),说明键被按下;若AL内容为非零(ZF=0),则说明键未被按下。
在键处理过程中,有二个问题必须注意: (1)键抖动的处理 在实际按键操作中,由于按键动作是一个机械动作,键在闭合或断开的过程会发生抖动,如图9-19所示。
键抖动时间的长短与开关的机械特性有关,一般为5ms~10ms左右,然后达到稳定状态。在键盘接口,为了保证CPU对键的闭合作一次且仅作一次处理,必须去除抖动,使CPU在键的稳定闭合或断开状态时读取键值。键抖动时间的长短与开关的机械特性有关,一般为5ms~10ms左右,然后达到稳定状态。在键盘接口,为了保证CPU对键的闭合作一次且仅作一次处理,必须去除抖动,使CPU在键的稳定闭合或断开状态时读取键值。
在键盘接口中,使用更普遍的是采用软件延时的方法来完成消抖。其基本思想是:在检测到按键按下或释放时,记录按键的状态,延时10ms~20ms,再次检测按键的状态,若与前一次的状态相同,说明按键的状态已稳定,可进行处理;否则,表示键的状态不稳定,可能是误动作,不应被处理。在键盘接口中,使用更普遍的是采用软件延时的方法来完成消抖。其基本思想是:在检测到按键按下或释放时,记录按键的状态,延时10ms~20ms,再次检测按键的状态,若与前一次的状态相同,说明按键的状态已稳定,可进行处理;否则,表示键的状态不稳定,可能是误动作,不应被处理。
对于图9-18电路中单个键的处理,可以使用如下程序:对于图9-18电路中单个键的处理,可以使用如下程序: IN AL, 20H ;读取键状态 AND AL, 01H JNZ EXIT ;无键按下,退出键处理程序 CALL Delay ;延时10ms IN AL, 20H ;再次读取键状态 AND AL, 01H JNZ EXIT ;无键按下,退出键处理程序 键处理程序 …
(2)单个按键动作的确认 由于CPU的程序执行比按键的机械动作快得多,使得一次按键动作期间,CPU检测到有按键并执行了相应的键处理程序以后,按下的键可能还没有被释放,因此,在CPU再一次测试键盘状态时,该键又被认为是按下状态,从而出现按一次键而CPU进行二次或多次键处理的情况。这是一个明显的误操作。解决方法有多种,最简便的解决方法是CPU在测试到有键接下时,一直等到键释放才作相应的键处理。
对于图9-18,可采用如下程序段来实现单个按键动作的确认:对于图9-18,可采用如下程序段来实现单个按键动作的确认: IN AL, 20H ;读取键状态 AND AL, 01H JNZ EXIT ;没有键按下,退出键处理程序 CALL Delay ;延时10毫秒 IN AL, 20H ;再次读取键状态 AND AL, 01H JNZ EXIT ;无键按下,作为误动作退出键处理程序
L1: IN AL, 20H ;读取键状态 AND AL, 01H ;等待键释放 JZL1 CALL Delay ;键释放时消抖 IN AL, 20H AND AL, 01H JZ L1 键处理程序
2. 线性键盘及其接口 线性键盘由若干独立的按键组成。每个按键将其一端与微机系统中某输入端口的一位数据线相连,另一端接地。其接口程序简单,只要查询该输入端口各位的状态,便可判断是否有键按下,以及按下的具体是哪一个键。
IN AL, 20H SHR AL, 1 JNC K0 ;转键K0的处理程序 SHR AL, 1 JNC K1 ;转键K1的处理程序 SHR AL, 1 JNC K2, ;转键K2的处理程序 SHR AL, 1 JNC K3 ;转键K3的处理程序
当然,上述程序段只是完成键识别的工作。在实际应用中,还要考虑键抖动问题的处理以及单个按键动作的确认问题。当然,上述程序段只是完成键识别的工作。在实际应用中,还要考虑键抖动问题的处理以及单个按键动作的确认问题。 线性键盘有多少按键,就有多少根连线与微机输入端口相连,因此只适合于按键少的应用场合,常用于某些微机化仪器或专用微机系统中。
3.矩阵键盘及其接口 矩阵键盘的按键排成n行m列,每个按键占据行列的一个交叉点,需要的输入输出线为n+m,最大按键数为n×m。显然,在按键较多的应用场合,矩阵键盘可以减少与微机系统接口的连线,是一般微机常用的键盘结构。
图9-21为一个3×4矩阵键盘及其接口电路。 图9-213×4矩阵键盘的接口
图9-22 是实现键处理工作的程序流程。 设图9-21中8255A的端口地址为00H(A口)、02H(B口)、04H(C口)和06H(控制口),键处理的程序如下:
;确定按键闭合,等待键按下 MOV AL,82H OUT 06H,AL ;8255A初始化,选择方式0,A口为输 ;出,B口为输入 MOV AL,0 OUT 00H,AL ;使各行线接地(为0电平) LOP1: IN AL,02H ;读列线状态 AND AL,0FH ;屏蔽无用位,保留列线位 CMP AL,0FH ;有列线为0电平吗? JZ LOP1 ;无,则继续查列线状态,等待键按下
;识别按下的键 MOV BL,3 ;行数送BL MOV BH,4 ;列数送BH MOV AL,11111110B ;起始扫描码,第一次使行线0接地 MOV CH,0FH ;设置屏蔽码 MOV CL,0FFH ;取键号初值为FFH
LOP2: OUT 00H,AL ;逐行扫描 ROL AL ;修改扫描码,准备扫描下一行 MOV AH,AL ;扫描码送AH保存 IN AL,02H ;读列线数据 AND AL,CL ;屏蔽无用位,保留列线位 CMP AL,CL ;有列线接地吗? JNZ LOP3 ;有,转去找该列线 ADD CH,BH ;否,修改键号,使适合下一行 MOV AL,AH ;扫描码送AL DEC BL ;行数减1 JNZ LOP2 ;未扫描完,转下一行 JMP BEGIN
LOP3: INC CH ;键号加1 RCR AL ;带进位循环右移一位 JC LOP3 ;C=1,说明该列未接地,转去检查下一列线 MOV AL,CH ;是,键号送AL CMP AL,0 ;是0号键吗? JZ KEY0 ;转0号键处理程序 CMP AL,1 ;是1号键吗? JZ KEY1 ;转1号键处理 CMP AL,0BH ;是B号键吗? JZ KEY口 ;转B号键处理
二. LED(发光二极管)显示器及其接口 1、七段LED显示器的结构
a b f g D7 D6 D5 D4 D3 D2 D1 D0 p g f e d c b a c e p d 共阳极LED,使a, b, g, e, d段为低电平,其他段为高电平,即显示“ 2”。(显示代码A4H)。 共阴极LED,使a, f, g, c, d为高电平,其他段为低电平,即显示“ 5”(显示代码6DH)。
数字0~9,对应的七段显示代码如下表1所示 十六进制表示的七段显示码 数 码 共阳极 共阴极 0123456789 C0F9A4B0999282F88098 3F065B4F666D7D077F67
2. 七段显示吗的译码方法 (1)采用专用芯片,即采用专用的带驱动器的LED段译码器,比如CD4511,可以实现对BCD码的译码,但不能对大于9的二进制数译码。CD4511有4位显示数据输入,7位显示段输出,3位控制信号输入。使用时,只要将CD4511的输入端与微机系统输出端口的某4个数据位相连,而CD4511的的输出直接与LED的a~g相接,便可实现对1位BCD码的显示。具体电路如图9-24所示。
(2)软件译码法。图9-25所示的采用8255A的LED接口,在软件设计时,在数据段定义0~F共16个数字(也可以为0~9或其他符号)的显示代码表,在程序中利用XLAT指令进行软件译码。假设用共阳极LED来显示数据,0~F的显示代码表就可以按0~F的顺序定义如下:(2)软件译码法。图9-25所示的采用8255A的LED接口,在软件设计时,在数据段定义0~F共16个数字(也可以为0~9或其他符号)的显示代码表,在程序中利用XLAT指令进行软件译码。假设用共阳极LED来显示数据,0~F的显示代码表就可以按0~F的顺序定义如下:
利用8086的换码指令XLAT,便可方便地实现数字到显示代码的译码。利用8086的换码指令XLAT,便可方便地实现数字到显示代码的译码。 假设要显示的数据存放的BL的低四位中,利用下面几条指令就可实现软件译码。 MOV AL,BL ;把要显示的数据送入AL AND AL,0FH ;屏蔽无用位 LEA BX,DISPCODE ;显示代码表的首地址送BX XLAT ;换码,相应的显示代码即被存入AL
3.一种实用的多位LED显示接口 实际使用时,往往要用几个数码管实现多位显示。这时,如果每一个数码管占用一个独立的输出端口,那么,将占用太多的端口;而且,驱动电路的数目也很多。所以,要从硬件和软件两方面想办法节省硬件电路。
图9-26是一种多位显示的接口电路,这是一种常用的方案。在这种方案中,硬件上用公用的驱动电路来驱动各数码管;软件上用扫描方法实现数字显示。图9-26是一种多位显示的接口电路,这是一种常用的方案。在这种方案中,硬件上用公用的驱动电路来驱动各数码管;软件上用扫描方法实现数字显示。
下面是一段实现8位数码管依次显示一遍的子程序。实际应用中,只要按一定频率重复调用它,就可以获得稳定的显示效果。下面是一段实现8位数码管依次显示一遍的子程序。实际应用中,只要按一定频率重复调用它,就可以获得稳定的显示效果。 MOV DI,OFFSET BUFDATA ;指向数字缓冲区 MOV CL,0FEH ;指向最左边数码管
DISP: MOV AL,[DI] ;取出数字 MOV BX,OFFSET TABLE ;指向显示代码表 XLAT ;得到显示代码 MOV DX,SEGPORT ;segport为段控制端口 OUT DX,AL ;送出段码 MOV AL,CL ;取出位显示代码 MOV DX,BITPORT ;bitport为位控制端口 OUT DX,AL ;送出位码 CALL DELAY ;实现数码管延时显示 INC DI ;指向下一个数字
ROL CL,1 ;指向下一个数码管 CMP CL,0FEH ;是否指向最右边的数码管 JNZ DISP ;没有,显示下一个数字 RET ;8位数码管都显示一遍, 返回 TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H ;显示代码表 DB 99H, 92H, 82H, 0F8H DB 80H, 90H, 88H, 83H DB 0C6H, 0C1H 86H, 8EH BUFDATA DB 8 DUP(0) ;数字缓冲区