--- 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|试题册索引]]