第9章并行接口.ppt

上传人:本田雅阁 文档编号:2567553 上传时间:2019-04-09 格式:PPT 页数:97 大小:529.01KB
返回 下载 相关 举报
第9章并行接口.ppt_第1页
第1页 / 共97页
第9章并行接口.ppt_第2页
第2页 / 共97页
第9章并行接口.ppt_第3页
第3页 / 共97页
第9章并行接口.ppt_第4页
第4页 / 共97页
第9章并行接口.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《第9章并行接口.ppt》由会员分享,可在线阅读,更多相关《第9章并行接口.ppt(97页珍藏版)》请在三一文库上搜索。

1、第9章 并行接口,9.1 并行接口原理 9.2 可编程并行接口芯片8255A 9.3 8255A应用举例 9.4 简易键盘接口 9.5 LED显示器及其接口,9.1 并行接口原理,图9-1是一个典型的并行接口和外设连接的示意图。图中的并行接口是一个双通道的并行接口,包括输入锁存寄存器、输出缓冲寄存器、控制寄存器和状态寄存器。,9.1.1 并行接口功能,一般而言,一个并行接口电路应具有以下3方面的功能: 实现与系统总线的连接,提供数据的输入输出功能,这是并行接口电路基本的功能。 实现与I/O设备的连接,具有与I/O设备进行应答的同步机构,保证有效地进行数据的接收/发送: 有中断请求与处理功能,使

2、得数据的输入/输出可以采用中断的方法来实现功能。,9.1.2 内部结构,按功能分,接口电路分为:数据寄存器、控制寄存器、状态寄存器、其他控制电路等,9.1.3 外部信号,并行接口电路的外部信号可分成两部分:与I/O设备相连的接口信号;与CPU相连的接口信号。 1与I/O设备的接口信号 数据信号:用于接口电路与I/O设备进行输入/输出数据。 控制信号:用于接口电路向I/O设备提供控制功能。 状态信号:用于接口电路接收I/O设备提供的状态信息。 2与CPU的接口信号 数据信号:用于实现接口电路与CPU的数据交换。 地址译码信号:用于选择不同的接口电路以及接口电路内部不同的寄存器。 读写信号:用于确

3、定CPU当前对接口电路的操作性质,是读或是写。 中断申请与应答信号:用于实现中断请求和中断响应操作。,9.2 可编程并行接口芯片8255A,常用的并行接口电路有两大类,一类是不可编程的接口电路,如74LS244/245、74LS273/373等。其特点是电路简单、使用方便;缺点是使用不够灵活,一旦硬件联接以后,功能很难改变。另一类是可编程接口,其特点是使用灵活,可以在不改变硬件的情况下,通过软件编程来改变电路的功能。 随着大规模集成电路技术的发展,出现了许多通用的可编程的并行接口电路芯片。Intel 8255A就是一个与TTL电平完全兼容的可编程并行接口芯片,其通用性强、使用灵活,具有多种输入

4、输出工作方式,可以通过程序来设置。,9.2.1 8255A的内部结构,8255A的内部组成框图如9-2所示,由4部分组成。,1数据总线缓冲器 它是三态8位双向缓冲器,CPU通过输入/输出指令来实现对缓冲器发送或接收数据。8255A的控制信息和状态信息也是通过该缓冲器传送的。 28位端口PA、PB和PC 8255A有3个8位端口PA、PB和PC,各端口都可以由程序设定为不同的工作方式。 端口PA1个8位的数据输入锁存器和1个8位的数据输出锁存/缓冲器。 端口PB1个8位的数据输入缓冲器和1个8位的输入、输出锁存/缓冲器。 端口PC1个8位数据输入缓冲器和1个8位输出锁存/缓冲器。,通常,将端口P

5、A与端口PB用作输入输出的数据端口,端口PC用作控制或状态信息的端口。在方式控制字的控制下,端口PC可以分为上下两部分,分别与端口PA和端口PB配合使用,用作控制信号(输出),或作为状态信号(输入)。 与外部设备的接口信号: PA0PA7端口A的外设数据线。 PB0PB7端口B的外设数据线。 PC0PC7端口C的外设数据线。,3A组和B组的控制电路 A组控制部件用来控制端口PA和端口PC的高4位(PC7PC4),B组控制部件用来控制端口PB和端口PC的低4位(PC3PC0)。这两组控制电路根据CPU发出的方式选择控制字来控制8255A的工作方式,接收来自读写控制逻辑的命令,并向与其相连的端口发

