✅ 通过对 【计算机与UNIX汇编原理 ① ~ ⑫】的学习,我们已经大致掌握了汇编程序设计的相关知识
接下来,我将其分栏名改为 【计算机原理与接口技术(UNIX) 】,重点将放在 “计算机原理与接口技术” 上
文章目录
通信的英文:Communication
上一篇文章链接:【计算机原理与接口技术(UNIX)⑰】——微型计算机系统的串行通信 [ 8250 + 具体样例 + 上机实验].
下一篇文章链接:【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计].
一、本章导语
● 本文脉络:
① 首先会介绍可编程并行输入输出芯片 8255A 的内部结构、外部引脚、控制字和3
种工作方式。
② 其次讲初始化编程与应用编程(LED + 打印机)。
● 本文重点内容:
① 8255A 芯片内部有3
个8
位的输入输出端口。(即 A 口、B 口和 C 口)
② 8255A 的端口编址与读写操作。
③ 8255A 的控制字。(即 “方式控制字” 和 “C 口按置0
/按位置1
控制字”)
④ 8255A 的3
种工作方式。
[1] 方式 0 —— 基本型输入输出方式(包括其工作过程)
[2] 方式 1 —— 选通型输入输出方式(包括其工作过程和对应的联络信号) ⭐️⭐️
[3] 方式 2 —— 双向数据传输方式
⑤ 8255A 的各数据口的工作方式。
⑥ 8255A 的初始化编程与应用编程。
● 并行通信:同时将数据的所有位进行传输,传输速度比串行通信快。但是,因为其硬件开销大,系统费用高,不适用于远距离数据传输。
● 8255A 是微型计算机系统中应用最广的可编程并行接口芯片之一,具有40
条引脚,使用单一+5V
电源,实物图如下:
二、8255A 的内部结构与外部引脚
● 8255A 的内部结构如下图所示:【简单看看就行,有兴趣的话,可以数数里面刚好38
个引脚,还有两个是电源和接地线】
◆ 对上图的说明:
① 24
根端口数据线 —— 接外设
[1] PA7 ~ PA0 为 A (端)口数据线
[2] PB7 ~ PB0 为 B (端)口数据线
[3] PC7 ~ PC0 为 C (端)口数据线
② 8
根系统数据线 —— 接 CPU 的 D7 ~ D0
③ 6
根输入控制线
[1] RESET:复位信号,RESET = 1 时,8255 内部复位,所有内部寄存器清零,A、B、C 三个端口自动为输入端口
[2]
C
S
‾
\overline{CS}
CS:片选信号,CS = 0 时,该芯片被选中
[3]
R
D
‾
\overline{RD}
RD:来自 CPU 的 I/O 读命令
[4]
W
R
‾
\overline{WR}
WR:来自 CPU 的 I/O 写命令
[5] A1、A0:通常接 CPU 的地址线 A1、A0。
④ 电源线:+5V,地线
⑤ 端口:8255A 有4
个端口寄存器 —— 接口电路中能和 CPU 直接交换信息的寄存器。【即上图中的最右边 4 个方框】
● 8255A 端口编址与读写操作:A1、A0 是端口选择信号,当 C S ‾ \overline{CS} CS 有效时,即可根据 A1、A0 的组合来选择 8255A 的端口数据寄存器和控制寄存器。其操作表如下:
◆ 补充说明:
① A 数据口地址 = 60H
② B 数据口地址 = 61H
③ C 数据口地址 = 62H
④ 控制口地址 = 63H
三、8255A 控制字
● 8255A 有 2 个控制字:“方式选择控制字” 和 “C 口按位置0
/置1
命令字”。
● 两个控制字共用一个端口地址,用的是特征位 D7 来区分。若 D7 = 1,则该控制字为方式控制字,若 D7 = 0,就是后面一种。需注意的是,控制字必须写入控制寄存器才能有效。
3.1 方式控制字
● 该方式控制字的格式:由8
bit位构成,每一位(或两位)的0
/1
指向一个功能选项。如下图所示:
◆ 对上图的说明:
① 该控制字只能确定 A 口和 B 口的工作方式。
② C 口分为两部分组成:
[1] C 口的高4
位 PC7 ~ PC4 随 A 口,构成 A 组。
[2] C 口的低4
位 PC3 ~ PC0 随 B 口,构成 B 组。
③ 对于 A、B 口而言,设定的工作方式是以8
位为一个整体而进行的。而 C 口的高4
位和低4
位可以不同(即分别选择不同的输入输出方式)。
3.2 C口按位置0/1的控制字
● 该方式控制字的格式:也由8
bit位构成,每一位(或三位)的0
/1
指向一个功能选项。如下图所示:
◆ 对上图的说明:
① D3 ~ D1 位只用于设置 C 口某一位 PCi(i = 0 ~ 7) 输出为低电平(复位),还是高电平(置位),这个需配合 D0 位。而对各端口的工作方式没有影响。
② 该控制字尽管是对 C 口进行操作,但该控制字必须写入控制口(即控制寄存器),而不是写入 C 口。
● 举个栗子:若 A 口工作于方式 1 输入,且用中断传送方式,控制寄存器口地址为 63H,则应当写入 C 口的按位置 0 /置 1 控制字如下:
MOV AL, 00001001B ; 00001001B = 0 000 100 1 B ; 为什么 100 有这个功能, 后面 4.2.1 会学到(记住 PC4, 到时候回来看即可)
OUT 63H, AL
四、8255A 的工作方式
● 8255A 有3
种工作方式:【类似于,DJ奥特曼有3
种战斗状态,侧重点不同】
① 方式 0:基本型输入输出方式
② 方式 1:选通型输入输出方式
③ 方式 2:双向数据传输方式
◆ 补充说明:
① A 口可以工作在方式 0、方式 1、方式 2。
② B 口可以工作在方式 0、方式 1,但不能工作在后一个
③ C 口可以工作在方式 0,但不能工作在后两个。
4.1 方式 0
● 方式 0 是基本型输入输出方式,即无条件输入输出方式。这时,端口与外设之间不需要联络信号。A 口、B 口、C 口可由方式控制字规定为输入或输出。
● 方式 0 的输入时序:当 CPU 对端口执行条输入指令时,
C
S
‾
\overline{CS}
CS、A1、A0 有效,8255A 被选中,随后
R
D
‾
\overline{RD}
RD 信号有效,开始读取端口数据。再经 tRD 时间延迟,端口数据被送到系统数据总线上,即完成一次输入操作。【看着种图,头老大了。大概知道啥样子,能认出来是 “方式0
的输入” 做选择题就OK】
● 注意:为了防止读出的数据出错,
R
D
‾
\overline{RD}
RD 有效期间应保持地址信号有效,端口数据应保持到读信号结束后才能消失,读脉冲的宽度不小于300ns
。
● 方式 0 的输出时序:当 CPU 对端口执行一条输出指令时,
C
S
‾
\overline{CS}
CS、A1、A0 有效,且待输出的数据在系统总线上。在等到
W
R
‾
\overline{WR}
WR 信号结束后,最长经过 tWB,端口数据线上就会出现有效数据,
W
R
‾
\overline{WR}
WR 的宽度至少为400ns
,CPU 写入的数据在整个写操作期间要保持有效,当
W
R
‾
\overline{WR}
WR 结束后,还需至少保持 tWD = 30ns
。【大概知道啥样子,能认出来是 “方式0
的输出” 做选择题就OK】
4.2 方式 1 ⭐️⭐️
● 方式 1 为选通型输入输出方式。8255A 在选择这种工作方式时,端口和外设之间必须有联络线,CPU 和 8255A 可以用查询方式或中断方式来交换信息。
4.2.1 A 口的方式 1
● 当 8255A 的 A 口工作在方式 1 并开始输入时,对应的联络信号如下图所示:【当方式字 = B0H
(1011 0000B,刚好就是图中的控制字)写入控制口之后,A 口即工作在选通型输入】
◆ 对上图的说明:【PC4、PC5 即为刚才说的联络线】
① PA7 ~ PA0 即为数据输入线。
② PC4 自动定义为 “输入”,称为
S
T
B
A
‾
\overline{STB_A}
STBA
③ PC5 自动定义为 “输出”,称为 IBFA
④ PC3 自动定义为中断请求输出线,称为 INTRA。
⑤ PC5、PC4、PC3 不受方式选择控制字的控制。
⑥ PC7、PC6 空闲。
● 端口联络线的功能如下:【PC4、PC5】
①
S
T
B
A
‾
\overline{STB_A}
STBA:输入选通信号,低电平有效,由外设发往 8255A。
S
T
B
A
‾
\overline{STB_A}
STBA 有效时,外设数据可写入相应端口的输入缓冲器中。
②
I
B
F
A
IBF_A
IBFA:输入缓冲器满,高电平有效,由 8255A 发往外设。(工作原理:当
S
T
B
A
‾
\overline{STB_A}
STBA 变低位时,触发使得 IBF = 1,这时会通知输入设备,8255A 已经收到数据,暂时不要输入下一个数据进来。CPU 在采用查询方式从 8255A 读取数据之前,会查询 IBF,只有当 IBF = 1时,CPU 才能从 A 口或 B 口读取输入数据。当 CPU 读操作完成时,恢复使得 IBF = 0,表示输入缓冲器为空)
③ INTEA:A 口的中断允许触发器,受 C 口置0
/置1
命令字控制,当 PC4 = 1 时,表示 A 口允许中断。【这里的 PC4 就是前面 3.2 样例里面提到的那个】
④ INTR:中断请求信号,高电平有效。在中断允许的前提下(INTEA = 1),8255A 将会在接收到一个端口数据(IBF = 1),向 CPU 发出中断请求。
注意:中断允许触发器只能受 CPU 控制,外设信号 STBA 不能使其置 0/1。
● 方式 1 的输入时序,如下所示:【大概知道啥样子,能认出来是 “方式1
的输入” 做选择题就OK】
◆ 对上图的说明:
① 输入时序是从外设输入数据并发出
S
T
B
‾
\overline{STB}
STB 有效信号(即低电平)时开始。
② 在
S
T
B
‾
\overline{STB}
STB 出现下降沿后,经过约 tSIB 时间,8255A 接收到数据,IBF 紧接着变为高电平,表示输入缓冲器满。
③ 当
S
T
B
‾
\overline{STB}
STB 再次变为高电平后,如果中断允许(INTF = 1),则在
S
T
B
‾
\overline{STB}
STB 出现上升沿并在经过 tSIT 时间后 INTR 将会有效(出现高电平),进而向 CPU 发出中断请求。
④ CPU 在响应中断后,将用IN
指令读取数据,产生
R
D
‾
\overline{RD}
RD 信号(低电平)。
⑤
R
D
‾
\overline{RD}
RD 信号在变低后 tRIT 时间后,INTR 将会变得无效(低电平),即撤销本次中断请求。
⑥ 然后在
R
D
‾
\overline{RD}
RD 信号出现上升沿并在经过 tRIB 时间后,IBF 变为低电平,表示输入缓冲器为空,并通知外设现在可向 CPU 传送数据,从而结束一次方式 1 的输入过程。
● 注意:当用方式 1 输入时,CPU 与 8255 信息交换时,可以用中断方式和查询方式。用查询方式时,记得输入查询应查询 IBF,不应该查询 STB。(因为 STB 脉冲是外设送来,它最小可小到500ns
,而在500ns
的时间内正好运行 CPU 的查询指令是不可能的)【做工程实践时需要很留意这些小细节,我们得知一下就OK】
● 当 8255A 的 A 口工作在方式 1 并开始输出时,对应的联络信号如下图所示:【当方式字 = A0H
写入控制口之后,A 口即工作在选通型输出方式】
◆ 对上图的说明:【PC6、PC7 为一对联络线】
① PA7 ~ PA0 为输出数据线。
② PC6 自动定义为输入线,称为
A
C
K
A
‾
\overline{ACK_A}
ACKA
③ PC7 自动定义为输出线,称为
O
B
F
A
‾
\overline{OBF_A}
OBFA
④ PC3 自动定义为中断请求输出线,称为 INTRA。
⑤ PC7、PC6、PC3 不受方式选择控制字的控制。
⑥ PC5、PC4 空闲。
● 端口联络线的功能如下:【PC7、PC6】
①
A
C
K
A
‾
\overline{ACK_A}
ACKA:外设的应答信号,低电平有效,由外设发往 8255A。该信号是由接收数据的外设对
O
B
F
A
‾
\overline{OBF_A}
OBFA 的应答信号。(8255A 规定:外设取走端口数据后,必须向
A
C
K
A
‾
\overline{ACK_A}
ACKA 端子发送脉宽大于300ns
的负脉冲。该脉冲能使
O
B
F
A
‾
\overline{OBF_A}
OBFA = 1)
②
O
B
F
A
‾
\overline{OBF_A}
OBFA:输出缓冲器满,低电平有效,由 8255A 发往外设。
O
B
F
A
‾
\overline{OBF_A}
OBFA 有效时,表示 CPU 已将输出数据写入指定的端口数据寄存器中,当 CPU 用查询方式向 8255A 输出数据时,应先查询它,只有当
O
B
F
A
‾
\overline{OBF_A}
OBFA = 1 时,CPU 才能输出下一个数据。
③ INTEA:A 口的中断允许触发器,受 C 口置0
/置1
命令字控制,当 PC6 = 1 时,表示 A 口允许中断。
④ INTR:中断请求信号,高电平有效。在中断允许的前提下(INTEA = 1),当外设取走端口数据之后(
O
B
F
A
‾
\overline{OBF_A}
OBFA = 1 ),向 CPU 发出中断请求。
● 方式 1 的输出时序,如下所示:【大概知道啥样子,能认出来是 “方式1
的输出” 做选择题就OK】
◆ 对上图的说明:【CPU 采用中断方式和 8255A 交换信息时,输出过程是由 CPU 响应中断开始的】
① CPU 响应中断后,将会执行OUT
指令输出数据,此时
W
R
‾
\overline{WR}
WR 信号变为有效(低电平)。
② 一小段时间后,
W
R
‾
\overline{WR}
WR 变为高电平,在它上升沿的过程中,一方面能使中断请求信号 INTR 变为无效(低电平),这表示 CPU 已经响应了中断;另外一方面能使
O
B
F
‾
\overline{OBF}
OBF 信号有效(低电平),表示输出缓冲器满,通知外设可以取走数据。
③ 外设从端口取走数据后,会发出
A
C
K
‾
\overline{ACK}
ACK 应答信号(低电平)。
④ 在
A
C
K
‾
\overline{ACK}
ACK 信号有效后约350ns
时,
O
B
F
‾
\overline{OBF}
OBF 信号变为高电平,表示输出缓冲器空。(注:
A
C
K
‾
\overline{ACK}
ACK 信号的宽度应大于300ns
)
⑤
A
C
K
‾
\overline{ACK}
ACK 信号无效后约350ns
时,INTR 信号变为无效(低电平),并向 CPU 发出中断请求,表示一个新的输出过程可以开始了。
4.2.1 B 口的方式 1
● 当 8255A 的 B 口工作在方式 1 并开始输入时,对应的联络信号如下图所示:【当方式字 =86H
写入控制口之后,B口即工作在选通型输入,】
◆ 对上图的说明:【这时 PC2 和 PC1 为联络线】
① PB7 ~ PB0 即为输入数据线。
② PC2 自动定义为输入线,称为
S
T
B
B
‾
\overline{STB_B}
STBB
③ PC1 自动定义为输出线,称为 IBFB
④ PC0 自动定义为中断请求输出线,称为 INTRB
⑤ PC2、PC1、PC0 不受方式控制字的控制。
● 端口联络线的功能如下:【PC2、PC1】
①
S
T
B
B
‾
\overline{STB_B}
STBB:输入选通信号,低电平有效,由外设发往 8255A。
S
T
B
B
‾
\overline{STB_B}
STBB 有效时,外设数据可写入相应端口的输入缓冲器中。
②
I
B
F
B
IBF_B
IBFB:输入缓冲器满,高电平有效,由 8255A 发往外设。(工作原理:当
S
T
B
B
‾
\overline{STB_B}
STBB 变低位时,触发使得 IBF = 1,这时会通知输入设备,8255A 已经收到数据,暂时不要输入下一个数据进来。CPU 在采用查询方式从 8255A 读取数据之前,会查询 IBF,只有当 IBF = 1时,CPU 才能从 A 口或 B 口读取输入数据。当 CPU 读操作完成时,恢复使得 IBF = 0,表示输入缓冲器为空)
③ INTEB:B 口的中断允许触发器,受 C 口置0
/置1
命令字控制,当 PC2 = 1 时,表示 B 口允许中断。
④ INTR:中断请求信号,高电平有效。在中断允许的前提下(INTEB = 1),8255A 将会在接收到一个端口数据(IBF = 1),向 CPU 发出中断请求。
● B 口的方式 1 的输入时序,和 A 口的相同。
● 当 8255A 的 A 口工作在方式 1 并开始输出时,对应的联络信号如下图所示:【当方式字 = 84H
(1000 0100B,刚好就是图中的控制字)写入控制口之后,A 口即工作在选通型输出方式】
◆ 对上图的说明:【PC1、PC2 为一对联络线】
① PB7 ~ PB0 为输出数据线。
② PC2 自动定义为输入线,称为
A
C
K
B
‾
\overline{ACK_B}
ACKB
③ PC1 自动定义为输出线,称为
O
B
F
B
‾
\overline{OBF_B}
OBFB
④ PC0 自动定义为中断请求输出线,称为 INTRB。
⑤ PC2、PC1、PC0 不受方式选择控制字的控制。
● 端口联络线的功能如下:【PC2、PC1】
①
A
C
K
B
‾
\overline{ACK_B}
ACKB:外设的应答信号,低电平有效,由外设发往 8255A。该信号是由接收数据的外设对
O
B
F
B
‾
\overline{OBF_B}
OBFB 的应答信号。(8255A 规定:外设取走端口数据后,必须向
A
C
K
B
‾
\overline{ACK_B}
ACKB 端子发送脉宽大于300ns
的负脉冲。该脉冲能使
O
B
F
B
‾
\overline{OBF_B}
OBFB = 1)
②
O
B
F
B
‾
\overline{OBF_B}
OBFB:输出缓冲器满,低电平有效,由 8255A 发往外设。
O
B
F
B
‾
\overline{OBF_B}
OBFB 有效时,表示 CPU 已将输出数据写入指定的端口数据寄存器中,当 CPU 用查询方式向 8255A 输出数据时,应先查询它,只有当
O
B
F
B
‾
\overline{OBF_B}
OBFB = 1 时,CPU 才能输出下一个数据。
③ INTEB:B 口的中断允许触发器,受 C 口置0
/置1
命令字控制,当 PC2 = 1 时,表示 B 口允许中断。
④ INTR:中断请求信号,高电平有效。在中断允许的前提下(INTEB = 1),当外设取走端口数据之后(
O
B
F
B
‾
\overline{OBF_B}
OBFB = 1 ),向 CPU 发出中断请求。
● B 口方式 1 的输出时序,和 A 口的相同。
4.3 方式 2
● 方式 2 为双向数据传输方式,只有 A 口可工作在方式 2。
● 当 A 口工作在方式 2(双向方式)时,B 口可以工作在方式 0:基本型 I/O(不需要联络线)。也可以工作在方式 1:选通型 I/O(使用 PC2、PC1、PC0做联络线)
● 8255A 工作在方式 2 时的联络信号图如下:
◆ 对上图的说明:【PC4 和 PC5 为一对输入联络线,PC6 和 PC7 为一对输出联络线,PC3 为中断请求线】
① PA7 ~ PA0 为双向(输入输出)数据线。
② PC4 自动定义为输入线,称为
S
T
B
A
‾
\overline{STB_A}
STBA
③ PC6 也自动定义为输入线,称为
A
C
K
A
‾
\overline{ACK_A}
ACKA
④ PC5 自动定义为输出线,称为
I
B
F
A
IBF_A
IBFA
⑤ PC7 也自动定义为输出线,称为
O
B
F
A
‾
\overline{OBF_A}
OBFA
⑥ PC3 自动定义为中断请求输出线,称为 INTRA。
⑦ PC3、~ PC7 不受方式选择控制字的控制。
⑧ PC2 ~ PC0 空闲。
● 端口联络线的功能如下:【PC3、~ PC7 】
①
S
T
B
A
‾
\overline{STB_A}
STBA:输入选通信号,低电平有效,由外设发往 8255A。
S
T
B
A
‾
\overline{STB_A}
STBA 有效时,外设数据可写入相应端口的输入缓冲器中。
②
A
C
K
A
‾
\overline{ACK_A}
ACKA:外设的应答信号,低电平有效,由外设发往 8255A。该信号是由接收数据的外设对
O
B
F
A
‾
\overline{OBF_A}
OBFA 的应答信号。(8255A 规定:外设取走端口数据后,必须向
A
C
K
A
‾
\overline{ACK_A}
ACKA 端子发送脉宽大于300ns
的负脉冲。该脉冲能使
O
B
F
A
‾
\overline{OBF_A}
OBFA = 1)
③
I
B
F
A
IBF_A
IBFA:输入缓冲器满,高电平有效,由 8255A 发往外设。(工作原理:当
S
T
B
A
‾
\overline{STB_A}
STBA 变低位时,触发使得 IBF = 1,这时会通知输入设备,8255A 已经收到数据,暂时不要输入下一个数据进来。CPU 在采用查询方式从 8255A 读取数据之前,会查询 IBF,只有当 IBF = 1时,CPU 才能从 A 口或 B 口读取输入数据。当 CPU 读操作完成时,恢复使得 IBF = 0,表示输入缓冲器为空)
④
O
B
F
A
‾
\overline{OBF_A}
OBFA:输出缓冲器满,低电平有效,由 8255A 发往外设。
O
B
F
A
‾
\overline{OBF_A}
OBFA 有效时,表示 CPU 已将输出数据写入指定的端口数据寄存器中,当 CPU 用查询方式向 8255A 输出数据时,应先查询它,只有当
O
B
F
A
‾
\overline{OBF_A}
OBFA = 1 时,CPU 才能输出下一个数据。
⑤ INTE1:A 口的 “输出中断允许” 寄存器,受 C 口置0
/置1
命令字控制,当 PC6 = 1 时,表示允许中断。
⑥ INTE2:A 口的 “输入中断允许” 寄存器,受 C 口置0
/置1
命令字控制,当 PC7 = 1 时,表示允许中断。
⑦ INTR:中断请求信号,高电平有效。在中断允许的前提下(INTEA = 1),当外设取走端口数据之后(
O
B
F
A
‾
\overline{OBF_A}
OBFA = 1 ),向 CPU 发出中断请求。
● 方式 2 的工作时序:相当于方式 1 的输入时序和输出时序的组合,如下图所示。【大概知道啥样子,能认出来是 “方式2
的输入输出” 做选择题就OK】
◆ 对上图的说明一:【输出过程】
① CPU 响应中断后,将会执行OUT
指令输出数据,此时
W
R
‾
\overline{WR}
WR 信号变为有效(低电平)。
② 一小段时间后,
W
R
‾
\overline{WR}
WR 变为高电平,在它上升沿的过程中,一方面能使中断请求信号 INTR 变为无效(低电平),这表示 CPU 已经响应了中断;另外一方面能使
O
B
F
‾
\overline{OBF}
OBF 信号有效(低电平),表示输出缓冲器满,通知外设可以取走数据。
③ 外设从端口取走数据后(即经历图中的 tPS),会发出
A
C
K
‾
\overline{ACK}
ACK 应答信号(低电平)。
④ 在
A
C
K
‾
\overline{ACK}
ACK 信号有效后, 会使
O
B
F
‾
\overline{OBF}
OBF 信号复位,表示可以继续输出数据了。
◆ 对上图的说明二:【输入过程】
① 输入时序是从外设输入数据并发出
S
T
B
‾
\overline{STB}
STB 有效信号(即低电平)时开始。
② 在
S
T
B
‾
\overline{STB}
STB 出现下降沿后,经过约 tSIB 时间,8255A 接收到数据,IBF 紧接着变为高电平,表示输入缓冲器满。
③ 当
S
T
B
‾
\overline{STB}
STB 再次变为高电平后,如果中断允许(INTE = 1),则在
S
T
B
‾
\overline{STB}
STB 出现上升沿并在经过 tPH 时间后 INTR 将会有效(出现高电平),进而向 CPU 发出中断请求。
④ CPU 在响应中断后,将用IN
指令读取数据,产生
R
D
‾
\overline{RD}
RD 信号(低电平)。
⑤ 然后在
R
D
‾
\overline{RD}
RD 信号出现上升沿并在经过 tRIB 时间后,IBF 变为低电平,表示输入缓冲器为空,并通知外设现在可向 CPU 传送数据,从而结束一次输入过程。
五、8255A 的初始化编程
● 8259A 初始化编程的流程:
① 首先把方式选择控制字写入控制口,以确定所用端口的工作方式。
② 如果端口选择为方式 1 或方式 2,还要进一步明确 → CPU 与 8255A 之间是用查询方式还是中断方式交换信息。
③ 明确后,并以此来组织 C 口置 0 还是置 1 控制字,并写入 8255A 控制口。(这会使相应的中断允许标志INTE
置 0 或置 1)
● 样例一:设 8255A 的控制口地址为 21BH,试编写 8255A 的初始化程序。要求 8255A 的 A 口工作在方式 0 进行数据输出;B 口工作在方式 1 进行数据输入;C 口的上半部分进行数据输出,下半部分进行数据输入;并允许 B 口使用中断方式与 CPU 交换信息。
● 初始化程序如下:
MOV DX, 21BH
MOV AL, 10000111B ; 1 00 0 0 1 1 1 → 去查表
OUT DX, AL
MOV AL, 00000101B ; C 口按位置 0/1 控制字。 0 000 010 1 → 查表 → "PC2 置 1"
OUT DX, AL
● 样例二:设 8255A 的端口地址为 80H ~ 83H。8255A 的 3 个端口都工作在方式 0,端口 A 为输入,端口 B 为输出,端口 C 为输出。试对其进行初始化。
● 初始化程序如下:
MOV AL, 90H ; 方式控制字 90H = 1 00 1 0 0 0 0B → 查表
OUT 83H, AL
"上面的两行代码即为答案, 下面的不是答案, 是额外内容"
"写完控制字后, CPU 可以通过 IN/OUT 指令来与 8255A 传送数据:"
IN AL, 80B ; 读端口 A 的数据
OUT 81H, AL ; AL 中数据写入端口 B
OUT 82H, AL ; 写入端口 C
七、8255A 的应用(两个样例:LED + 打印机)
7.1 8255A 控制发光二极管
● 题目:设系统机外扩了一片 8255、以及相应的实验电路,如下图所示。要求:先预置开关 K3 ~ K1 为一组状态,然后按下自复按钮 K 产生一个负脉冲信号输入到 PC4。用发光二极管 LEDi 亮来显示 K3 ~ K1 的状态。主机键盘有任意键按下时结束演示。
● 关于 LED 发光的要求:【K3、K2、K1 闭合时表示为0
,断开时表示为1
】
开关状态 | 对应功能 |
---|---|
K3K2K1 = 000 | LED1 亮 |
K3K2K1 = 001 | LED2 亮 |
K3K2K1 = 010 | LED3 亮 |
K3K2K1 = 011 | LED4 亮 |
K3K2K1 = 100 | LED5 亮 |
K3K2K1 = 101 | LED6 亮 |
K3K2K1 = 110 | LED7 亮 |
K3K2K1 = 111 | LED8 亮 |
① 设计思路 —— 端口地址:【这是我们自己设计的,主要是试验箱上只有这些地址,我们按顺序设计就行】
[1] A口:218H、 21CH
[2] B口:219H、 21DH
[3] C口:21AH、21EH
[4] 控制口:21BH、21FH
② 设计思路 —— 8255A 工作方式的选择:
[1] 当 PC4(即
S
T
B
A
‾
\overline{STB_A}
STBA)接收到负脉冲信号之后,K3 ~ K1的状态信息被锁存到 A 口数据寄存器 PA2 ~ PA0中。
[2] CPU 读取 A 口信息,再根据 PA2 ~ PA0 的状态,输出相应数据到 B 口,使 LEDi 亮。(因此,B 口应为基本型输出, A 口应为选通型输入)
③ 设计思路 —— 8255A 与 CPU 交换信息的方式:
[1] CPU → 8255A 的 B口:无条件输出
[2] 8255A 的 A口 → CPU:
解法①:查询方式(当 PC5 = 1 时,表示 K3 ~ K1 的值已经写入 A 口了)
解法②:中断方式( PC3 接系统 从8259A 的 IR1,按用户中断处理)
● 注:A 口工作在选通型输入时,PC5 成为输入线 IBFA,PC3 成为输出线 INTRA。【如果不太清楚,可以会看前面的 4.2.1 】
● 最终设计图如下:【PAi 为 A 口的三根线——对应三个Ki、PBj 为 B 口的八根线——对应八个LED】
7.2.1 解法一:查询方式
● 设计方案:B 口基本型输出(方式 0),A 口选通型输入(方式 1)。
.486
;-----------------------------------------------
DATA SEGMENT USE16
MESG DB '8255A READY...',0DH,0AH,'$'
TAB DB 11111110B
DB 11111101B
DB 11111011B
DB 11110111B
DB 11101111B
DB 11011111B
DB 10111111B
DB 01111111B
DATA ENDS
;-----------------------------------------------
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
CALL I8255A ; 8255A初始化
MOV AH,9
MOV DX,OFFSET MESG
INT 21H ; 给出操作提示
SCAN:
MOV AH,1
INT 16H ; 有键入 ?
JNZ RETURN ; 有就跳转
MOV DX,21AH
IN AL,DX ; 读 8255A 的 C口
TEST AL,00100000B ; PC5 = 1 ?(即查询 IBF 信号)
JZ SCAN ; 不等于(即 IBF 不为空)就一直查询
; 能执行一下代码说明, IBF 信号有效,说明 A 口已经有数据锁存,这个数据就是开关 K3 到 K1 的状态。
MOV DX,218H ; 或写成 21CH
IN AL,DX ; 读 8255A 的 A口
AND AL,07H
MOV BX,OFFSET TAB
XLAT TAB ; 查表(XLAT指令(Translate)是汇编语言查表指令,英文缩写为XLAT,是一种指令程序。操作是以DS:[BX+AL]为地址,提取存储器中的一个字节再送入AL。)
MOV DX,219H ; 或写成 21DH
OUT DX,AL ; 表项输出到 B 口
JMP SCAN
RETURN:
MOV AH,4CH
INT 21H ; 返回 DOS
;-----------------------------------------------
I8255A PROC
MOV DX,21BH ; 或写成 21FH
MOV AL,0B0H
OUT DX,AL ; 写入工作方式字
MOV AL,08H
OUT DX,AL ; 令 PC4 =0 (即INTE_A = 0)
MOV DX,219H ; B 口
MOV AL,0FFH
OUT DX,AL ; 熄灭LED
RET
I8255A ENDP
;-----------------------------------------------
CODE ENDS
END BEG
● 运行结果:等下周做实验,进行实物拍照补充。
7.1.2 解法二:中断式
● 设计方案:把实验电路 8255A 的 PC3 接 ISA 总线 B4 端子以便向系统机提出用户中断请求(B 口方式 0 输出,A口方式 1 输入,中断方式)
● 代码如下:
.486
;-----------------------------------------------
DATA SEGMENT USE16
MESG DB '8255A READY...',0DH,0AH,'$'
TAB DB 11111110B
DB 11111101B
DB 11111011B
DB 11110111B
DB 11101111B
DB 11011111B
DB 10111111B
DB 01111111B
DATA ENDS
;-----------------------------------------------
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
CLI
CALL I8255A ; 8255A初始化
CALL WRITE0A ; 置换 0AH 型中断向量
CALL I8259 ; 开放用户中断
MOV AH,9
MOV DX,OFFSET MESG
INT 21H ; 给出操作提示
STI ; 开中断
SCAN:
MOV AH,1
INT 16H ; 有键入 ?
JZ SCAN ; 无则转
;--------------
MOV AH, 4CH
INT 21H ; 有返回 DOS
;--------------
SERVICE PROC
PUSH AX ; 为中断服务
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV DX,218H ; 21CH
IN AL,DX ; 读 8255A 的 A 口
AND AL,07H
MOV BX,OFFSET TAB
MOV AH,0
MOV SI,AX
MOV AL,[BX+SI] ; 查表
MOV DX,219H ; 21DH
OUT DX,AL ; 表项输出到B口
MOV AL,20H ; 中断结束命令
OUT 20H,AL ; → 主8259
POP DS
POP AX
IRET ; 中断返回
SERVICE ENDP
;-----------------------------------------------
I8255A PROC
MOV DX,21BH
MOV AL,0B0H
OUT DX,AL ; 写入工作方式字
MOV AL,09H
OUT DX,AL ; PC4 = 1,(即INTE_A=1)
MOV DX,219H
MOV AL,0FFH
OUT DX,AL ; 熄灭LED
RET
I8255A ENDP
;-----------------------------------------------
WRITE0A PROC
PUSH DS
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET SERVICE
MOV AX,250AH
INT 21H
POP DS
RET
WRITE0A ENDP
;-----------------------------------------------
I8259 PROC
IN AL,21H
AND AL,11111011B
OUT 21H,AL
IN AL,0A1H
AND AL,11111101B
OUT 0A1H,AL ; 开放用户中断
RET
I8259 ENDP
;-----------------------------------------------
CODE ENDS
END BEG
● 运行结果:等下周做实验,进行实物拍照补充。
7.2 8255A 与打印机接口
● PC 系列机打印设备的接口是8
位数据线的并行接口,在电路中有3
类端口:【就像我们桌子上的小型打印机,它里面的关键东西,就这些】
① 数据寄存器:暂存 CPU 发来的数据(待打印字符的 ASCII 码)。
② 状态寄存器:提供打印机的当前状态。
③ 控制寄存器:寄存 CPU 写入的控制字从而向打印机发出控制信号。
● 打印机接口信号:
① 数据线:D7 ~ D0。
② 控制线:PC 机输出4
个控制信号(PC机 → 打印机)
[1]
S
T
R
O
B
E
‾
\overline{STROBE}
STROBE:选通信号
[2]
A
U
T
O
F
E
E
D
X
T
‾
\overline{AUTO FEEDXT}
AUTOFEEDXT:自动走纸
[3]
I
N
I
T
‾
\overline{INIT}
INIT:初始化打印机
[4]
S
L
C
T
I
N
‾
\overline{SLCT IN}
SLCTIN:联机信号,允许打印机工作
③ 状态线:输入5个状态信号(打印机 → PC机)
[1] BUSY:忙标志信号
[2]
A
C
K
N
L
G
‾
\overline{ACKNLG}
ACKNLG:打印机的应答信号;
[3] PE:打印机的缺纸信号
[4] SLCT:打印机的选中信号;
[3]
E
R
R
O
R
‾
\overline{ERROR}
ERROR:打印机的出错信号。
● 打印机的时序图:【大概知道啥样子,能认出来就OK】
◆ 对上图的说明:
① 在 BUSY = 0(空闲)时,CPU 执行OUT
指令,输出一个数据。
② CPU 使接口电路发出选通脉冲:
S
T
R
O
B
E
‾
\overline{STROBE}
STROBE = 0,即有效。
③ 打印机收到
S
T
R
O
B
E
‾
\overline{STROBE}
STROBE = 0之后,立即使 BUSY = 1 以示打印机忙
④ 打印机把数据存入内部的数据缓冲器之后,向 PC 机发出应答信号
A
C
K
N
L
G
‾
\overline{ACKNLG}
ACKNLG。
⑤
A
C
K
N
L
G
‾
\overline{ACKNLG}
ACKNLG 有效后,过5us
再使 BUSY = 0,BUSY = 0 后撤销
A
C
K
N
L
G
‾
\overline{ACKNLG}
ACKNLG。
● 实战题目:采用 8255A 的端口 B 工作于选通输出方式,与打印机接口,假设 8255A 的端口地址为80H~83H。【也就是,我们打算用 CPU 接个 8255A,然后把 8255A 接着打印机,准备敲点代码(打印程序)】
● 设计方案:
① PC1 自动为 B 口的 OBF 输出信号。
② PC2 为 B 口 ACK 输入信号。
③ PC0 为 B 口 INTR 输出信号。
④ 另外,通过 PC2 控制 INTEB,决定是否采用中断方式。
⑤ 当 CPU 输出数据时,8255A 产生低有效 OBF 输出信号,它需要一个 ACK 响应信号恢复为高;另一方面,打印机需要一个低脉冲 STROBE 才能接收数据,并反馈一个 ACKNLG 响应信号表示数据接收完毕。因此在 8255A 和打印机接口进行连线时,将 8255A 的 PC1 与打印机中的 STROBE 引脚相连、打印机中的 ACKNLG 引脚与 8255A 中的 PC2 相连,BUSY 引脚与 PC3 相连,如下图所示:
● 题目中端口 B 刚好工作在方式 1 输出,因此不需要查询打印机的工作状态 BUSY 信号。(这是为什么呢?原因就隐藏在打印机工作时序图中,我们已经学习过:因为 BUSY 信号的产生,取决于 STROBE 信号的下降沿
,而 BUSY 信号的撤销,取决于应答信号的上升沿
,完全不需要额外的操作) 【不太清楚为什么要这么说,知道的欢迎评论解答一下】
● 通过读取 C 口的内容(查询 PC2 位,即查询 OBF 信号)就可以查询打印机数据口的状态,从而了解打印机是否已经接收完数据。(对于这个题目,使用查询方式即可)
● 代码如下:
.586
;------------------------------------
DATA SEGMENT USE16
BUF DB 'HELLO', 0AH, 0DH
LENS EQU $-BUF
DATA ENDS
;------------------------------------
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG:
MOV AX, DATA
MOV DS, AX
CALL I8255A ; 8255A 初始化
LEA BX, BUF
MOV CX, LENS
NEXT:
MOV AL, [BX]
INC BX
OUT 81H, AL
SCAN:
IN AL, 82H
TEST AL, 02H ; 通过 PC1 , 查询 OBF(若 OBF = 0,说明 B 口还没有收到打印机应答信号,即上一次的字符打印工作尚未完成。)
JZ SCAN
LOOP NEXT
MOV AH,4CH
INT 21H
;------------------------------------
I8255A PROC
MOV AL, 85H
OUT 83H, AL ; 写方式选择控制字
MOV AL, 04H
OUT 83H, AL ; 写 C 口置位控制字,禁中断
RET
I8255A ENDP
;------------------------------------
CODE ENDS
END BEG
八、参考附录
[1]《微型计算机原理与接口技术(慕课板)》
清华大学出版社
[2]《微型计算机原理与接口技术实验指导(第2版)》
清华大学出版社
上一篇文章链接:【计算机原理与接口技术(UNIX)⑰】——微型计算机系统的串行通信 [ 8250 + 具体样例 + 上机实验].
下一篇文章链接:【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计].
⭐️ ⭐️