【计算机原理与接口技术(UNIX)⑱】——并行 I/O 接口 [ 芯片8255A ]

本文深入探讨了8255A并行接口芯片的工作原理,包括其内部结构、外部引脚、控制字和三种工作方式。详细解析了A口和B口在方式0、方式1以及方式2下的输入输出时序,并提供了8255A在控制LED和打印机接口中的应用实例。此外,还介绍了与打印机接口的连接方案及其工作时序。通过实例代码展示了8255A的初始化编程和数据传输过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


✅ 通过对 【计算机与UNIX汇编原理 ① ~ ⑫】的学习,我们已经大致掌握了汇编程序设计的相关知识

接下来,我将其分栏名改为 【计算机原理与接口技术(UNIX) 】,重点将放在 “计算机原理与接口技术” 上



通信的英文:Communication

上一篇文章链接:【计算机原理与接口技术(UNIX)⑰】——微型计算机系统的串行通信 [ 8250 + 具体样例 + 上机实验].
下一篇文章链接:【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计].


一、本章导语

本文脉络
  ① 首先会介绍可编程并行输入输出芯片 8255A 的内部结构、外部引脚、控制字和3种工作方式。
  ② 其次讲初始化编程与应用编程(LED + 打印机)。

本文重点内容
  ① 8255A 芯片内部有38位的输入输出端口。(即 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 方式控制字

该方式控制字的格式:由8bit位构成,每一位(或两位)的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的控制字

该方式控制字的格式:也由8bit位构成,每一位(或三位)的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 = 000LED1
K3K2K1 = 001LED2
K3K2K1 = 010LED3
K3K2K1 = 011LED4
K3K2K1 = 100LED5
K3K2K1 = 101LED6
K3K2K1 = 110LED7
K3K2K1 = 111LED8



设计思路 —— 端口地址【这是我们自己设计的,主要是试验箱上只有这些地址,我们按顺序设计就行】
  [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工作方式检测程序的设计].


⭐️ ⭐️

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值