6、出适当的控制信号。 4读/写控制逻辑 用于管理数据信息、控制信息和状态信息的传送。它接收来自CPU地址总线的A1、A0地址信号和控制总线的有关信号( 、 、RESET),向8255A的A、B两组控制部件发送命令。,8255A是一个40引脚双列直插的芯片,其引脚如图9-3所示。,控制信号 、 、 以及A1、A0与8255A各端口的操作关系如表9-1所示。,与CPU的接口信号: D7D0数据线、双向、三态,可连接CPU的数据总线。 CS 片选信号、输入、低电平有效。只有当 为“0”时,8255A芯片才工作。通常, 接地址译码信号。 A1、A0片内寄存器选择信号(端口选择),输入。8255A内部有3

7、个数据端口和1个控制端口。规定当A1,A0为00时,选中端口PA;为01时,选中端口PB;为10时,选中端口PC;为11时,选中控制端口。 RESET复位信号、输入、高电平有效。当接收到RESET信号时,所有的内部寄存器都被清除,同时3个数据端口被自动设置为输入状态。 RD 读信号、输入、低电平有效。当有效时,CPU可以从8255A中读取数据。 WR 写信号、输入、低电平有效。当有效时,CPU可以向8255A写入数据或命令字。,9.2.2 8255A的控制字,8255A有两个控制字:方式控制字和端口C按位置位/复位控制字。由于写入同一个控制端口,为了使8255A能识别是哪一个控制字,控制字采用

8、特征位的方法。 控制字中最高位D7为特征位,当D7=0,表示当前控制字是按位置位/复位控制字。当D7=1,表示当前控制字是方式控制字。 1方式控制字 方式控制字的作用是:确定A、B、C 3个并行口的工作方式及端口功能,即确定是作为输入端口还是为输出端口。由方式控制字可知:,(1)8255A的3种基本工作方式如下: 方式0基本的输入/输出方式。 方式1选通输入/输出方式。 方式2双向传输方式。 (2)在方式1工作时,方式控制字总是把A、B、C 3个端口分为两组来设定工作方式。其中,A组为端口A和端口C的高4位(PC7PC4);B组为端口B和端口C的低4位(PC3PC0)。 (3)端口A可工作于3

9、种方式中的任种。端口B只能工作于方式0或方式1。在方式0时,端口C可以分成2个4位端口,用作数据输入/输出端口;还可以分别用来为A端口、B端口输入/输出时提供控制信号和状态信号。,方式控制字的格式如图9-4所示。,在对8255A进行初始化时,应向控制寄存器写入方式控制字,确定各端口的工作方式及功能。在系统复位时,复位信号RESET有效,8255A被复位,所有的数据端口(端口A、端口B、端口C)均被置为输入方式,且一直保持到向8255A写入新的方式选择控制字为止。 例9-1 如果把端口A设定为方式1,输出;端口B设定为方式0,输入;端口C上半部设定为输入,下半部设定为输出。则方式选择控制字应为:

10、10101010B=AAH。 若将此控制字内容写入8255A的控制寄存器,即实现了对8255A工作方式的设定,就是完成了对8255A的初始化。设控制口地址为303H,初始化的程序段为: MOV DX,303H ;8255A的控制口地址 MOV AL,OAAH ;控制字 OUT DX,AL ;控制字写入控制端口,2端口C按位置位/复位控制字 按位置位/复位控制字的作用是使端口C的某一位输出为高电平或低电平,以用于控制或应答信号。 端口C按位置位/复位控制字的格式如图9-5所示。,例9-2 如果要使端口C的PC4端输出高电平,则按位置位/复位控制字应为00001001B=09H,将该控制字写入82

11、55A的控制寄存器,即可在PC4引脚得到一个高电平。设控制口地址为09H,则程序段如下: MOV AL, 09H ;控制字,PC4置1 OUT 063H,AL ;控制字写入控制端口 实际上,端口A和端口B同样具有进行按位置位/复位的功能。只要将端口A或端口B的内容读出来,与某一数相“或”(可使某一位或某几位为1),或者与某一数相“与”(可使其一位或某几位为0),然后再写入原端口,即可实现对某一位或某几位置位/复位。,9.2.3 8255A的工作方式,8255A有3种工作方式,由方式控制字选择。 1工作方式0:基本的输入/输出方式 (1)方式0是一种基本的输入/输出方式,它不需要应答式的联络信号

