第 9 章 可编程外围接口芯片 8255A 中国科学技术大学 何克东
微机与I/O设备的接口按照数据传送方式的不同,可分为并行接口与串行接口两种。 并行接口一次传送多位数据,即在CPU与I/O设备之间传送信息的数据单位一般为“字节”或“字”,需要使用多根数据线,如打印机接口等. 在并行接口中,除了少数场合(无条件传送)之外,一般都要求在接口与外设之间设置并行数据线的同时,至少还要设置两根握手(联络)信号线,以便进行互锁异步握手方式(即查询方式)的通信。 并行接口的优点是传输速率高,但由于需要多根数据线,不适合长距离数据传输,一般用于近距离传送的场合。 并行接口电路有不可编程接口和可编程接口之分。可编程接口可由用户根据需要,编制相应的接口控制程序,选择接口的工作方式及功能。由于可编程接口具使用灵活、功能强的特点,在微机系统中应用广泛。
9.1 8255A的工作原理 Intel 8255A是一种通用的可编程并行I/O接口芯片,又称为“可编程外设接口芯片(Programmable Peripheral Interface PPI)” 具有多种功能的可编程并行接口电路芯片 最基本的接口电路:三态缓冲器和锁存器 与CPU间、与外设间的接口电路:状态寄存器和控制寄存器 还有端口的译码和控制电路、中断控制电路 分3个端口,共24个外设引脚 共三种输入输出工作方式
一、 8255A的内部结构和功能 数据 总线 缓冲器 内部控制线 内部数据线 D0~D7 A组 控制 端口A 端口C 上部 B组 端口B 下部 读写 逻辑 PC0~PC3 PB0~PB7 PC4~PC7 PA0~PA7 RD WR A0 A1 CS RESET
1. 外设数据端口 端口A:PA0~PA7 A组,支持工作方式0、1、2 常作数据端口,功能最强大 端口B:PB0~PB7 1. 外设数据端口 端口A:PA0~PA7 A组,支持工作方式0、1、2 常作数据端口,功能最强大 端口B:PB0~PB7 B组,支持工作方式0、1 常作数据端口 端口C:PC0~PC7 仅支持工作方式0 A组控制高4位PC4~PC7 B组控制低4位PC0~PC3 可作数据、状态和控制端口 分两个4位,每位可独立操作 控制最灵活,最难掌握
8255A基本操作 A1 A0 RD WR CS 操作 1 A口内容读至数据总线 B口内容读至数据总线 C口内容读至数据总线 输入 1 A口内容读至数据总线 B口内容读至数据总线 C口内容读至数据总线 输入 数据总线内容写至A口 数据总线内容写至B口 数据总线内容写至C口 数据总线内容写至控制寄存器 输出 × 端口输出为高阻 非法 禁止
二、 8255A的控制字 1.方式选择控制字 方式0:基本输入输出方式 适用于无条件传送和查询方式的接口电路 方式1:选通输入输出方式 适用于查询和中断方式的接口电路 方式2:双向选通传送方式 适用于与双向传送数据的外设
方式选择控制格式字 标志位 00= A口方式0 01= A口方式1 1X= A口方式2 1=A口输入 0=A口输出 1=B口输入 D6 D5 D4 D3 D2 D1 D0 标志位 00= A口方式0 01= A口方式1 1X= A口方式2 1=A口输入 0=A口输出 1=B口输入 0=B口输出 1=C口高4位输入 0=C口高4位输出 0= B口方式0 1= B口方式1 1=C口低4位输入 0=C口低4位输出 方式选择控制格式字
2.C口置位/复位控制字 C口置位/复位控制字的功能有两个:一是用于对外设的控制。利用这一功能,可使C口某一位输出一个开关量或一个脉冲,作为外设的启动或停止信号。二是可用于设置方式1和方式2的中断允许。此时,C口置位/复位控制字不影响对应的引脚状态,只是起到设置INTE、开关8255A中断的作用。 C口置位/复位控制字写入控制端口。
置位/复位控制字格式 ╳ D3 D2 D1 D0 标志位 000:选择PC0 1:置位 001:选择PC1 0:复位 : 任意值 ╳ D3 D2 D1 D0 标志位 000:选择PC0 001:选择PC1 : 111:选择PC7 1:置位 0:复位 任意值 置位/复位控制字格式
例:方式0下: MOV AL, 00001010B OUT 63H, AL MOV AL, 00001011B ╳ D3 D2 D1 D0 PA7 : PA0 PB7 PB0 PC7 PC5 PC0 ╳ D3 D2 D1 D0
三、 8255A的工作方式和C口状态字 1.方式0 - 简单的输入/输出方式 IN AL,60H OUT 61H, AL 1.方式0 - 简单的输入/输出方式 方式0是一种简单的输入/输出方式,也称为无条件传送方式或同步传送方式。在这种方式下,A、B、C三个端口作为相互独立的输入/输出端口使用,不需要联络信号。C口的高4位(PC7~PC4)和低4位(PC3~PC0),即可以合成一个8位端口使用,也可以作为两个相互独立的4位口使用。方式0是单向传送,一次初始化只能设置在一个方向上传送数据。方式0一般用于无条件传送的场合,也可以用做查询式传送。 IN AL,60H OUT 61H, AL
方式0输入时序 data 输入端口 D0~D7 RD CS,A1,A0
方式0输出时序 WR data 输出端口 D0~D7 CS,A1,A0
2.方式1 - 选通输入/输出方式 方式1是一种选通输入/输出方式(也称为应答方式或异步方式)。A口和B口都可以工作在这种方式。在这种方式下,A口和B口作为两个独立的8位I/O数据通道(可连接外设)。C口要有6位(分成两个3位)分别作为A口和B口的应答联络线,其余2位仍可作为方式0的输入/输出。方式1也是单向传送。
(1)方式1输入联络信号 STB——选通信号,低电平有效 由外设提供的输入信号,当其有效时,将输入设备送来的数据锁存至8255A的输入锁存器 IBF——输入缓冲器满信号,高电平有效 8255A输出的联络信号。当其有效时,表示数据已锁存在输入锁存器 INTR——中断请求信号,高电平有效 8255A输出的信号,可用于向CPU提出中断请求,要求CPU读取外设数据
方式1输入:A端口 PA7~PA0 PC4 STBA PC5 IBFA PC3 INTRA RD INTEA 数据选通信号 表示外设已经准备好数据 PA7~PA0 ① PC4 INTEA STBA PC5 ② IBFA 输入缓冲器满信号 表示A口已经接收数据 ④ ③ PC3 INTRA RD 中断请求信号 请求CPU接收数据 中断允许触发器
STB IBF INTR RD 输入端口 data D0~D7 方式1输入时序 STB和IBF是外设和8255A间 的一对应答联络信号, 为的是可靠地输入数据 data INTR IBF 输入端口 D0~D7 STB RD
方式1中断控制 8255A的中断由中断允许触发器INTE控制 置位允许中断,复位禁止中断 对INTE的操作通过写入端口C的对应位实现,INTE触发器对应端口C的位是作应答联络信号的输入信号的哪一位,只要对那一位置位/复位就可以控制INTE触发器 选通输入方式下 端口A的INTEA对应PC4 端口B的INTEB对应PC2 选通输出方式下 端口A的INTEA对应PC6
(2)方式1输出联络信号 OBF——输出缓冲器满信号,低有效 8255A输出给外设的一个控制信号,当其有效时,表示CPU已把数据输出给指定的端口,外设可以取走 ACK——响应信号,低有效 外设的响应信号,指示8255A的端口数据已由外设接受 INTR——中断请求信号,高有效 当输出设备已接受数据后,8255A输出此信号向CPU提出中断请求,要求CPU继续提供数据 端口A的INTEA对应PC6 端口B的INTEB对应PC2
方式1输出:A端口 PA7~PA0 PC6 ACKA PC7 OBFA WR PC3 INTRA INTEA 中断允许触发器 外设响应信号 表示外设已经接收到数据 PA7~PA0 ③ PC6 INTEA ACKA PC7 OBFA ① ② 输出缓冲器满信号 表示CPU已经输出了数据 WR PC3 INTRA ④ 中断请求信号 请求CPU再次输出数据 中断允许触发器
方式1输出时序 OBF和ACK是外设和8255A间 的一对应答联络信号, 为的是可靠地输出数据 WR OBF INTR ACK 输出端口 data 输出端口 D0~D7 WR OBF ACK
3. 方式2-双向方式 方式2将方式1的选通输入输出功能组合成一个双向数据端口,可以发送数据和接收数据 只有端口A可以工作于方式2,需要利用端口C的5个信号线,其作用与方式1相同 方式2的数据输入过程与方式1的输入方式一样 方式2的数据输出过程与方式1的输出方式有一点不同:数据输出时8255A不是在OBF有效时向外设输出数据,而是在外设提供响应信号ACK时才送出数据
方式2-双向 PA7~PA0 PC6 ACKA PC7 OBFA PC4 STBA RD PC5 IBFA WR PC3 INTRA INTE1 PC6 ACKA PC7 OBFA 用PC6设置INTE1(输出) 用PC4设置INTE2(输入) 输入和输出中断通过 或门输出INTRA信号 PC4 INTE2 STBA RD PC5 IBFA WR PC3 INTRA
PA0~PA7 data-in data-out D0~D7 data-out data-in 方式2双向时序 WR OBF INTR ACK STB IBF RD PA0~PA7 data-in data-out D0~D7 data-out data-in
当8255A工作在方式1或方式2时,用输入指令可读取C口的状态字,以了解8255A的状态。
4.端口C的状态字 D7 D6 D5 D4 D3 D2 D1 D0 A组 B组 方式1输入 方式1输出 方式2双向 I/O IBFA INTEA INTRA INTEB IBFB INTRB 方式1输出 OBFA OBFB 方式2双向 INTE1 INTE2 × STBA STBB ACKA ACKA ACKA STBA
8255A的编程 初始化编程:一个方式控制字 采用控制I/O地址:A1A0=11 工作过程中:通过数据端口对外设数据进行读写 数据读写利用端口A、B和C的I/O地址,A1A0依次等于00、01、10 IBM PC/XT机上,端口A、B、C和控制端口的I/O地址为60H、61H、62H和63H
1. 写入方式控制字:示例 要求: A端口:方式1输入 C端口上半部:输出,C口下半部:输入 B端口:方式0输出 1. 写入方式控制字:示例 要求: A端口:方式1输入 C端口上半部:输出,C口下半部:输入 B端口:方式0输出 方式控制字:10110001B 初始化的程序段: mov dx,0fffeh ;假设控制端口为FFFEH mov al,0b1h ;方式控制字 out dx,al ;送到控制端口
2. 读写数据端口 初始化编程后: 8255A具有锁存输出数据的能力 当数据端口作为输入接口时,执行输入IN指令将从输入设备得到外设数据 2. 读写数据端口 初始化编程后: 当数据端口作为输入接口时,执行输入IN指令将从输入设备得到外设数据 当数据端口作为输出接口时,执行输出OUT指令将把CPU的数据送给输出设备 8255A具有锁存输出数据的能力 对输出方式的端口同样可以输入 不是读取外设数据 读取的是上次CPU给外设的数据
读写数据端口示例: 利用8255A的输出锁存能力,可实现按位输出控制 对输出端口B的PB7位置位的程序段: mov dx,0fffah ;B端口假设为FFFAH in al,dx ;读出B端口原输出内容 or al,80h ;使PB7=1 out dx,al ;输出新的内容
3. 读写端口C: C端口被分成两个4位端口,两个端口只能以方式0工作,可分别选择输入或输出 在控制上,C端口上半部和A端口编为A组,C端口下半部和B端口编为B组 当A和B端口工作在方式1或方式2时,C端口的部分或全部引脚作为联络信号使用 其余引脚仍可设定工作在方式0
对端口C的数据输出有两种办法 通过端口C的I/O地址:向C端口直接写入字节数据。这一数据被写进C端口的输出锁存器,并从输出引脚输出,但对设置为输入的引脚无效 通过控制端口:写入位控字,使C端口的某个引脚输出1或0,或置位复位内部的中断允许触发器
读取的C端口数据有两种情况 未被A和B端口使用的引脚:将从定义为输入的端口读到引脚输入信息;将从定义为输出的端口读到输出锁存器中的信息 被A和B端口作为联络线的引脚:将读到反映8255A状态的状态字
9.2 8255A的应用 作为通用的并行接口电路芯片,8255A具有广泛的应用 应用在IBM PC/XT微机上 应用于打印机接口电路 连接简易键盘 驱动LED数码管 ……
一、基本输入输出应用 例,某一系统中,有8个开关K7~K0,要求不断检测它们的通断状态,并随时在发光二极管LEE7~LED0上显示出来。开关断开,相应的LED点亮;开关合上,LED熄灭。选用8086 CPU,8255A和74LSl38译码器等芯片。 判断端口地址:0F0H~0F6H 确定控制字:10010000B
MOV DX,0F6H MOV AL,10010000B OUT DX,AL TEST_IT: MOV DX,0F0H IN AL,DX ;控制字寄存器 MOV AL,10010000B ;控制字 OUT DX,AL ;写入控制字 TEST_IT: MOV DX,0F0H ;指向A口 IN AL,DX ;从A口读入开关状态 MOV DX,0F2H ;指向B口 OUT DX,AL ;B口控制LED,指示开关状态 JMP TEST_IT ;循环检测
二、键盘接口 键盘接口电路 +5V C D E F 8 9 A B 4 5 6 7 1 2 3 PA0 8255A PA1 PA2 PA3 1 2 3 PB7 PB6 PB5 PB4 8255APB3 PB2 PB1 PB0 键盘接口电路
PORT_A EQU 0FF9H ;8255A口地址 端口地址 PORT_B EQU 0FFBH ;8255B口地址 PORT_CTL EQU 0FFFH ;8255控制口地址 DATA SEGMENT :数据段,键盘扫描码表 ; 0 l 2 3 4 5 6 7 TABLE DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH ; 8 9 A B C D E F DB 0D7H, 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH DATA ENDS STACK1 SEGMENT STACK ‘STACK’ DW 50 DUP(0) TOP_STAC LABEL WORD STACK1 ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX, STACK1 MOV SS, AX LEA SP, TOP_STACK MOV AX, DATA MOV DS, AX
;初始化8255A,方式0,A口作输出,B口和C口为输入向所有行送0 MOV DX, PORT_CTL ;指向控制口 MOV AL, 10001011B ;控制宇 OUT DX, AL ;写入控制字 MOV DX,PORT_A ; A口 MOV AL,0 OUT DX,AL ;向A口各位输出0 ;读列,查看是否所有键均松开 MOV DX,PORT_B WAIT_OPEN:IN AL,DX ;键盘状态读入B口 AND AL,0FH ;只查低4位(列值) CMP AL,0FH ;是否都为1(各键均松开)? JNE WAIT_OPEN ;否,继续查 ;各键均已松开,再查列是否有0,即是否有健压下 WAIT_PRES:IN AL,DX ;读B口 AND AL,0FH ;只查低4位 CMP AL,0FH ;是否有键压下 JE WAIT_PRES ;无,等待 MOV CX,16EAH ; 有键压下,延时20ms,消抖动 DELAY: LOOP DELAY ;延时20ms
;再查列,看键是否仍被压着 IN AL,DX AND AL,0FH CMP AL,0FH JE WAIT_PRES ;已松开,转出等待压键 ;键仍被压着,确定哪一个键被压下 MOV AL,0FEH ;先使D0=0 MOV CL,AL ;CL=1111 1110B NEXT_ROW: MOV DX,PORT_A ;A口 OUT DX,AL ;向一行输出低电平 MOV DX,PORT_B ;B口 IN AL,DX ;读入B口状态 AND AL,0FH ;只截取列值 CMP AL,0FH ;是否均为1? JNE ENCODE ;否,表示有键压下,转去编码 ROL CL,1 ;均为1,使下行输出0 MOV AL,CL JMP NEXT_ROW;查看下行
;已找到有一列为低电平,对压健的行列值编码 ENCODE: MOV BX,000FH ;建立地址指针,先指向F健对应的地址 ; 0 l 2 3 4 5 6 7 TABLE DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH ; 8 9 A B C D E F DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;已找到有一列为低电平,对压健的行列值编码 ENCODE: MOV BX,000FH ;建立地址指针,先指向F健对应的地址 IN AL,DX ;从B口读入行列号 NEXT_TRY:CMP AL,TABLE[BX];读入的行列值与表中查得的相等吗? JE DONE ;相等,转出 DEC BX ;不等,指向下一个(键值较小者)地址 JNS NEXT_TRY ;若地址尚末减为负值,继续查 MOV AH,1 ;若减为负值,置出错码01一AH中 JMP EXIT DONE: MOV AL,BL ;BL中存有键的16进制代码 MOV AH,0 ;AH=0,读到有效键值 EXIT: HLT CODE ENDS END
LED数码管广泛用于单板微型机、微型机控制系统及数字化仪器中 LED数码管可以显示内存地址和数据等
顺时针分别称为a、b、c、d、e、f、g 有的产品还附带有一个小数点h 通过7个发光段的不同组合 LED数码管的工作原理 主要部分是7段发光管 顺时针分别称为a、b、c、d、e、f、g 有的产品还附带有一个小数点h 通过7个发光段的不同组合 主要显示0~9 也可以显示A~F(实现16进制数的显示) 还可以显示个别特殊字符,如-、P 等 a g b f c e d h
LED数码管的结构 共阴极 共阳极 阳极 +5V a b c d e f g h 阴极 a b c d e f g h
单个LED数码管的显示 a PA0 b 反 PA1 c 相 PA2 d 驱 PA3 e 动 PA4 f 电 PA5 g 路 PA6 h 1 2 3 4 5 6 7 8 9 A B C D E F 40H 79H 24H 30H 19H 12H 02H 78H 00H 18H 08H 03H 46H 21H 06H 0EH
PORT_A EQU 0FOH ;A口地址 COUNT EQU 05H ;要显示的数字 DATA SEGMENT ;16进制数字的七段代码表 ; 0 1 2 3 4 5 6 7 TABLE DB 40H,79H,24H,30H,19H,12H,02H,78H ; 8 9 A b C d E F DB 00H,18H,08H,03H,46H,21H,06H,0EH DATA ENDS CODE SEGMENT ;16进制数字到七段代码的转换程序 : DISPY: MOV BX,OFFSET TABLE ;七段代码表首地址 LEA AL,COUNT[BX] ;取5的位移量 XLAT ;将被转换的七段代码送AL寄存器 MOV DX,PORT_A OUT DX,AL ;将七段代码值从A口输出,点亮相应数字 CODE ENDS END