6.8 KiB
tags, create time
| tags | create time | ||||
|---|---|---|---|---|---|
|
2026-06-26 23:05 |
8255A 可编程并行接口
概述
8255A(Programmable Peripheral Interface, PPI)是 Intel 公司生产的通用可编程并行 I/O 接口芯片,在全部 4 套试卷中均有出现,是本课程最高频考点。它提供 3 个 8 位端口(A、B、C),支持 3 种工作方式,可通过程序灵活配置为输入/输出功能。
[!tip] 考试要点
- 控制字计算:方式控制字(D7=1)和 C 口按位控制字(D7=0)的区别
- 工作方式对比:方式 0/1/2 的特点、联络信号
- 端口地址推算:已知一个端口地址推算其余端口和控制口地址
正文
1. 内部结构
8255A 内部由 4 个功能模块 组成:
graph LR
A["CPU 数据总线"] --> B["数据总线缓冲器"]
B --> C["读/写控制逻辑"]
C --> D["A 组控制"]
C --> E["B 组控制"]
D --> F["端口 A (PA0~PA7)"]
D --> G["端口 C 高 4 位 (PC4~PC7)"]
E --> H["端口 B (PB0~PB7)"]
E --> I["端口 C 低 4 位 (PC0~PC3)"]
| 模块 | 功能 |
|---|---|
| 数据总线缓冲器 | 三态 8 位缓冲器,实现 CPU 与 8255A 之间的数据传输 |
| 读/写控制逻辑 | 根据 CS、RD、WR、A1、A0 信号控制端口的读写操作 |
| A 组控制 | 控制端口 A 和端口 C 高 4 位的工作方式 |
| B 组控制 | 控制端口 B 和端口 C 低 4 位的工作方式 |
2. 三个端口的能力
| 端口 | 可用工作方式 | 说明 |
|---|---|---|
| 端口 A | 方式 0、方式 1、方式 2 | 功能最全,唯一支持双向传输(方式 2)的端口 |
| 端口 B | 方式 0、方式 1 | 不支持方式 2 |
| 端口 C | 仅方式 0 | 可分为高 4 位和低 4 位两组独立使用;在方式 1/2 下部分引脚被复用为联络信号 |
[!question] 思考题 为什么只有端口 A 支持方式 2(双向传输)?这与 8255A 的硬件设计有什么关系?
提示:方式 2 需要同时占用输入和输出的联络信号线,这些信号来自端口 C——只有 A 组控制能支配足够多的 C 口引脚(5 根)来支持双向握手。
3. 三种工作方式详解
方式 0 — 基本输入/输出
最简单的工作方式,无需任何联络信号(握手信号),CPU 可直接通过 IN/OUT 指令读写端口。
- A、B、C 三个端口均可工作在此方式下
- 适用于无条件传送或简单的外设控制(如 LED、开关)
方式 1 — 选通输入/输出
利用端口 C 的部分引脚作为 联络信号(握手信号),实现 CPU 与外设之间的同步数据传输。
方式 1 输入时的联络信号(以 A 口为例):
| 信号 | 方向 | 含义 |
|---|---|---|
| STB (PC4) | 外设 → 8255A | 选通信号,低电平有效,将数据锁存到输入锁存器 |
| IBF (PC5) | 8255A → 外设 | 输入缓冲器满,高电平有效,通知外设数据已被接收 |
| INTRA (PC3) | 8255A → CPU | 中断请求,请求 CPU 读取数据 |
| INTE A | 内部触发器 | 通过 PC4 的置位/复位控制,决定是否允许中断 |
方式 1 输出时的联络信号(以 A 口为例):
| 信号 | 方向 | 含义 |
|---|---|---|
| OBF (PC7) | 8255A → 外设 | 输出缓冲器满,低电平有效,通知外设数据已准备好 |
| ACK (PC6) | 外设 → 8255A | 应答信号,低电平有效,外设确认已取走数据 |
| INTRA (PC3) | 8255A → CPU | 中断请求,通知 CPU 可以写入下一个数据 |
[!info] 方式 1 工作流程(输入) 外设准备数据 → 发 STB 锁存数据 → 8255A 发 IBF → 条件满足时发 INTR → CPU 响应中断并读数据 → IBF 变低 → 准备接收下一个数据。
方式 2 — 双向总线方式
仅端口 A 可用,同一端口既可输入又可输出,利用端口 C 的 5 个引脚(PC3~PC7)作为联络信号。
graph LR
A["外设"] -- "数据 + STB/IBF" --> B["8255A 端口 A"]
B -- "数据 + OBF/ACK" --> A
B -- "INTR" --> C["CPU"]
4. 控制字格式
8255A 有两类控制字,通过 D7 位 区分,写入同一个端口地址(控制口):
方式控制字(D7 = 1)
用于设置各端口的工作方式和输入/输出方向。
D7 D6 D5 D4 D3 D2 D1 D0
1 [A组方式] [A口] [C口高] [B组方式] [B口] [C口低]
↑ ↑ ↑ ↑ ↑ ↑
00=方式0 1=入 1=入 0=方式0 1=入 1=入
01=方式1 0=出 0=出 1=方式1 0=出 0=出
10=方式2
速算技巧:先确定 D7=1,然后按"A 组方式 → A 口方向 → C 高方向 → B 组方式 → B 口方向 → C 低方向"依次填入。
[!example] 典型控制字计算 要求:A 口方式 0 输出,B 口方式 0 输出
分析:D7=1, D6D5=00(方式 0), D4=0(输出), D3=0(输出), D2=0(方式 0), D1=0(输出), D0=0(输出)
控制字 =
1000 0000B= 80H
C 口按位置位/复位控制字(D7 = 0)
用于对端口 C 的 某一位 进行置 1 或清 0 操作,而不影响其他位。
D7 D6 D5 D4 D3 D2 D1 D0
0 × × × [位号选择] [1=置位, 0=复位]
000=PC0
001=PC1
...
111=PC7
[!example] 典型位控制字计算 要求:使 PC3 = 1
分析:D7=0, D6D5D4 无关(填 0), D3D2D1=011(选 PC3), D0=1(置位)
控制字 =
0000 0111B= 07H
[!question] 关键考点 方式控制字和 C 口位控制字写入的是 同一个端口地址(控制口),如何区分?
答:通过 D7 位区分。D7=1 是方式控制字,D7=0 是位控制字。
5. 端口地址推算
8255A 占用 4 个连续端口地址,由 A1、A0 引脚选择:
| A1 A0 | 选中端口 | 相对偏移 |
|---|---|---|
| 0 0 | 端口 A | 基地址 + 0 |
| 0 1 | 端口 B | 基地址 + 2 |
| 1 0 | 端口 C | 基地址 + 4 |
| 1 1 | 控制口 | 基地址 + 6 |
[!example] 地址推算示例 已知 A 口地址 = 2F0H,则:
- B 口 = 2F0H + 2 = 2F2H
- C 口 = 2F0H + 4 = 2F4H
- 控制口 = 2F0H + 6 = 2F6H
若 A 口地址 = 20H(小地址系统),则控制口 = 23H。
6. 初始化编程模板
; 8255A 初始化通用模板
; 假设控制口地址为 PORT_CTL
MOV DX, PORT_CTL ; 控制口地址
MOV AL, 80H ; 方式控制字(按需修改)
OUT DX, AL ; 写入方式控制字
; 若需要对 C 口某位置位/复位:
MOV DX, PORT_CTL
MOV AL, 07H ; 位控制字:PC3=1
OUT DX, AL