12、,其基本功能如下: 2个8位端口(端口A和端口B)和2个4位端口(端口C的上、下部分)。 任何一个端口可以作为输入或输出端口。 输出数据可被锁存,输入数据不被锁存。 每个端口的输入/输出可有16种不同的组合。,执行方式0输入操作时,若外设数据已经准备好,CPU就可以用输入指令从这个端口读入数据。执行方式0输出操作时,由输出指令把CPU的数据输出给外设,在CPU执行OUT指令以后,输出数据就锁存在相应的端口上。因此,工作方式0时,8255A在输入操作时相当于一个三态缓种器,在输出操作时则相当于一个数据锁存器。 (2)图9-6和图9-7分别为方式0的输入、输出时序图。 方式0适合于两种情况:一种是

13、无条件传送,另一种是查询方式传送。,图9-7 方式0输出时序图,在无条件传送时,发送方和接收方不需要应答信号。在这种情况下,对接口要求很简单,只要能够传送数据就可以。因此,在无条件传送时使用8255A时,3个数据端口可以实现3路数据传输。 查询式传送时,需要有应答信号。由于方式0不提供固定的应答信号,所以,通常用端口PA和端口PB作为数据端口,用端口PC的高4位和低4位分别设置为输入和输出,作为控制信号的输出和状态信号的输入。,2工作方式1:选通输入/输出方式 这是一种采用选通(应答式)联络信号的输入/输出方式。在这种方式中,端口A仍用作输入或输出的数据端口,端口C的某些位用作接收或产生联络应

14、答信号。 主要功能如下: 有两组选通工作方式的端口,每组包含1个8位数据端口和3条控制线。 每组端口提供有中断请求逻辑和中断允许触发器。对中断允许触发器INTE的操作是通过端口C的置位/复位控制字进行的。置位允许中断,复位禁止中断。INTE触发器对应端口C的位是作应答联络信号的输入信号的那一位(输入方式为,输出方式为,因此只要对该位置位/复位就可以控制INTE触发器。 两组端口若只有1组工作于方式1,则剩下的13位都可以工作于方式0。若两组端口都工作于方式1,端口C剩下的2位还可以由方式控制字指定为输入或输出,同时具有置位/复位功能。 输入和输出数据都被锁存。,(1)方式1的输入 1)方式1的

15、输入组态。方式控制字选择A组、B组工作于方式1输入时,其端口组态如图9-8所示。,2)联络信号的定义 选通信号,低电平有效。这是由外部设备提供的输入信号,当其有效时,将输入设备送来的数据锁存输入锁存器。 IBF输入缓冲器满信号,高电平有效。这是8255A输出的联络信号。当其有效时,表示数据己锁存在输入锁存器中。它由前沿置高、信号的后沿置低。 INTER中断请求信号,高电平有效。这是8255A输出的信号,可用于向CPU提出中断请求,要求CPU读取外设数据。当为高电平,IBF为高电平、中断允许时被置为有效;信号的前沿将其恢复为低电平。,A组的中断允许触发器INTEA对应于PC4,B组的INTEB对

16、应于PC2。 3)方式1的输入时序。图9-9为方式1的输入时序图。 图9-9 方式1的输入时序图,以端口PA为例,方式1的输入过程如下: 当外设准备好数据,在送出数据的同时,向PC4送出一个选通信号。8255A的端口A数据锁存器在下降沿控制下,将数据锁存。然后,8255A通过PC5,向外设送出高电平的IBF,表示锁存数据已完成,暂时不要再送数据。如果INTE为“1”,即端口PA允许中断,位于PC3的INTR变成高电平输出,向CPU发出中断请求。CPU响应中断,执行IN指令时,对端口PA执行读操作,同时由信号的下降沿清除中断请求信号,然后使IBF复位为低电平。外设在检测到IBF为低电平后,开始下

17、一个数据字节的传送。,(2)方式1输出。 1)方式1的输出组态。8255A的端口A、端口B工作于方式1输出时其端口组态如图9-10所示。 2)联络信号的定义。 输出缓冲器满信号,低电平有效。这是8255A输出给外设的一个控制信号,当其有效时,表示CPU已将数据输出给指定的端口,外设可以将数据取走。它由输出信号的后沿置为有效,由ACK有效恢复为高电平。 外设应答信号,低电平有效。表示8255A的端口数据已由外设取走。 INTR中断请求信号,高电平有效。当输出设备已接收数据后,8255A输出此信号向CPU提出中断请求,请求CPU继续提供数据。当为高电平,为高电平和INTE为高电平(允许中断)时,使

