vault backup: 2026-06-26 23:22:55

This commit is contained in:
2026-06-26 23:22:56 +08:00
parent f0272e1ceb
commit b5ab951ca8
9 changed files with 825 additions and 19 deletions
@@ -0,0 +1,194 @@
---
tags:
- 接口与通讯技术
- 8255A
- 并行接口
- 可编程芯片
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 个功能模块** 组成:
```mermaid
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)作为联络信号。
```mermaid
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. 初始化编程模板
```asm
; 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
```
## 关联笔记
- [[8254定时计数器]]
- [[8259A中断控制器]]
- [[8251A串行通信接口]]
- [[接口与通讯技术/试题册/index|试题册索引]]