目录
8255A的内部结构
①数据总线缓冲器
②数据端口A、B、C
③A组和B组控制电路
④读/写控制逻辑
8255A控制信息和传输动作的对应关系
⭐8255A的控制字
一、方式选择控制字
①方式0(基本输入输出工作方式)
例如:
在一个8086系统中,若8255A的控制端口地址为0046H,要求该8255A的端口A工作在方式0,作输出口;端口B工作在方式1,作输出口;端口C的高4位做输出,低四位配合端口B工作,设置为输出。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
可以用下列指令设置8255A的方式选择控制字
MOV AL,86H ;方向选择控制字
OUT 46H,AL ;控制端口地址0046H
二、端口C置1/置0控制字
经常将端口C的 某一个数位或几个数位作为控制信号使用,以配合端口A或端口B工作。
端口C置1/置0控制字可以设置端口C的某个数位为1或为0,从而完成信息传输过程中的信号设置要求。
例如:
要求将端口C的PC6置0,PC3置1,则端口C置1/置0控制字分别为0CH和07H,若8255A的控制端口地址为B0F6H。
则将该8255A的端口C的PC6置0,PC3置1的程序段如下:
PC6 :
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
PC3 :
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
MOV DX,0B0F6H
MOV AL,0CH
OUT DX,AL
MOV AL,07H
OUT DX,AL
8255A的工作方式
8255A的工作方式有三种,分别为方式0、方式1和方式2
端口A可以工作在这三种方式的任何一种
端口B只能工作在方式0或方式1
端口C除作为一般输入输出口之外,常用作配合端口A和端口B工作的控制联络口
②方式1(选通的输入输出工作方式)
当8255A的端口A或端口B有一个工作在方式1,而另一个工作在方式0时,端口C的3位
固定地作为数据传送的控制联络信号
。
若端口A和端口B都工作在方式1, 则端口C的6位
被占用作为数据传送的控制信号
正是由于工作在方式1时,端口C的某些数位自动地转为数据传送的选通
和应答信号
,故称为该方式 选通的输入输出方式。
基于以上分析,若8255A的某一个端口工作在方式1的输入或输出情况下,端口C中 自动提供了相应的数位作为控制信号,尤其是提供了中断请求信号。
③方式2(双向传输方式)
⭐⭐8255的编程及应用
例1:8255A作为连接打印机的接口,工作于方式0。
工作过程为:当主机要往打印机输出字符时,先查询打印机忙信号。如果打印机正在处理一个字符或正在打印一行字符,则忙信号为1,反之,则忙信号为0。因此,当查询到忙信号为0时,则可通过8255A往打印机输出一个字符。此时,要将选通信号
S
T
B
‾
\overline{STB}
STB置为低电平,然后再使
S
T
B
‾
\overline{STB}
STB置为高电平,这相当于在
S
T
B
‾
\overline{STB}
STB端输出一个负脉冲(初始状态,
S
T
B
‾
\overline{STB}
STB是高电平)。
现将端口A作为传送字符的通道,工作方式0,输出方式;
B端口未用;
端口C也工作于方式0,
PC3作为BUSY信号输入端,故PC3~PC0 为输入方式,
PC6作为
S
T
B
‾
\overline{STB}
STB信号输出,故PC7~PC4为输出方式。
设需打印的字符已放在CL寄存器中,8255A的端口地址为
A端口:C000H C端口:C004H
B端口:C002H 控制口:C006H
具体代码段如下:
方向选择控制字:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
PRINT:MOV DX,0C006H
MOV AL,81H ;方向控制字,A、B和C端口工作于方式0,A口输出,PC7~PC4输出,PC3~PC0输入
OUT DX,AL
MOV AL,0DH ;用C端口置1/置0方式使PC6为1,即STB初始状态为高电平
OUT DX,AL ;STB送高电平
LP: MOV DX,0C004H ;C端口
IN AL,DX ;检测BUSY,从DX中读一个字节送入AL
TEST AL,08H ;测试PC3位 0000 1000
JNZ LP ;若打印机忙,则等待(不等于0跳转,打印机忙时为1)
MOV AL.CL ;如不忙,则把CL中字符送端口AL
MOV DX,0C000H ;端口A
OUT DX,AL ;若打印机不忙,将AL中字符送端口A
MOV DX,0C006H ;控制口
MOV AL,0CH ;用C端口置1/置0方式使PC6为0
OUT DX,AL ;使STB为低电平
MOV AL,ODH ;用C端口置1/置0方式使PC6为1
OUT DX,AL
... ;后续程序段
例2:8255A工作方式1,作为用中断方式工作的Centronic360字符打印机的接口
8255A的端口A作为数据通道,工作于方式1。
PC7自动作为 O B F ‾ \overline{OBF} OBF信号输出端,
PC6自动作为 A C K ‾ \overline{ACK} ACK信号输入端
PC3自动作为INTR信号输出端。
在Centronic360字符打印机标准定义的信号线中,最主要的是8位并行数据线,2条联络信号,选通信号
S
T
B
‾
\overline{STB}
STB ,响应信号
A
C
K
N
L
G
‾
\overline{ACKNLG}
ACKNLG和一条忙信号线BUSY。所需的数据选通脉冲信号
S
T
B
‾
\overline{STB}
STB由CPU控制PC0
来产生。
O
B
F
‾
\overline{OBF}
OBF在这里没有用到,可将它悬空,8255A的
A
C
K
‾
\overline{ACK}
ACK连接到打印机的
A
C
K
N
L
G
‾
\overline{ACKNLG}
ACKNLG端。
PC3连接8259A的中断请求输入端IR3。对应于中断类型号0BH,此中断对应的中断向量放在2CH,2DH,2EH和2FH 4个内存单元中,假设8259A在系统程序中已经完成初始化,这部分电路连接图未画出。
设8255A的端口地址为
A端口:00C0H C端口:00C4H
B端口:00C2H 控制口:00C6H
方向控制字
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
方向控制字为A0H,其中D3~D1为任选,现取为0,其他各位的值使A组工作于方式1,A端口为输出,PC0作为输出。
实际使用时,在此系统中由中断处理程序完成字符输出,而主程序仅仅完成方向控制字的设置和开放中断需要指出的是这里开放中断①不仅要用STI开放CPU的中断, 而且 ②要使8255A的INTE为1。
在中断处理程序中,设字符已存放在主机的字符输出缓冲区,往A端口输出字符后,CPU用 对C端口的置1/置0命令使选通信号为0,从而将数据送到打印机 。当打印机接收并打印字符后,发出回答信号
A
C
K
‾
\overline{ACK}
ACK,由此清除了8255A的“缓冲器满”指示,并使8255A产生新的中断请求。如果中断是开放的,CPU便响应中断,进入中断处理程序。
以下为具体程序段:
MINA: MOV AL,0A0H ;初始化程序
OUT 0C6H,AL ;将方向控制字送入控制口进行初始化,设置8255A的控制字
MOV AL,01H ;使PC0为1,即让STB初始状态为低电平
OUT 0C6H,AL
XOR AX,AX
MOV DS,AX ;DS指到0段,中断向量表在0段
MOV [2CH],OFFSET ROUT;中断类型号为0BH,写入的表地址为0BH×4
MOV [2EH],SEG ROUT
MOV AL,0DH ;使PC6为1,允许8255A中断
OUT 0C6H,AL
STI ;开放中断
参照以上主程序的初始化部分,中断处理子程序必须装配在1000H:2000H处。
中断处理子程序的主要程序段如下:
ROUT: MOV AL,[DI] ;DI为缓冲区指针,字符送端口A
OUT 0C0H,AL
MOV AL,00H ;使PC0为0,产生选通信号
OUT 0C6H,AL
INC AL ;使PC0为1,撤销选通信号
OUT 0C6H,AL
...
IRET
网上借用程序写法:
INIT:
MOV AL,0AOH ;初始化程序
OUT 0C6H,AL ;设置8255A的控制字
MOV AL,01 ;使PC0为1,即让STB初始状态为低电平
OUT 0C6H,AL
XOR AX,AX
MOV DS,AX ;DS指到0段,中断向量表在0段
LEA AX,INTPR
MOV WORD PTR [0BH*4],AX ;中断类型号为0BH,写入的表地址为0BH×4
MOV AX,SEG INTPR
MOV WORD PTR [0BH*4+2],AX;把向量高字写入高地址
MOV AL,0DH ;使INTE为l,允许8255A请求中断
OUT 0C6H,AL
STI ;使IF为1,开放中断
中断处理子程序的主要程序段如下:
INTPR:
MOV AL,DI ;DI为打印字符缓冲区指针,字符送A端口
OUT 0COH,AL
OUT 0C6H,AL ;使PC0 为0,产生选通信号负脉冲
INC AL
OUT 0C6H,AL ;使PC0为1,撤消选通信号
·
·
· ;后续处理
IRET ;中断返回