18、其有效,而写信号的前沿使其复位。,A组中断允许触发器INTEA由PC6位控制,B组的INTEB由PC2位控制。,3)方式l的输出时序。方式1的输出时序如图9-11所示。 在方式1输出时,CPU向端口写入一个字节数据以后,有效,通知外设读取数据。当外设读取数据以后,向端口发一个信号,其后沿将置位INTR信号(若INTE=1),向CPU发出中断请求,要求CPU在中断服务程序中发送新的数据。 因此,在方式1时,规定一个端口作为输入口或输出口的同时,自动规定了有关的控制信号,尤其是规定了相应的中断请求信号。,3工作方式2:双向选通输入/输出方式I (1)方式2的功能。这种方式使外设可在单一的8位数据上

19、,既能发送数据,又能接收数据。工作时可用程序查询方式,也可用中断方式传送数据。其主要功能如下: 只可用于A组,B组仍为工作方式0或方式1。 1个8位的双向数据端口A和5根控制线。 输入和输出数据都被锁存。 (2)方式2的组态 端口A方式2的组态如图9-12所示。,(3)联络信号的定义。 选通输入信号,低电平有效。这是外设供给8255A的选通信号,把数据锁存在输入锁存器,IBF输入缓冲器满信号,高电平有效。这是8255A输出的控制信号,表示数据已进入锁存器。在CPU未读取数据前,IBF始终为高电平,阻止新的数据输入。 响应输入信号,低电平有效。的下降沿启动端口A的三态输出缓冲器送出数据,上升沿是

20、数据已输出的响应信号。其他时间输出缓冲器处于高阻状态。 INTR中断请求信号,高电平有效。输入或输出数据时,都用它作为中断请求信号。输出的中断允许触发器INTE1由PC6置位/复位控制,输入的中断允许触发器INTE2由PC4控制。,(4)方式2的工作时序。图9-13为方式2的工作时序图。 图9-13 方式2时序图,方式2是一种双向工作方式。如果一个并行外部设备既可以作为输入设备,又可以作为输出设备,并且输入/输出动作不同时进行,那么,将这个外设与8255A的端口A相连,并使它工作在方式2,就会非常合适。 例如,软盘驱动器就是这样一种外设,主机既可以往软盘驱动器输出数据,又可以从软盘驱动器输入数

21、据,但数据的输出和输入过程总是不重合的。所以,可以将软盘驱动器的数据线与8255A的PA7PA0相连,将端口PA设置为工作方式2,对应的端口PC用作联络信号,就可通过8255A输入输出软盘的信息。,9.3 8255A应用举例,9.3.1 查询方式的双机并行通信 例9-3 甲乙两台微机之间并行传送1KB数据。甲机发送,乙机接收。甲机的8255A采用方式1工作,乙机的8255A采用方式0工作。两台微机的CPU与接口之间都采用查询方式交换数据。,(1)接口电路设计。 接口电路的连接如图9-14所示。 甲机的8255A是方式1发送,因此,把端口PA指定为输出,发送数据,而PC7和PC6引脚分别固定作联

22、络线和。 乙机的8255A是方式0接收数据,故把端口PA定义为输入,另外,选用引脚PC7和PC3作为联络线。 虽然两侧的8255A都设置了联络线,但有本质的差别:甲机的8255A是方式1,其联络线是固定的,不可替换;乙机的8255A是方式0,其联络线是不固定的,可以选择。,(2)接口软件编程。接口驱动程序包括发送程序和接收程序。 甲机发送如下程序段: MOV DX,303H ;8255A命令端口 MOV AL,l0100000B ;初始化工作方式字 OUT DX,AL MOV AL,0DH ;设置发送数据区的指针 OUT DX,AL MOV SI,OFFSET BUFS ;设置发送数据区的指针

23、 OUT CX, 3FFH ;发送字节数 MOV DX,300H;向端口A写第1个数,产生第1个OBF信号 MOV AL,SI ;送给乙方,以便获取乙方的ACK信号,OUT DX,AL INC SI ;内存地址加1 DEC CX ;传送字节数减1 L: M0V DX,302H ;8255A状态端口(端口C) IN AL,DX ;查发送断清求则INTRSA=1 AND AL,08H ;是否PC3=1 JZ L ;若无中断请求,则等待;若有中断请求,则向端口A写数 M0V DX,300H ;8255A端口 PA地址 M0V AL,SI ;从内存取数 0UT DX,AL ;通过端口A向乙机发送第2个

