vault backup: 2026-06-26 23:22:55
This commit is contained in:
@@ -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|试题册索引]]
|
||||
Reference in New Issue
Block a user