8255A的功能与结构
8255A可编程外围设备接口(programmable perphheral interface,PPI)是一种通用的可编程并行I/O接口器件。它可以作为Intel系列微处理器或其它系列微处理器的接口器件,可以将任何与TTL兼容的I/O设备与微处理器连接。在与主频不高于8MHz的微处理器一起工作时,不需要插入等待周期。
它有24个可编程I/O引脚,分为两组,每组12个,可以以3种不同的操作方式工作。它的每个I/O引脚可以提供2.5mA的吸入电流,最大4mA。8255A常常用作键盘和打印机端口。它的价格低廉,使用方便,得到了广泛的应用。
8255A的功能结构
由图可得:
(1)数据总线缓冲器
D7~D0与系统数据总线相连,负责与CPU进行数据交换。包括输入输出数据、控制字和状态字。
(2)读/写控制逻辑
接收来自CPU的地址信息和控制信息。
(3)A组控制和B组控制
这两组控制逻辑电路接收来自CPU的控制字,控制两组端口的工作方式及读/写操作。A组控制端口A和端口C的高4位,B组控制端口B和端口C的低4位。
(4)端口A、B、C
8255A有3个8位数据输入/输出端口:端口A、端口B和端口C,分别简称为A口、B口和C口。它们对外的引线分别是PA7~PA0、PB7~PB0和PC7~PC0。C口可分成两个4位的端口:C口高4位(PC7~PC4)和C口低4位(PC3~PC0)。
三个端口按组编程
端口A和端口B都有一个8位数据输入锁存器和一个8位数据输出锁存/缓冲器。端口C有一个8位数据输入缓冲器和一个8位数据输出锁存/缓冲器。
端口C可以按位操作。
8255A的引脚功能
双列直插,40根引脚
D7~D0:数据信号线
CS:片选信号输入引脚,低电平有效
RD:读信号输入引脚,低电平有效
WR:写信号输入引脚,低电平有效
RESET:复位信号输入引脚,高电平有效。用于将8255A控制字寄存器清“0”,并将A、B、C口置成输入状态
A1、A0:端口选择信号输入引脚
8255A的工作方式
8255A可以无条件方式、查询方式和中断方式完成CPU与外设的数据交换。
以无条件方式工作时,端口A、B和C都可以作为数据输入/输出端口。
以查询或中断方式工作时,A口与B口可以作为数据输入/输出端口,C口作为握手联络信号,负责输出控制信息或输入状态信息。
8255有三种工作方式:方式0、方式1、方式2;
方式0:基本输入输出方式
- 适合于三个端口;
- A口、C口的高4位、B口、C口的低四位可分别定义为输入或输出,共有四个部分,故共有16种组合。
- C口可以按位进行置位(置0)和复位(置1)。
方式0最适用于无条件传送方式;
也能用于查询工作方式,比较勉强,这时可以把C口的高4位定义为输入口,输入外设的状态信号,而将C口的低四位定义为输出口,输出控制信息;(C口的输入端和输出端不固定,可根据图中C口与外设相连的方向决定),这时可用A、B口传送数据;
方式0不能工作在中断方式;
例:8255A作为连接打印机的接口,工作方式0,端口地址为:0D0H~0D6H,写出相应的初始化程序和控制程序
注:第一行的81H如何得来?
81H=>10000001B
表示A口输出,而通过看图得知,(PC6为高四位),C口高四位输出,C口低四位输入。
方式1:选通输入输出方式
A口、B口作为数据的输入口或输出口,但数据的输入输出要在控制信号的控制下,控制信号由C口的某些位来提供;
方式1适用于程序查询和中断控制方式,它不能工作在无条件传送方式下;
选通输出
在方式1下,A口、B口都可以选通输出数据,C口的6条线作为选通控制信号:PC3、PC6、PC7配合A口,PC0、PC1、PC2配合B口;
OBF:输出缓冲器满信号,低电平有效,当A口/B口有数据时,OBF就会变成低电平,高电平时,CPU可往A口/B口放送数据
ACK:外设收到数据的应答信号,低电平有效
INTE:中断允许状态
(工作原理:与PC7通过与门设置PC3的值,当OBF为高电平时,表示CPU可向外设传数据,但CPU迟迟为将数据传来,此时可通过PC6将INTE设置为高电平,两者通过与门后,将PC3置为高电平,向CPU发起中断请求信号(实际上是提醒CPU往外设传输数据)
INTR:中断请求信号,高电平有效
总结:
-
查询方式
查询端口C的BIT7,如果是0则等待;如果不是0,则CPU发送数据。
WAIT: IN AL,PORTC # 从端口C读取数据 TEST AL,BIT7 JZ WAIT MOV AL,[SI] OUT PORTA,AL
-
中断方式
- PC3置1,请求中断
- 置位PC6,允许中断
- 数据从端口输出,导致OBF变成高电平,证明端口数据被取走,CPU就会往端口放送数据
- INTE与PC7构成一个与门,导致PC3再次置1
选通输入
A口、B口都可以选通输入数据,C口的6条线作为选通控制信号:PC3、PC4、PC5配合A口,PC0、PC1、PC2配合B口;
方式1:
STB:输入选通信号,外设用它将数据锁存于输入数据缓冲器中,低电平有效
IBF:数据输入缓冲器满,STB的应答信号,高电平有效
INTE:中断允许状态
{工作原理:当IBF为高电平时,表示数据输入缓冲器满,但CPU迟迟没来拿走输入的数据,这时候就会向CPU发出中断请求信号,提醒CPU拿走数据)
INTR:中断请求信号,高电平有效
方式2:双向传输方式
只有A口可以工作在这种方式下。既能发送数据,又能接收数据;它还要利用C口的5条线作为控制信号线; A口的输入输出均具有数据锁存能力,数据的输入输出均可以引起中断;
方式2适用于程序查询和中断控制方式。它不能工作在无条件传送方式下。
这时B口可以工作在方式0或方式1,C口剩余的3条线可以作为输入输出线或方式1下的控制线。
8255的控制字
-
方式选择控制字
【例题】
设8255的端口地址为FBC0~FBC3H,A口设置方式0输入,B口方式0输出,C口高4位方式0输出,C口低4位方式0输入。
控制字为:10010001B => 91H
8255初始化程序为:
# 由8255的端口地址为FBC0~FBC3H可知,控制端口为FBC3H
MOV DX, 0FBC3H # 以字母F开头,须在前面加一个0
MOV AL, 91H
OUT DX, AL
-
按位操作控制字
设置PC0为置位,则:00000001
设置PC4为复位,则:00001000
【例题】
设8255的端口地址为FBC0~FBC3H,A口设置方式0输出,B口方式0输入,C口高4位方式0输出,C口低4位方式0输入,利用C口PC5产生连续的方波信号,信号的高、低电平宽度可调用延时子程序DELAY实现。
控制字为:10000011B =>83H
8255初始化程序为:
MOV DX, 0FBC3H
MOV AL, 83H
OUT DX, AL
FB : MOV AL, 0BH #00001011B 高电平
OUT DX, AL ;PC5置位
CALL DELAY ;维持高电平
MOV AL, 0AH
OUT DX, AL ;PC5=0
CALL DELAY ;维持低电平
JMP FB ;连续输出方波信号
8255与微处理器的连接
-
8255A的D7~D0分别与系统总线的D7~D0相连;
-
RD、WR分别与系统总线的RD、WR信号或者IOR和IOW信号相连;
-
A1、A0分别与系统地址线A1、A0相连;
-
CS由系统地址总线A2~A15译码生成。
在PC机中,8255A的I/O端口地址为60H63H和端口378H37BH。端口60H63H用于键盘、扬声器和定时器,端口378H37BH用于并行打印机(LPT1)端口。
端口地址
8255A包含A口、B口、C口三个独立的数据端口,及一个控制端口。各端口地址如下:
A1A0=00 A口
A1A0=01 B口
A1A0=10 C口
A1A0=11 控制端口
-
该图表示8255A有四个地址,因为这里有两根线 A1 A0,这两根线决定了8255有四个地址
-
8255要正常工作,必须CS为有效,而CS与Y2相连,也就是Y2必须输出有效信号
-
如果Y2要有效,必须让74LS138译码器有效,而要74LS138译码器有效,必须使得:G1为高电平,G2A为低电平,G2B为低电平这三个一定要满足
-
C B A 决定Y2是否有效 (不一定是Y2,所以C B A 的值根据下面的值变化)
C B A
0 0 0 Y0有效
0 0 1 Y1有效
0 1 0 Y2有效
0 1 1 Y3有效
1 0 0 Y4有效
1 0 1 Y5有效
1 1 0 Y6有效
1 1 1 Y7有效
-
把图中CPU的所以地址线A7~A0列出来计算得出地址值
8255A初始化
8255A初始化,设定端口的工作方式和输入/输出方向,即将方式控制字写入控制端口。
初始化程序段如下:
MOV DX, PORT-Ctrl ;8255A的控制口地址送DX
MOV AL, mode ;将方式选择控制字内容送AL
OUT DX, AL ;写入控制口,完成初始化
键盘接口
利用8255A可以很方便地连接线性键盘和矩阵键盘。
- 按键数量大的键盘通常采用矩阵结构,如计算机键盘,利用一片8255A的A口和C口的高4位作为行线,B口和C口的低4位作为列线,可以构成12X12=144的矩阵键盘。
- 识别键盘上哪个键被压下的过程称为键盘扫描。
- 键盘扫描有两种方法:行扫描法和反转法。
行扫描法
- PC7~PC4 输出全 0(所有行置0),从 PC3~PC0 读入,若读入的数据不是 0FH,表明某一列有键按下;
- 延时 20ms 去抖动(按键按下时的讯号不稳定),重复第一步动作,若还有键闭合,则认为确实有键闭合;否则返 回第一步;
- 查找被确认的键;从第 0 行开始逐行输出 0,其他行输出1(每次只有扫描到的行为0,其他的都为1),然后读入列的值,检测是否为0FH,如果是0FH则检测下一行,如果不是则已经找到按键所在的行,输出所在的行;
- 将输出的行值数据与第 1 步输入的数据组成一个字节,查表(键的位置码表),确定键值。(如上图的键值8,其位置码位BE)
反转法
图上每行每列比行扫描法都多了一个电阻
- 将 PC7~PC4 设定为输出,PC3~PC0 设定为输入。然后 PC7~PC4 输出全 0,从 PC3~PC0 读入列值,若读入的数据有一位为 0,表明该列有键按下,保存列值;
- 延时 20ms 去抖动,重复第一步动作,若还有键闭合,则认为确实有键闭合;否则返 回第一步;
- 将 PC7~PC4 设定为输入,PC3~PC0 设定为输出。把保存的列值从 PC3~PC0 输出, 从 PC7~PC4 读入行值,读入的数据必有一位为 0,保存行值。将行值和列值组合在 一起,用查表的方法得到按键的键值。