24、数据 INC SI ;内存地址加1 DEC CX ;字节数减1 JNZ L ;字节未完,继续 M0V AX,4COOH ;己完,退出 INT 21H ;返回DOS BUFS DB. ;定义1024个数据,在发送程序中,是查询输出时状态字的中断请求INTR位(PC3)。实际上,也可以查询发送缓冲器满(PC7)的状态。只有当发送缓冲器空时,CPU才能发送下个数据。,乙机接收如下程序段: MOV DX,303H ;8255A命令端口 MOV AL,10011000B ;初始化工作方式字 OUT DX,AL MOV AL,00000111B ;置=1(PC3=1) OUT DX,AL MOV DI,O

25、FFSETBUFR ;设置接收数据区的指针 MOV CX,3FFH ;接收字节数 L1: MOV DX,302H ; 8255A端口PC IN AL,DX ;查甲机的=O? (乙机的PC7=O) AND AL,80H ;即查P机是否有数据发来 JNZ L1 ;若无数据发来,则等待;若有数据,则从端口A读数,MOV DX,300H ;8255A端口PA地址 IN AL, DX ;从端口A读入数据 M0V DI,AL ;存入内存 MOV DX,303H ;产生信号,并发回给甲机 MOV DX,OO000110B ;PC2置“O” OUT DX,AL NOP NOP MOV AL,00000111B

26、 ;PC3置“1” OUT DX,AL INC DI ;内存地址加1 DEC CX ;字节数减1 JNZ L1 ;字节未完,则继续 MOV AX,4COOH ;已完,退出 INT 2lH ;返回DOS BUFR DB l024 DUP(?),9.3.2 与打印机接口 例9-4 假设利用8255的A口方式0与打印机相连,将内存缓冲区BUFF中的字符打印输出。硬件连接见图9-15。设8255的工作频率与CPU的工作频率相当。打印机接口要求在有效时,才能接收数据;而在BUSY有效时,则表示打印机忙,不能接收数据。程序如下:,DATA SEGMENT BUFF DB HELLO,WORLD!, 13,

27、 10, PORTA EQU 60H PORTB EQU 61H PORTC EQU 62H PORTCN EQU 63H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA,START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFF MOV AL,88H ;8255初始化,A口方式0输出, C口上半部输入 OUT PORTCN AL ;C口下半部输出 MOV AL,01H ;置位PC0,无效 OUT PORTCN ,AL WAIT:IN AL,PORTC ;读打印机状态,若“忙”则 等待,TEST AL,80H J

28、NZ WAIT MOV AL,SI CMP Al,$ JZ PRINT_OVER OUT PORTA,AL MOV AL,00H ;产生选通信号,打印机接收数据,开始打印 OUT PORTCN ,AL MOV AL,01H OUT PORTCN ,AL INC SI JMP WAIT PRINT-OVER:MOV AH,4CH INT 21H CODE ENDS END START,本例中,C口的按位置/复位控制字用来产生打印机的控制信号,控制打印机启/停。此时,C口的按位置/复位控制字实现C口的位操作。,9.4 简易键盘接口,9.4.1 键盘的工作原理 最简单的键盘如图9-16(a)所示,其

29、中每个键对应I/O端口的一位。没有键闭合时,各位均处于高电平;当有一个键按下时,就使对应位接地而成为低电平。这样,CPU只要检测到某一位为“0”,便可判别对应键已经按下。,但是,用图9-16(a)的结构设计键盘有一个很大的缺点。这就是当键盘上的键较多时,占用的I/O端口太多。比如一个有64键的键盘,就需要64条连线,需占用8个8位端口,这是我们不希望的。所以,这种简单结构只用在仅有几个键的系统中。,通常使用的键盘是矩阵结构的。对于88=64个键的键盘,采用矩阵方式就只要用16条引线(2个8位端口)便完成键盘的连接。以33=9个键为例,如图9-16(b),这个矩阵分为3行3列,如果键4按下,则第

30、1行和第1列线接通而形成通路。如果第1行线接地电位,则由于键4的闭合,会使第1列线也输出地电位。矩阵式键盘工作时,就是按行线和列线的电平来识别闭合键的。,9.4.2 键的识别方法 为了识别键盘上的闭合键,通常可以采用两种方式:逐行扫描法和行列反转法。,1逐行扫描法 图9-17是一个8行8列组成的键盘。行线与8255的A端口相连,列线与8255的B端口相连。CPU使8255的A端口某一位为0,相当于将该行线接地;某位为1,相当于将该行线接高电平。,行扫描法识别按键的原理如下: (1)使所有行线为低电平,然后读入列线值并进行检查。如果列线有一位为低,则说明必有键被按下。 (2)使第0行输出低电平,

