并行接口单元由一片 8255 8255 8255 组成,其复位信号已连接到系统复位上,如下图所示。
上机实验
实验目的
- 学习利用并行接口芯片 8255 8255 8255 构成并行接口电路的基本方法;
- 熟悉掌握并行接口芯片 8255 8255 8255 的基本性能、硬件连接和初始化编程方法。
实验内容
编写一个基本输入输出程序,使 8255 8255 8255 的 A A A 口为输入, B B B 口为输出,完成拨动开关到数据灯的数据传输。
要求:数据灯的显示随开关动态改变。
实验原理
8255 内部结构
8255 8255 8255 可作为单片机与多种外围设备连接时的中间接口电路。
8255 8255 8255 作为 主机与外设的连接芯片,
- 必须提供 与主机连接 的 3 个 总线接口,即数据线、地址线、控制线接口;
- 同时必须具有 与外设连接 的接口,即 A A A、 B B B、 C C C 口;
- 由于 8255 8255 8255 可编程,所以必须具有 逻辑控制 部分;
因而 8255 8255 8255 内部结构分为 3 个部分:与CPU连接部分、与外设连接部分、控制部分。
8255 8255 8255 的内部结构及引脚如图 3-1-1 所示, 8255 8255 8255 工作方式控制字和 C C C 口按位置位/复位控制字格式如图 3-1-2 和图 3-1-3 所示。
与
C
P
U
CPU
CPU 连接部分:
- 数据总线 D B DB DB:编号为 D 0 D0 D0~ D 7 D7 D7,用于 8255 8255 8255 与 C P U CPU CPU 传送 8 位数据。
- 地址总线 A B AB AB:编号为 A 0 A0 A0~ A 1 A1 A1,用于选择 A A A、 B B B、 C C C 口与控制寄存器。
- 控制总线 C B CB CB:片选信号 C S CS CS、复位信号 R E S E T RESET RESET、写信号 W R WR WR、读信号 R D RD RD。当 C P U CPU CPU 要对 8255 8255 8255 进行读、写操作时,必须 先向 8255 8255 8255 发片选信号 选中 8255 8255 8255 芯片,然后发读信号或写信号 对 8255 8255 8255 进行读或写数据的操作。
A 0 A0 A0 和 A 1 A1 A1 接口是 8255 8255 8255 并行接口芯片的地址选择线,用来选择 8255 8255 8255 的 P A PA PA 口、 P B PB PB 口、 P C PC PC 口和控制寄存器。
- 当 A 1 = 0 A1=0 A1=0, A 0 = 0 A0=0 A0=0 时, P A PA PA 口被选择;
- 当 A 1 = 0 A1=0 A1=0, A 0 = 1 A0=1 A0=1 时, P B PB PB 口被选择;
- 当 A 1 = 1 A1=1 A1=1, A 0 = 0 A0=0 A0=0 时, P C PC PC 口被选择;
- 当 A 1 = 1 A1=1 A1=1, A 0 = 1 A0=1 A0=1 时,控制寄存器被选择。
这样, C P U CPU CPU 可以通过两根地址线来访问 8255 8255 8255 的四个端口。
与外设连接部分:
A
A
A 、
B
B
B、
C
C
C 口:编号分别为
P
A
0
PA0
PA0~
P
A
7
PA7
PA7、
P
B
0
PB0
PB0 ~
P
B
7
PB7
PB7、
P
C
0
PC0
PC0 ~
P
C
7
PC7
PC7,用于
8255
8255
8255 向外设输入输出 8 位并行数据。
控制器部分:
8255 8255 8255 将 3 个通道分为两组,即 P A 0 PA0 PA0~ P A 7 PA7 PA7 与 P C 4 PC4 PC4 ~ P C 7 PC7 PC7 组成 A A A 组, P B 0 PB0 PB0~ P B 7 PB7 PB7 与 P C 0 PC0 PC0~ P C 3 PC3 PC3 组成 B B B 组。
- A A A 组控制器:控制 A A A 口与上 C C C 口的输入与输出。
- B B B 组控制器:控制 B B B 口与下 C C C 口的输入与输出。
8255 三种工作方式
8255 8255 8255 可编程外围接口芯片是 I n t e l Intel Intel 公司生产的通用并行 I / O I/O I/O 接口芯片,它具有 A A A、 B B B、 C C C 三个 8 位的并行输入/输出接口,用 + 5 V +5V +5V 单电源供电,能在以下三种方式下工作:
- 方式 0 0 0:基本输入/输出方式;
- 这种方式下, A A A、 B B B、 C C C 端口都可以设定为输入或输出,各端口的输入/输出可以构成 16 种组合。
- 这种方式适用于 无条件或查询方式的数据传送。
- 方式 1 1 1:选通输入/输出方式。
- 这种方式下, A A A、 B B B 端口可以作为数据端口, C C C 端口的一部分可以作为控制和状态信号端口。
- 这种方式适用于 中断控制方式的数据传送。
- 方式 2 2 2:双向传送方式。
- 这种方式下,只有 A A A 端口可以工作在这种方式,它可以实现双向的数据传送,即既能发送数据也能接收数据。 C C C 端口的一部分也用作控制和状态信号端口。
- 这种方式 适用于中断控制方式,并通过时序控制数据的输入/输出。
8255 控制字
8255 8255 8255 并行接口芯片的 工作方式 由 控制字 来确定,控制字是由 C P U CPU CPU 写入 8255 8255 8255 的控制寄存器中的一个字节。
控制字有两种格式,
- 一种是用来 选择工作方式和 I/O 方向的方式选择控制字,写入的地址是 8255 8255 8255 控制口的地址( A 1 A 0 = 11 A1A0=11 A1A0=11)。
- 另一种是用来 单独对端口 C C C 的每一位进行置位或复位操作的置位/复位控制字。
实验步骤
(1)关闭实验箱电源。
(2)实验接线如图3-1-4 所示,按图连接实验线路。
(3)编写实验程序,经编译、链接无误后装入系统。
(4)运行程序,拨动开关,同时观察 L E D LED LED 显示,验证程序功能。
关于系统总线的 X A 1 XA1 XA1、 X A 2 XA2 XA2 连接 8255 8255 8255 的 A 0 A0 A0、 A 1 A1 A1:
- 系统总线的 X A 1 XA1 XA1 和 X A 2 XA2 XA2 接口是 系统总线的地址选择线,用来 选择系统总线上的不同设备或芯片。
- 8255 8255 8255 并行接口芯片的 A 0 A0 A0 和 A 1 A1 A1 接口是 8255 8255 8255 的 地址选择线,用来 选择 8255 8255 8255 的 P A PA PA 口、 P B PB PB 口、 P C PC PC 口和控制寄存器。
当使用 8255 8255 8255 并行接口芯片时,需要将系统总线的 X A 1 XA1 XA1 和 X A 2 XA2 XA2 接口与 8255 8255 8255 的 A 0 A0 A0 和 A 1 A1 A1 接口相连,从而 实现系统总线和 8255 8255 8255 并行接口芯片之间的地址匹配和数据传输。
具体来说,当系统总线上的某个设备(如 C P U CPU CPU)要访问 8255 8255 8255 并行接口芯片时,它 需要在系统总线上发出一个地址信号,这个地址信号的:
- 最低两位( X A 1 XA1 XA1 和 X A 2 XA2 XA2)用来确定要访问的是 8255 8255 8255 并行接口芯片的哪个端口( P A PA PA 口、 P B PB PB 口、 P C PC PC 口或控制寄存器),
- 而其他位用来确定要访问的是哪个 8255 8255 8255 并行接口芯片(因为可能有多个 8255 8255 8255 并行接口芯片连接在系统总线上)。
这时,系统总线上的 X A 1 XA1 XA1 和 X A 2 XA2 XA2 信号会传递给 8255 8255 8255 并行接口芯片的 A 0 A0 A0 和 A 1 A1 A1 接口,从而使得 8255 8255 8255 并行接口芯片能够识别出自己是否被选中,以及被选中后要访问的是哪个端口。
【举个例子】
EQU CONTROL 0646H
MOV AL,090H ;方式字
MOV DX,CONTROL ;找到8255控制口的地址
OUT DX,AL ;方式字送控制口
- 首先,
MOV AL,090H
这条指令是将090H
这个方式字存入 A L AL AL 寄存器中,这个方式字是用来设置 8255 8255 8255 的工作方式的。 - 然后,
MOV DX,CONTROL
这条指令是将CONTROL
这个常量存入 D X DX DX 寄存器中,这个常量是 8255 8255 8255 的控制寄存器的地址,本实验中它是0646H
。 - 最后,
OUT DX,AL
这条指令是将 A L AL AL 寄存器中的数据(即090H
)送到 D X DX DX 寄存器中的地址(即0646H
)对应的 I / O I/O I/O 设备(即 8255 8255 8255)上。
那么,OUT DX,AL
这条指令是怎么实现的呢?
- 首先,
C
P
U
CPU
CPU 会将
D
X
DX
DX 寄存器中的内容(即
0646H
)送到地址总线上,同时将 A L AL AL 寄存器中的内容(即090H
)送到数据总线上。 - 然后,系统总线的译码器来识别这个
I
/
O
I/O
I/O 地址(
0646H
),并产生相应的信号来选择相应的 I / O I/O I/O 设备。 - 按照
8255
8255
8255 标准配置,这里当系统总线上发出地址信号时,译码器会根据地址信号的高位来产生一个
C
S
CS
CS 信号,用来选择哪一个
8255
8255
8255;同时,地址信号的低两位会直接作为
XA1=1
和XA2=1
的信号,用来选择控制寄存器。
【WARNING】
- 这里 0646 H 0646H 0646H 的低两位是 X A 1 = 0 XA1=0 XA1=0 和 X A 2 = 1 XA2=1 XA2=1,这样会使 A 0 = 0 A0=0 A0=0 和 A 1 = 1 A1=1 A1=1,导致选通的是 P B PB PB 而不是控制端口,使得控制字传输到 B B B 口而非控制端口,这就会出错;
- 可是实验指导书和实验结果都证明是没错的,可能的原因,我猜是因为唐都实验箱的配置和 8255 8255 8255 并行接口芯片的标准配置不同。唐都实验箱可能对 8255 8255 8255 并行接口芯片进行了一些修改,使得它的控制寄存器的地址不是
0646H
,而是其他的地址(最低两位是 1,满足A1=1
、A0=1
的条件从而选通控制口)。
连线参考图(注,本实验中 C S CS CS 连接 I O Y 1 IOY1 IOY1):
实验代码
;8255并行接口实验----总结四句话
;1. 送控制口方式字
;2. A口输入
;3. B口输出
;4. 注意输入输出中间加延迟
PORTA EQU 0640H ;input ,为什么是0640H,见代码解释2
PORTB EQU 0642H ;output
CONTROL EQU 0646H
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,090H ;方式字,见代码解释1
MOV DX,CONTROL ;找到8255控制口的地址
OUT DX,AL ;方式字送控制口
P:
MOV DX,PORTA ;找到8255的输入口A口
IN AL,DX ;读入A口信号
;调用子程序 起延时作用
;因为一个脉冲很短,但是灯的亮与不亮有时间间隔,需要延迟时间 !!!
CALL DELAY
MOV DX,PORTB ;找到8255的输出口B口
OUT DX,AL ;送给B口信号让D0-D7控制数据灯的亮灭
JMP P
DELAY:
PUSH CX
MOV CX, 0F00H
AA2:
PUSH AX
POP AX
LOOP AA2
POP CX
RET
CODE ENDS
END START
关于代码的解释
- 由题目,基本输入输出程序,就是选择
8255
8255
8255 的方式
0
0
0,
8255
8255
8255 的
A
A
A 口为输入,
B
B
B 口为输出,因此方式字是
10010000
B
10010000B
10010000B 即
90
H
90H
90H。
拨动开关控制数据灯的显示,这里说明我们 读进来的是开关信号,输出到数据灯进行显示。所以 8255 8255 8255 的 A A A 口 P A 0 − P A 7 PA0-PA7 PA0−PA7 连接开关及 L E D LED LED 显示单元的 K 0 − K 7 K0-K7 K0−K7 , 8255 8255 8255 的 B B B 口 P B 0 − P B 7 PB0-PB7 PB0−PB7 连接 D 0 − D 7 D0-D7 D0−D7 ,如下图所示:
2. 由表3-1-1已经知道,
8255
8255
8255 实验控制端口地址,但是为什么端口地址是这个呢? 这与
C
S
CS
CS 片选地址连接的
I
O
Y
IOY
IOY 有关。
- C S CS CS 连接 I O Y 0 IOY0 IOY0 ,那么地址从 0600 H 0600H 0600H 开始, P A PA PA 口端口地址是 0600 H 0600H 0600H, P B PB PB 口端口地址是 0602 H 0602H 0602H, P C PC PC 口端口地址是 0604 H 0604H 0604H, C O N T R O L CONTROL CONTROL 控制口的端口地址是 0606 H 0606H 0606H。
- C S CS CS 连接 I O Y 1 IOY1 IOY1,那么地址从 0640 H 0640H 0640H 开始到 0646 H 0646H 0646H,就是本实验中所采用的。
- C S CS CS 连接 I O Y 2 IOY2 IOY2 ,那么地址从 0680 H 0680H 0680H 开始到 0686 H 0686H 0686H。
根据下图中 系统总线的 I O Y 1 IOY1 IOY1 和 8255 8255 8255 单元的 C S CS CS 接线可知, P A PA PA 口端口地址为 0640 H 0640H 0640H, P B PB PB 口端口地址为 0642 H 0642H 0642H, C O N T R O L CONTROL CONTROL 控制口端口地址为 0606 H 0606H 0606H。
3.
8255
8255
8255 的 初始化,如下:
- 方式字送控制口,程序段:
MOV AL,090H ;方式字
MOV DX,CONTROL ;找到8255控制口的地址
OUT DX,AL ;方式字送控制口
- 输入输出口,程序段:
MOV DX,PORTA ;找到8255的输入口A口
IN AL,DX ;读入A口信号
CALL DELAY
MOV DX,PORTB ;找到8255的输出口B口
OUT DX,AL ;送给B口信号让D0-D7控制数据灯的亮灭
- 出入是对于接口而言,比如
IN
即 从接口进来,方向是从接口 P O R T A PORTA PORTA 到内部的寄存器 A L AL AL 。汇编中IN
语句的数据传送方向是从右到左,即 D X DX DX 传送到 A L AL AL。
MOV DX,PORTA ;找到8255的输入口A口
IN AL,DX ;读入A口信号
OUT
即 从接口出去,方向是从内部的寄存器
A
L
AL
AL 到外部接口
P
O
R
T
B
PORTB
PORTB。汇编中 OUT
语句的数据传送方向也是从右到左,即
A
L
AL
AL 传送到
D
X
DX
DX。
MOV DX,PORTB ;找到8255的输出口B口
OUT DX,AL ;送给B口信号让D0-D7控制数据灯的亮灭
- 注意这里,如果端口地址是
8
b
i
t
8bit
8bit,可以直接输出到这个端口地址而不用先把端口地址送到
D
X
DX
DX,但是 如果端口地址是
16
b
i
t
16bit
16bit,如本实验中
8255
8255
8255 的端口地址均为
16
b
i
t
16bit
16bit,那么必须先把端口地址送到
D
X
DX
DX,再进行
IN
和OUT
操作。
下面举例一个 8 b i t 8bit 8bit 端口地址 60 H 60H 60H,
MOV AL,80H ;1000 0000B,是LED7亮,其他灯灭
OUT 60H,AL ;A口地址为60H,且为输出口,把控制灯亮灭的信号送A口输出
本实验中,读开关信号,控制数据灯亮灭,所以 A A A 口连接的开关信号 K 0 − K 7 K0-K7 K0−K7 就是输入口, B B B 口连接的数据灯亮灭的 D 0 − D 7 D0-D7 D0−D7 就是输出口,假如 A A A 口读进来的开关信号全是高电平 11111111 B 1111 1111B 11111111B,即开关全打开,那么数据灯就全亮。
扩展实验一
实验题目
在基础实验上增加如下功能:
若开关
K
7
K7
K7~
K
0
K0
K0 均为高电平,则程序退出。
实验代码
PORTA EQU 0640H ;input
PORTB EQU 0642H ;output
CONTROL EQU 0646H
CODE SEGMENT 'CODE'
ASSUME CS:CODE
START:
MOV AL,90H ;方式字,A口输入B口输出
MOV DX,CONTROL
OUT DX,AL ;初始化8255控制字
BEGIN:
MOV DX,0640H ;A口输入开关信号
IN AL,DX
MOV DX,0642H ;B口输出数据灯亮灭信号
OUT DX,AL
CMP AL,0FFH ;1111 1111B ,K7-K0均为高电平,比较AL和0FFH相等时跳转到EXIT
JZ EXIT
JMP BEGIN
EXIT:
MOV AL,00H ;关所有灯
MOV DX,0642H
OUT DX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
关键代码段解读
CMP AL,0FFH ;1111 1111B ,K7-K0均为高电平,比较AL和0FFH相等时跳转到EXIT
JZ EXIT
JMP BEGIN
- 这里展示了如何用汇编语言表示
if-else
,通过CMP
语句对 A L AL AL 和 0 F F H 0FFH 0FFH 进行比较,这条语句不会改变 A L AL AL 的值,但是把 A L AL AL 和 0 F F H 0FFH 0FFH 相减(比较是用相减结果是否为零来看是否相同的),如果结果为 0 0 0 会影响标志位 Z F = 1 ZF=1 ZF=1( Z F ZF ZF 是零标志位, Z F ZF ZF 的值为 1 1 1 时代表结果全零,反之不全为 0 0 0)。 JZ
则是 Z F = 1 ZF=1 ZF=1 时跳转,这里即CMP
比较的两者相等时跳转到其后的EXIT
,否则继续BEGIN
循环。因为CMP
比较结果会影响标志位 Z F ZF ZF,比较的两者相等时, Z F = 1 ZF = 1 ZF=1,JZ
跳转。
扩展实验二
实验题目
编写程序实现如下功能:
当
K
0
K0
K0 为高电平时,数据灯高
4
4
4 位亮;
当
K
0
K0
K0 为低电平时,数据灯低
4
4
4 位亮。
实验代码
PORTA EQU 0640H ;input
PORTB EQU 0642H ;output
CONTROL EQU 0646H
CODE SEGMENT 'CODE'
ASSUME CS:CODE
START:
MOV AL,90H ;方式字,A口输入B口输出
MOV DX,CONTROL
OUT DX,AL ;初始化8255控制字
HIGH:
MOV DX,0640H
IN AL,DX
AND AL,00000001B ;只保留K0其他位归零
CMP AL,00H ;K0为0时跳转到LOW 让低4位数据灯亮
JZ LOW
MOV AL,0F0H ;K0为1时让高4位数据灯亮
MOV DX,0642H
OUT DX,AL
JMP HIGH
LOW:
MOV AL,0FH ;K0为低电平,数据灯低4位亮
MOV DX,0642H
OUT DX,AL
JMP HIGH
MOV AH,4CH
INT 21H
CODE ENDS
END START
关键代码解读
AND AL,00000001B ;只保留K0其他位归零
CMP AL,00H ;K0为0时跳转到LOW 让低4位数据灯亮
JZ LOW
- 这里只需要保留 K 0 K0 K0 位即可,由 K 0 K0 K0 位的值来控制数据灯的亮灭,因此让读进来的 A L AL AL 与 01 H 01H 01H 相与即可得到 K 0 K0 K0 的值。
- 再
CMP
比较 A L AL AL 和 00 H 00H 00H,如果相等,说明 K 0 K0 K0 是 0 0 0,否则 K 0 K0 K0 是 1 1 1。 - 再根据 K 0 K0 K0 高电平时点亮数据灯高 4 4 4 位,就送 B B B 口 0 F 0 H 0F0H 0F0H 信号; K 0 K0 K0 低电平时点亮数据灯低 4 4 4 位,就送 B B B 口 0 F H 0FH 0FH 信号。
扩展实验三
实验题目
编写程序实现如下功能:
当
K
1
K
0
=
00
K1K0=00
K1K0=00 时,数据灯全部熄灭;当
K
1
K
0
=
01
K1K0=01
K1K0=01 时,数据灯低
4
4
4 位亮;
当
K
1
K
0
=
10
K1K0=10
K1K0=10 时,数据灯高
4
4
4 位亮;当
K
1
K
0
=
11
K1K0=11
K1K0=11 时,数据灯全亮。
实验代码
PORTA EQU 0640H ;input
PORTB EQU 0642H ;output
CONTROL EQU 0646H
CODE SEGMENT 'CODE'
ASSUME CS:CODE
START:
MOV AL,90H ;方式字,A口输入B口输出
MOV DX,CONTROL
OUT DX,AL ;初始化8255控制字
A:
MOV DX,PORTA
IN AL,DX
AND AL,03H ;只保留K1K0其他位归零
CMP AL,00H ;K1K0为00时跳转
JZ A00
CMP AL,01H ;K1K0为01时跳转
JZ A01
CMP AL,02H ;K1K0为10时跳转
JZ A10
CMP AL,03H ;K1K0为11时跳转
JZ A11
A00:
MOV AL,00H ;全熄灭
MOV DX,PORTB
OUT DX,AL
JMP A
A01:
MOV AL,0FH ;低四位亮
MOV DX,PORTB
OUT DX,AL
JMP A
A10:
MOV AL,0F0H ;高四位亮
MOV DX,PORTB
OUT DX,AL
JMP A
A11:
MOV AL,0FFH ;全亮
MOV DX,PORTB
OUT DX,AL
JMP A
B: MOV AL,0FH
MOV DX,PORTB
OUT DX,AL
JMP A
MOV AH,4CH
INT 21H
CODE ENDS
END START
关键代码解读
AND AL,03H ;只保留K1K0其他位归零
CMP AL,00H ;K1K0为00时跳转
JZ A00
CMP AL,01H ;K1K0为01时跳转
JZ A01
CMP AL,02H ;K1K0为10时跳转
JZ A10
CMP AL,03H ;K1K0为11时跳转
JZ A11
- 这里只需要保留 K 1 K 0 K1K0 K1K0 位即可,由 K 1 K 0 K1K0 K1K0 位的值来控制数据灯的亮灭,因此让读进来的 A L AL AL 与 03 H 03H 03H 相与即可得到 K 1 K 0 K1K0 K1K0 的值。
- 再
CMP
分别比较 A L AL AL 和 00 H 00H 00H, 01 H 01H 01H, 02 H 02H 02H, 03 H 03H 03H,如果相等,就跳转到各自的部分去执行,送 B B B 口相应信号点亮相应的数据灯。
留言板
2024/11/14日,收到一条评论,
感动到了哇,我也感谢你来报喜!祝贺你~
我猜,这位一定也是今天考试顺利拿优了吧?
哈哈哈~ 你 Happy 我也 Happy,祝贺你~