本文目录
8255的功能与结构
- 3个8位I/O口:
- A口、C口、B口
- 端口内部含有缓冲器
- 两组控制逻辑:
- A组:控制PA和 P C 7 − 4 PC_{7-4} PC7−4
- B组:控制 P C 3 − 0 PC_{3-0} PC3−0和PB
- 读写控制:根据地址线A1 A0
- 00:A口
- 01:B口
- 10:C口
- 11:控制字
示意图:
- 如果是8088这种8位数据线:地址是连续的。
- 如果是8086这种16位数据线:
- 数据线:用低8位。
- 地址线:A0=0表示使用低8位。因为A0=1走的是数据线高8位。所以8255连接8086的时候,A0必须是0,这就导致了地址都是偶数。
8255控制字
什么是控制字?
- 控制字是一个八位数,要送到控制口里。
- 在8255中,A1A0=11就表示送到控制口。
控制字的分类:
- 方式控制字。
- C口置位/复位控制字
方式控制字
示意图:1入0出。
解释:
- D7=1:标志位,表示是方式控制字。
- D6-D5:控制A口的工作方式,有0、1、2三种。
- D4:A口的出入。
- D3:C口高4位的出入。
- D2:B口工作方式。有0和1两种。
- D1:B口的出入。
- D0:C口低4位的出入。
C口置位/复位控制字
示意图:
解释:
- D7=0:标志位,表示C口置位/复位控制字
- D3-D1:位选择。分别选择PC0-PC7
- D0:表示这是置位or复位
例子:
- 题目:从PC5输出一个正脉冲,假设8255的端口地址是60H-63H,写出汇编程序。
- 分析:输入正脉冲,就是先设置1然后设置0。
MOV AL, 00001011 ; PC5=1的控制字
MOV DX,63H
OUT DX,AL
MOV AL, 00001010 ; PC5=0的控制字
OUT DX,AL
8255的工作方式
8255的工作方式有两种:
- 方式0:基本的I/O方式
- 方式1:选通的I/O方式
方式0:基本I/O方式
特点:
- 适用场景为无需应答联络的场合。
- 输出锁存,输入无锁存
- PA、PB、PC7-4、PC3-0可以组成16种工作方式
例子:
MOV AL,9AH
;1001 1010。即设置方式控制字,A口为方式0,PA入,PC高入,B口方式0,B口入,C口低出
OUT 63H, AL
方式1:选通I/O方式
PA、PB口可分别工作于方式1,均可以作为输入/输出。
特点:
- PA、PB口之一工作于方式1时,PC口就有3位需要配合。此时,另一个端口以及PC口其它数据位可以工作于方式0.
- PA、PB口都工作于方式1时,PC口就有6位需要配合,其余2位仍可作I/O。
方式1又分为:
- 选通输入方式
- 选通输出方式
- 选通输入输出方式
例:A口选通输入方式
解释:
- 根据控制字高4位可以知道,A口是选通输入。
- 外设的8位的数据从PA口进入,外设占用PC4口发送STB_A的负脉冲,表示要输入数据。
- 8255向外设发送IBF_A表示输入缓冲区满,占用PC5口
- 内部的中断使能和IBF_A都是1,则发出中断信号INTRA,告诉CPU将数据取走,占用PC3口。
- CPU执行READ指令将数据读走,此时IBF变低。
例子:选通输出
一个道理,只不过输入输出反过来。
方式2:双线总线方式
特点:
- 只有A口能工作于此方式,既能输出又能输入,但不能同时。
- A口工作于方式2,B口可工作于方式0或者方式1
- PB方式0:PC2-0可以作I/O
- PB方式1:PC2,1,0作B口的联络线。
例子:主机和软盘交换数据。
C口状态字
通过读取C口状态字,可以测试或者检查外设状态。
方式1状态字:
方式2状态字:
重点例题
例1:基本I/O
题目:检测开关K0-7的状态,并用LED0-7实时指示。
电路图:
分析:
- 第一步:对芯片进行初始化,确定端口地址。
- 根据片选确定A4A3A0为100,A7=1才能开启74LS138,A5A6必须是11。
- A2A1就是选端口
- 这样就可以确定A口的地址:1111 0000=F0
- 这样就可以确定B口的地址:1111 0100 = F2
- C口:F4
- D口:F6
- 第二步:查询程序。
-
写控制字:
- 方式控制字:标志位1、A口工作方式0、入、B口方式0,B出、C出=10010000=90H
-
从A口读:
IN
-
从B口写:
OUT
-
- 第三步,写程序
MOV DX,0F6H # 控制口地址
# 标志位 A口方式2 D4-D0 根据输入输出
MOV AL,90H # 控制字:1|00|1|0000
OUT DX,AL # 写控制字
TEST1:
MOV DX,0F0H # A口地址
IN AL,DX # 从A读数据
MOV DX,0F2H # B口地址
OUT DX,AL # 将数据送到B
CALL DELAY # 调用等待
JMP TEST1
例2:用数码管实时显示K3-K0的16种组合状态
题目:
假定四个端口的地址分别是60H-63H。编程用数码管实时显示K3-K0的16种状态。
电路图:
数码管:
分析:
; 段码表
TAB:
DB 40H,79H,24H,30H,19H,12H,02H,78H;
DB 00H,18H,08H,03H,43H,21H,06H,0EH;
; 方式控制字
MOV AL,10010000B; 方式0 A入B出
MOV DX,63H
OUT DX,AL
; 从K3-K0输入
IN_PORTA:
MOV DX,60H
IN AL,DX
; 对输入进行处理
AND AL,0FH ; 看电路图,高4位不要
MOV BX, OFFSET TAB ; 段码表基地址
XLAT ; 查表,BX+偏移量=>AL
; 输出
MOV DX,61H
OUT DX,AL
CALL DELAY
JMP IN_PORTA
例3:键盘电路
独立式按键和矩阵按键
独立式按键:一个端口连接一个开关。
矩阵连接:行列交叉连接。起作用的是四根行线:PA0-PA3,四根列线:PB0-PB3
原理:行线全0,列线全1表示没有键被按下。
编程要点:
- 确定是否有键按下——行线置0(OUT)读列线(IN)——重点
- 初始化:设置行线是输出,列线是输入方式。
- 发行码0:行线输出全0
- 读列码:判断列线是否全1,否说明有键被按下
- 例子:6号线被按下了,那么PB1=0——说明有键被按下了。
- 机器键盘需要延时去抖动再次判断。
- 确定键的位置——逐行扫描法
- 发行码:每次仅一行输出0,从第0行开始。
- 读列码:判断列线,如果全1,则闭合键不在此行。如此逐行判断。
- 获得键码:从B口读取行列值编码,即键码–>AL,前四位为0的是行,后四位为0的是列。
- 确定键名:将键码预先排列成表,通过获得键码查表确定键名。
假定A的端口地址是:0FF9H
; 1. 端口地址
PORT_A EQU 0FF9H;
PORT_B EQU 0FFBH;
PORT_CTL EQU 0FFFH;
; 2. 键码表
; 9号键是1101 1011
DATA SEGMEMT
TABLE
DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH;
DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH;
DATA ENDS
; 程序开始
START:
; 初始化8255控制字:A出B入
;1(标)00(A方式)0(A)0(C)0(B方式)1(B入)0(C)
MOV DX,PORT_CTL
MOV AL,82H
OUT DX,AL
; 确定是否有键按下
MOV AL,0
MOV DX,PORT_A
OUT DX,AL ; 输出行码00H
WAIT_PRES:
MOV DX,PORT_B ; 读列值:B低4位
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES ; 列码全1就继续读B口
MOV CX,16EAH ; 延时去抖动
DLY:
LOOP DLY
; 过滤后再判断是否有键按下
IN AL, DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES
; 有键按下
MOV AL,0FEH ;行线0设置0,逐行设置
MOV CL,AL;
NEXT_ROW: ; 接口输入输出和判断
MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE ; 有键
ROL CL,1 ;有就右移1位
MOV AL,CL
JMP NEXT_ROW
; 查表确定键值和键名
ENCODE:
MOV BX,000FH ;指针初始指向15,即F键
IN AL,DX ;从B口拿到行列码
NEXT_TRY:
CMP AL,TABLE[BX] ; 查表
JE DONE ; 查到
DEC BX ; 没有查到i--
JNS NEXT_TRY ; 未查完,继续
MOV AH,01H ; 设置错误标志位
JMP EXIT ; 退出
DONE: ;查到了
MOV AL,BL ; 将键盘码-->AL
MOV AH,00H ; 设置有效标志位
EXIT: ; 等待按键释放
MOV AL,0
MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
WT_OPEN:
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE WT_OPEN ;发现有键按下继续等待,其实是等待案件释放