31、然后读入列线值并进行检查。如果有某列线变为低电平,则表示第0行和此列线相交的位置上的键被按下。如果没有任何一条列线为低电平,则说明第0行没有任何键被按下。,(3)将第1行接低电平,然后读入列线值并进行检查。检测列线是否有变为低电位的线。如此往下一行一行地扫描,直到最后一行。在扫描过程中,当发现某一行有键闭合时,也就是读入的列线值中有一位为低时,即可识别出此刻是哪一键被按下。,第一步是判断是否有键按下。为了消除键的抖动,所以调用了延迟程序。这段程序如下: KEY1:MOV AL,00 MOV DX,ROWPORT ;ROWPORT为行线端口地址 OUT DX,AL ;使所有行线为低 MOV DX

32、,COLPOET ;COLPOET为列线端口地址 IN EL,DX ;读取列值 AND AL,0FFH COMP AL,0FFH ;判定是否有列线为低电平 JZ KY1 ;没有,无闭合键,则循环等待 CALL DELAY ;有,则延迟20ms清除抖动,第二步是判断哪一个键被按下了。首先,将计数值设置为行数,然后设置扫描初值。扫描初值11111110使第0行接低,其他行为高。输出扫描初值后,马上读取列线的值,看是否有列线处于低。若无,则将扫描初值循环左移一位,变为111111101,这样使第1行接低,其他行为高。同时,计数值减1,如此下去,一直查到计数值为0。如果在此过程中,查到有列线为低,则组

33、合此时的行值和列值,进行下一步查找键值代码的工作。程序段如下:,MOV AH,0FEH ;扫描初值送AH MOV CX,8 ;行数送CX KEY2:MOV AL,AH MOV DX,ROWPORT OUT DX,AL ;输出行值(扫描值) MOV DX,COLPOET IN AL,DX ;读进列值 AND AL,0FFH CMP AL,0FFH ;判断有无接地线 JNZ KEY3 ;有,则转下一步处理 ROL AH,1 ;无,则移位扫描值 LOOP KEY2 ;准备下一行扫描 JMP KEY1 ;所有行都没有键按下,则返回继续检测 KEY3: ;此时,AL=列值,AH=行值,进行后续处理,2行

34、列反转法 行列反转法也是识别按键的常用方法。它的原理为: (1)判断是否有键按下(同行扫描法)。 (2)将行线工作在输出方式,将列线工作在输入方式,CPU通过8255的A端口往各行线上全部送低电平,然后从8255的B端口读入列线值。如果此时有某键被按下,则必定会使某列线值为低。,(3)程序再对两个端口进行行列反转,使接行线的A端口设为输入方式,将列线的B端口设为输出方式。然后将刚才读得的列值从列线所接端口输出,再读取行线的输入值,那么,闭合键所在的行线值必定为0。这样,当一个键被按下时,必定可以读得一对唯一的行值和列值。 为查找键代码,键盘程序设计时,可将各个键对应的行、列值放在一个表中,程序

35、通过查表来确定具体按下的为哪一个键,进而在这个表中找到这个键的代码。从而确定是哪一个键。 如果遇到多个键同时闭合的情况,则输入的行值或者列值中一定有一个以上的0,而由程序预先建立的键值表中不会有此值,因而可以判为重键而重新查找。所以,用这种方法可以方便地解决重键问题。,图9-17情况下的行反转法键盘扫描程序如下: KEY1: ;设置行线接输出端口ROWPORT,列线接输入端COLPORT 并判断是否有键按下(同行扫描法) KEY2: MOV AL,00 MOV DX,ROWPORT OUT DX,AL ;行线全为低 MOV DX,COLPORT IN AL,DX ;读取列值 AND AL,0F

36、FH COMP AL,0FFH JZ KEY2 ;无闭合键,循环等待 PUSH AX ;有闭合键,保存列值 PUSH AX ;设置行线接输入端口ROWPORT,列线接输出端COLPORT,MOV DX,COLPORT POP AX OUT DX,AL ;输出列值 MOV DX,ROWPORT IN AL,DX ;读取行值 POP BX ;结合行列值,此时 MOV AH,BL ;AL=行值,AH=列值 ;查找键代码 MOV SI,OFFSET TABLE ;TABLE为键值表 MOV DI,OFFSET CHAR ;CHAR为键对应的代码 MOV CX,64 ;键的个数,KEY3: CMP AX

37、,SI ;与键值比较 JZ KEY4 ;相同,说明查到 INC SI ;不相同,继续比较 INC SI INC DI LOOP KEY3 JMP KEY1 ;全部比较完,仍无相同,说明是重键 KEY4: MOV AL,DI ;获取键代码送AL ;判断按键是否释放,没有则等待 CALL DELAY ;按键释放,延时消除抖动 ;后续处理,TABLE DW 0FEFEH ;键0的行列值(键值) DW 0FDFEH ;键1的行列值 DW 0FBFEH ;键2的行列值 ;全部键的行列值 CHAR DB ;键0的代码 DB ;键1的代码 ;全部键的代码,例9-5 假设有一个44的矩阵键盘通过并行接口芯片8

38、255与微机相连。8255的A口作为输出口,与键盘的行线相连;B口为输入口,与键盘列线相连。接口硬件的连接如图9-18所示,设8255的A口地址为60H,B口地址为61H,控制寄存器地址为63H,请编写键盘扫描程序。,采用逐行扫描法:让所有行线全为0,读入所有的列线值,如果有列线值为0,则说明有键按下;然后从第0行开始,每扫描一行,令该行所对应的行线为0,其余行线为1;然后读入列线状态,如果有一列为0,则该行该列交叉处的键被按下,如果所有列都为1,则行号加1,顺序扫描下一行。键号从左上角开始为0号,从左向右、从上到下依次编号,右下脚的编号为15。程序如下:,MOV AL,82H ;方式0,A口

39、输出,B口输入 OUT 63H,AL BEGIN:MOV AL,0 ;检查看是否有键按下 OUT 60H,AL WAIT: IN AL,61H AND AL,OFH COMP AL,OFH JZ WAIT ;无键按下则转上去等待 SM: MOV DL,4 ;行数送DL MOV AL,OFEH ;扫描码,0行为0 MOV CH,0 ;键号初值为0 SROW:OUT 60H,AL ;扫描一行 RCL AL,1 ;修改扫描行 MOV AH,AL ;保存下次要扫描的扫描码 IN AL,61H ;读列线状态,AND AL,OFH CMP AL,OFH ;检查是否有列线为0 JNZ SCO1 ;有列线为0

40、转到 ADD CH,4 ;否则键号+4,指向下一行的第一个键的键号 MOV AL,AH ;取回行扫描码 DEC DL ;行数减1 JNZ SROW ;行没扫描完则转去扫描下一行 JMP BEGIN SCO1: RCR AL,1 JNC PROCE ;该列为0,转处理程序,此时CH中是键号 INC CH ;如果该列不为0,键号+l,继续查找列线 JMP SCO1 PROCE: ;键处理程序,从上面的程序可以看出,CPU要不断地查询是不是有键按下,因此在此查询方式下CPU的效率是比较低的。可以做一点修改,使得任意按下一个键就会产生中断,在中断处理程序里再对键盘进行键号扫描,这样就可以大大提高CPU

41、的效率。另外,为了防止按键抖动问题,我们可以在查到有键按下的情况下,延迟20ms左右,再开始扫描键号。,3抖动和重键问题 当用手按下一个键时,往往会出现按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也会出现类似的情况,这就是抖动,如图9-19所示。 抖动的持续时间随操作员而异,不过通常总是不大于l0ms,抖动问题会引起对闭合键的错误识别。,图9-19 抖动和硬件消抖电路,用硬件电路很容易消除抖动,在图9-19中采用带滞环的施密特硬件消抖电路。在键数很多的情况下,用软件方法也很实用。这就是通过延时20ms来等待抖动消失,然后再读入键值。 在前面键盘扫描程序中就是用这种

42、方法来消除抖动的。 所谓重键就是指两个或多个键同时闭合。出现重键时,读取的键值必然出现有一个以上的0。于是就产生了到底是否给予识别和识别哪一个键的问题。,对重键问题的处理,简单的情况下,可以不予识别。通常情况,则是只承认先识别出来的键,对此时同时按下的其他键均不作识别,直到所有键都释放以后,才读入下一个键。这就是前面讲的键盘扫描程序使用的方法,称为连锁法。 另外还有一种巡回法,它的基本思想是:等被识别的键释放以后,就可以对其他闭合键作识别,而不必等待全部键释放。显然巡回法比较适合于快速键入操作。当然,对于重键,我们也可认为是正常的组合键,这只要将它们都识别出来就可以了。 说明:前面讲的行列反转

43、法也可以方便地解决重键问题。,9.5 LED显示器及其接口,9.5.1 七段LED显示器原理 LED的主要部分是7段发光管,如图9-20(a)所示。这7段发光管分别为ag段,有些产品还附带一个小数点h。通过7个发光段的不同组合,可以显示09和AF共16个字母数字及其他特殊字符。 例如,当a、b、c段亮,显示“7”;当a、b、c、d、e、g段亮,则显示“d”。,LED可以分为共阳极和共阴极两种结构,如图9-20(b)和(c)所示。 其中,图(b)为共阳极结构,数码显示端输入低电平有效,当某一段得到低电平时,便发光。 图(c)为共阴极结构,数码显示端输入高电平有效,当某段处于高电平时便发光。,表9

44、-2和9-3分别为共阴极和共阳极LED显示数字与显示代码之间的对应关系。,表9-2 共阴极数码管,表9-3 共阳极数码管,为了在LED上显示数据,首先必须把显示数据转换为LED的7位显示代码。实现这种转换可以采用下面两种方法。 (1)专用芯片。即采用专用的带驱动器的LED段译码器,如CD 4511,可以实现对BCD码的译码,但不能对大于9的二进制数译码。CD4511有4位显示数据输入,7位显示段输出,3位控制信号输入。 使用时,只要将CD 4511的输入端与微机系统输出端口的某4个数据位相连,而CD4511的输出直接与LED的ag相接,便可实现对l位BCD码的显示。具体电路如图9-21所示。,

45、(2)软件译码法。图9-22所示的采用8255A的LED接口,在软件设计时,在数据段定义0F共16个数字(也可以为09或其他符号)的显示代码表,在程序中利用XLAT指令进行软件译码。假设用共阳极LED来显示数据,0F的显示代码表就可以按0F的顺序定义如下: DISPCODE DB 0C0H,0F9H,06H,0EH,利用8086的换码指令XLAT,便可方便地实现数字到显示代码的译码。 假设要显示的数据存放在BL的低4位中,利用下面指令就可以实现软件译码。 MOV AL,BL ;把要显示的数据送入AL AND AL,0FH ;屏蔽无用位 LEA BX DISPCODE ;显示代码表的首地址送BX

46、 XLAT ;换码,相应的显示代码即被存入AL,9.5.2 多位数显示电路 图9-23是多位显示的接口电路示意,硬件上用公用的驱动电路来驱动各数码管,软件上用扫描方法实现数字显示。 从图中可以看到,用2个8位输出端口就可以实现8个数码管的显示控制。其中,一个端口用作位控制,即控制哪个数码管显示。对于图9-26的共阳极数码管,当位控制端口的控制码某位为低电平时,经反相驱动,便在相应数码管的阳极加上了高电平,这个数码管就可以显示数据。但具体显示什么数码,则由另一个端口,即段控制端口决定。,段控制端口通过段驱动电路送出显示代码到数码管相应段。此端口由8个数码管共用,因此当CPU送出一个显示代码时,各

47、数码管的阴极都收到了此代码。但是,只有位控制码中为低的位对应的数码管才得到导通而显示数字,其他数码管并不发光。 由上所述,只要CPU通过段控制端口送出段显示代码,然后通过位控制端口送出位显示代码,指定的数码管便显示相应的数字。如果CPU顺序地输出段码和位码,依次让每个数码管显示数字,并不断地重复显示,利用眼睛的视觉惯性,当重复频率达到一定程度,从数码管上便可见到相当稳定的数字显示。 显而易见,重复频率越高,每位数码管延时显示的时间越长,数字显示得就越稳定,显示亮度也就越高。,程序设计时可以开辟一个BUFDATA缓冲区,存放要显示的数字,第一个数字在最左边的数码管显示,下一个数字送到左边第二个数码管显示,依次类推。另外,还需要建立一个显示代码表table,从前向后依次存放0F对应的七段显示代码。显示代码是和硬件连接有关的,在图9-23的接口电路中,数字0的显示代码为C0H,1的显示代码为F9H,。,下面是一段实现8位数码管依次显示一遍的子程序。 MOV DI,OFFSET BUFDATA ;指向数字缓冲区 MOV CL,0FEH ;指向最左边数码管 DISP: MOV AL,DI ;取出数字 MOV BX,OFFSET TABLE ;指向显示代码表 XLAT ;得到显示代码 MOV DX,SEGPORT ;SEGPORT为段控制

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1