·I/O接口概述本章内容
并行接口 —— 8255A
学习目的
掌握可编程并行接口芯片
8255A的连接与编程微机系统的信息交换有 并行通信和 串行通信 两种方式。
并行通信是以微机的字长为传输单位;
适合于外部设备与微机之间进行近距离、
大量和快速的信息交换。
实现并行通信的接口称之为并行接口。
概 述
8255A是 Intel86系列微处理机的配套并行接口芯片,它可为 86系列
CPU与外部设备之间提供并行输入 /输出通道 。
11.1 可编程并行接口芯片 8255A
并行输入 /输出端口 A,B,C:
8255A芯片具有 24个可编程输入输出引脚,分成 3个 8位端口 。
11.1.1 8255A的基本功能和内部结构一,8255A的内部结构和引脚信号
1,8255A内部结构
8 2 5 5 A 可 编 程 外 围 设 备 接 口
(Programmable Peripheral Interface,简写为 PPI),其内部结构如图所示 。
图 11.1 8255A内部结构
A组控制部件数据总线缓冲器读 /写控制部件
B组控制部件
RESET
RD
A0A1
A组端口 A
8位组
A组端口 C
(高 4位 )
B组端口 C
(低 4位 )
8位
B组端口 B
PA7~PA0
PC7~PC4
PC3~PC0
PB7~PB0
双向
D7~D0
WR
CS
8255A包括四大部分,数据总线缓冲器,
读写控制部件,A组和 B组控制部件,端口
A,B,C。
(1) 并行输入 / 输出端口 A,B,C
端口 A,包含一个 8位数据输 出 锁存器 /缓冲器和一个 8位数据输入锁存器,输入输出数据均受到锁存 。
端口 B和 C,都包含一个 8位数据输入缓冲器和一个 8位的数据输出锁存器 /缓冲器,
输出数据能锁存,输入数据不锁存 。
端口 C:可分成两个 4位端口,分别定义为输入或输出端口,还可定义为控制,状态端口,配合端口 A和端口 B工作 。
(2) A组和 B组控制部件
A组
A口,PA0~PA7
C口的高 4位,PC4~PC7
B组
B口,PB0~PB7
C口的低 4位,PC0~PC3
A组,B组的控制寄存器,
接收来自数据总线的控制字,
并根据控制字确定各端口的工作状态和工作方式。
(3) 数据总线缓冲器三态双向 8位缓冲器,是 8255A与
CPU 之间的数据接口 。 传送输入数据,
输出数据,控制命令字 。
(4)读 /写控制部件接收来自 CPU地址总线信号和控制信号,
并发出命令到两个控制组 (A组和 B组 )。
CS,片选信号,接 CPU高位地址的译码输出
WR,写信号,WR有效,CPU向 8255A写入的控制或数据信息 。
RD,读信号,RD有效,CPU读 8255A的数据或状态;
RESET,复位信号。 RESET有效时,清
8255A 所有控制寄存器内容,并将各端口置成输入方式。
2,8255A的引脚
8 2 5 5 A
采用 40线双列直插封装,
引脚图如图所示 。
图 11.2 8255A引脚定义
4
3
2
1
40
37
18
34.
.
.
.
.
.
27D7
D0
A0
A1
CS
RD
RESET
VCC
GND
9
8
6
5
35
36
8255A
PPI
数据总线控制线电源线通道 A
通道 B
通道 C
CPU接口 外设接口
.
.
.
PA7
PA0
.
.
.
PB7
PB0
.
.
.
PC7
PC0
WR
25
14
15
16
17
13
12
11
10
* PA7~PA0,A端口数据信号引脚
* PB7~PB0,B端口数据信号引脚
* PC7~PC0,C端口数据信号引脚
* D7~D0,8255A的 8位数据线
* A1~A0,端口选择信号当 A1A0=00时 选择端口 A
当 A1A0=01时 选择端口 B
当 A1A0=10时 选择端口 C
当 A1A0=11时 选择控制端口表 11.1 8255A的读写操作控制
8255A共有 两个 控制字:即 工作方式控制字和对 C口置位 /复位控制字 。
1,控制字
(1)工作方式控制字:
控制字和各位的含义如图所示 。
11.1.2 8255A的控制字及其工作方式
D7 D6 D5 D4 D3 D2 D1 D0 B组端口 C(PC3~PC0)
1=输入,0=输出端口 B
1=输入,0=输出方式选择
0=方式 0,1=方式 1
A组端口 C(PC7~PC4)
1=输入,0=输出端口 A
1=输入,0=输出方式选择
00=端口 A方式 0,01=端口
A方式 1,1?=端口 A方式 2
方式设置标志
1=有效图 11.3 8255A工作方式控制字格式
(2) 端口 C的置位 /复位控制字控制字的格式如图所示。
图 11.4 8255A 置位 /复位控制字格式
D7 D6 D5 D4 D3 D2 D1 D0
位的置位 /复位
1=置位,0=复位位 选 择
D3 D2 D1 通道 C位按位置位 /复位控制标志 0=有效
0 0 0 PC0
0 0 1 PC1
0 1 0 PC2
0 1 1 PC3
1 0 0 PC41 0 1 PC5
1 1 0 PC6
1 1 1 PC7
不使用设置为 000
关于控制字要说明几点:
(1) 设置方式控制字时,A口,B口作为整体设置,而 C口要分成上,下两部分 分别设置 。 三个端口的工作方式由 一个控制字规定 。
(2) C口按位置位 /复位控制字不是送到 C
口地址,而是送到 控制寄存器 地址;且一个控制字只能使 C口 一位置位或复位 。
(3) 方式控制字和按位置位 /复位控制字均写入同一个 控制寄存器 地址,二者通过最高位 D7来区别 。 D7=1为方式控制字,D7=0为按位置位 /复位控制字 。
( 1) 方式 0 —— 基本输入 /输出方式方式 0是一种基本输入输出工作方式,它的 24条 I/O线可以全部都用作传送数据,不设置应答信号线,常用于无条件传送,输出有锁存,输入只有缓冲能力而无锁存功能 。
方式 0控制字具体格式如图 11.5所示
2,工作方式图 11.5 8255A工作方式 0控制字格式由控制字中 D4D3D1D0等 4位的不同取值可定义方式 0的 16种工作方式的组合如表 11.2所示。
方式 0中,端口 C被分成两个 4位端口,它们可被定义为输入或输出端口,CPU与 3个端口之间交换数据,
可直接由 CPU执行 IN和 OUT指令来完成。
表 11.2 方式 0的工作状态组合序号 控制字D
7,…,D 0
A组 B组端口 A
端口 C
高 4位
(PC7~PC4)
端口 B
端口 C
低 4位
(PC3~PC0)
1 10000000 输出 输出 输出 输出
2 10000001 输出 输出 输出 输入
3 10000010 输出 输出 输入 输出
4 10000011 输出 输出 输入 输入
5 10001000 输出 输入 输出 输出
6 10001001 输出 输入 输出 输入
7 10001010 输出 输入 输入 输出
8 10001011 输出 输入 输入 输入
9 10010000 输入 输出 输出 输出
10 10010001 输入 输出 输出 输入
11 10010010 输入 输出 输入 输出
12 10010011 输入 输出 输入 输入
13 10011000 输入 输入 输出 输出
14 10011001 输入 输入 输出 输入
15 10011010 输入 输入 输入 输出
16 10011011 输入 输入 输入 输入
(2) 工作方式 1—— 选通式输入 /输出方式
① 方式 1选通输入方式 1操作使端口 A或端口 B作为锁存输入设备工作 。 端口 C也可按方式 1操作使用 —— 但不是对数据,而是对控制信号,或当端口 A或端口 B为选通输入端口时的握手信号 。
下图示出 8255A方式 1选通输入时的内部结构图 。
图 11.6工作方式 1输入控制字格式
( a) 端口 A方式 1输入 ( b) 端口 B方式 1输入图 11.7方式 1输入端口状态
IBF,输入缓冲器满信号,向外设输出,高电平有效 。
STB,选通信号 。 由外设输入,低电平有效 。
INTR,中断请求信号,高电平有效 。
INTE,中断允许信号,它是通过端口 PC4(端口 A)或 PC2(端口 B)的位来编程的内部位 。
② 方式 1选通输出当端口 A或端口 B为方式 1输出时,各指定 PC的 3条线作为 8255A与外设及 CPU之间应答信号 。 下图为方式 1选通输出操作的内部结构图 。
图 11.8 方式 1输出控制字格式图 11.9 方式 1输出端口状态
INTRAPC3
PC6
PC7
PA7~0
方式 1输出端口 A
AOBF
PC4,5 I/O
INTEA
2
AACK
WR
方式 1输出端口 B
INTRBPC0
PC2
PC1
INTEB
BOBF
BACK
PB7~0
WR
( a) 端口 A方式 1输出 ( b) 端口 B方式 1输出
OBF,输出缓冲器满信号 。 向外设输出,低电平有效 。
ACK,外设应答信号。由外设输入,
低电平有效。
INTE,中断允许信号 。
INTR,中断请求信号。高电平有效。
(3) 工作方式 2—— 双向选通输入 /输出方式方式 2只允许 A组采用,此时端口 A变为双向,允许数据在同一组 8
条线上发送和接收 。
下图示出方式 2操作内部结构图 。
图 11.10 端口 A方式 2控制字图 11.11 端口 A工作在方式 2的端口状态
OBFA,输出缓冲器满信号,向外设输出,
低电平有效 。
ACKA,应答信号,由外设输入,低电平有效 。
STBA,数据选通输入信号。由外设输入,
低电平有效。
IBFA,输入缓冲器满信号,向外设输出,
高电平有效 。
INTE,中断允许信号 (INTE1和 INTE2)。
高电平有效 。
INTRA,中断请求信号,高电平有效。
8255A中端口 A工作方式 2时,
允许端口 B工作于方式 0或方式 1,完成输入 /输出功能 。 4种组合状态及其工作方式控制字格式如表 11.3。
表 11.3 方式 2的组合状态与控制字格式目前打印机一般采用并行接口
Centronics标准,其主要信号与传送时序如图 11.12。 打印机接收主机传送数据的过程是这样的:
11.2 8255A的应用实例
11.2.1 8255A与打印机接口一、用方式 0与打印机接口当主机准备好输出打印的一个数据时,通过 8255 A把数据送给打印机接口的数据引脚
DATA0~ DATA7,同时送出一个数据选通信号
STROBE 给打印机 。 打印机收到该信号后,把数据锁存到内部缓冲区,同时在 BUSY信号线上发出忙信号 。 待打印机处理好输入数据时,打印机撤消忙信号,同时向主机送出一个响应信号 ACK。 主机根据 BUSY信号或信号 ACK决定是否输出下一个数据 。
图 11.12 方式 0的打印机接口本例中,CPU与 8255A采用查询方式输出数据。端口 A设置为方式 0,输出打印数据,
端口 C的 PC7产生负脉冲选通信号,PC2连接打印机的 BUSY信号查询其状态,PC0连接打印机的信号。
假设 8255A的 A,B,C口的 I/O地址为
FFF8H,FFFAH和 FFFCH,控制端口地址为
FFFEH。
,;初始化程序段
MOV DX,0FFFEH
MOV AL,81H ;A口方式 0输出,C口上半部输出,;下半部输入
OUT DX,AL ;输出工作方式字
MOV AL,0FH ;C口的置位 /复位控制字,使 PC7;= 1,即置 STROBE= 1
OUT DX,AL ;输出打印数据子程序,打印数据;在 AH中
PUSH AX
PUSH DX
PM,MOV DX,0FFFCH
IN AL,DX ; 查询 PC2
AND AL,04H ; BUSY=0?
JNZ PM ;忙,则等待,D2=1 表示忙
MOV DX,0FFF8H ;不忙,则输出数据
MOV AL,AH
OUT DX,AL
MOV DX,0FFFEH
MOV AL,0EH ;使 PC7=0,即置 = 0
OUT DX,AL
STROBE
NOP ; 适当延时,产生一定宽度的低电平
NOP
MOV AL,0FH ; 使 PC7=1,置 = 1
OUT DX,AL
POP DX
POP AX
RET
STROBE
二、用方式 1与打印机接口
8255A的端口 A工作于选通输出方式,PC7作为输出信号,PC6作为 A输入信号,而 PC3作为 INTRA
输出信号;另外,可用程序控制 INTEA(PC6),决定是否采用中断方式。打印机接口的时序与 8255A的选通输出方式的时序类似,但略有差别,用单稳电路
74LS123即可满足双方的时序要求,见图 11.13。
图 11.13 方式 1的打印机接口假设 8255A的 A,B,C口的 I/O
地址为 FFF8H,FFFAH和 FFFCH。
控制端口的地址为 FFFEH。 以下为采用选通方式输出缓冲区 BUF中的打印字符的子程序,输出的字节数为 M。
PRINT PROC
PUSH AX ; 保护寄存器
PUSH BX
PUSH CX
PUSH DX
MOV DX,0FFFEH ;设定 A口为选通输出方式
MOV AL,0A0H
OUT DX,AL
MOV AL,0CH ;使 INTEA(PC6)为 0,禁中断
OUT DX,AL
MOV CX,M ;打印字节数送 CX
MOV BX,OFFSET BUF ;取缓冲区首址送 BX
PRINT1,MOV AL,[BX] ;取一个数据
MOV DX,0FFF8H
OUT DX,AL ;从 A口输出
MOV DX,0FFFCH
PRINT2,IN AL,DX ;读 C口
TEST AL,80H ;检测 OBFA( PC7);为 1否?
JZ PRINT2 ; 为 0,则继续检测
INC BX ; 为 1,说明数据已输出
LOOP PRINT1 ; 准备取下一个数据输出
POP DX ; 打印结束,恢复寄存器
POP CX
POP BX
POP AX
RET ; 返回
PRINT ENDP
本例与上例的主要区别是:在上例中,
由软件对 PC7复位和置位来产生打印机的选通信号,而本例中,8255A工作在选通方式,当执行输出指令时,自动由硬件从
PC7( OBFA) 输出负脉冲选通信号。当打印机 ACK变为有效时,自动将 PC7置为高电平。
最简单的键盘如图 11.14(a)所示,其中每个键对应 I/O端口的一位。没有键闭合时,各位均处于高电平;当有一个键按下时,就使对应位接地而成为低电平,而其它位仍为高电平。这样,CPU只要检测到某一位为 0,便可判别出对应键已按下。
11.2.2 8255A与键盘接口一、键盘的工作原理图 11.14 键盘的结构用图 11.14(a)的结构设计键盘有一个很大的缺点,占用的 I/O端口也太多 。所以,这种简单结构只用在只有几个键的小键盘中。
通常使用的键盘是矩阵结构的。以
3× 3=9个键为例,如图 11.14(b),这个矩阵分为 3行 3列,如果键 5按下,则第 1行和第 2列线接通而形成通路。如果第 1行线接低电平,则键 5的闭合,会使第 2列线也输出低电平。
二、键的识别
(1)行扫描法图 11.15是一个 8行 8列组成的键盘。 行扫描法识别按键的原理如下,先使第 0行接低电平,其余行为高电平,然后看第 0行是否有键闭合。这是通过检查列线电位来实现的,即在第 0行接低电平时,看是否有哪条列线变成低电平。
图 11.15 键盘接口电路如果没有任何一条列线为低电平,
则说明第 0行没有任何键被按下。此后,
再将第 1行接低电平,检测是否有变为低电平的列线。如此重复地扫描,直到最后一行。在扫描过程中,当发现某一行有键闭合时,便退出扫描,通过组合行线和列线即可识别此刻按下的是哪一键。
实际应用中,一般先快速检查键盘中是否有键按下,然后再确定按键的具体位置。为此,先使所有行线为低,然后检查列线。这时如果列线有一位为 0,则说明必有键被按下,
采用扫描法可进一步确定按键的具体位置。
图 11.15中将行线与 8255A端口 B相连,
端口 B设置为输出。 CPU使端口 B的某一位为 0,便相当于将该行线接低电平;某位为 1,则该行线接高电平。将列线与端口 A相连,端口 A设置为输入。 CPU只要读取端口 A的数据,就可以判别是否有键被按下及是第几列的键被按下。
从上面的原理可知,键盘扫描程序的第一步 应该判断是否有键被按下。为此,使输出端口各位全为 0,即相当于将所有行线接低电平。然后,从输入端口读取数据,如果读得的数据不是 FFH,则说明必有列线处于低电平,从而可断定必有键被按下。此时,为了消除键的抖动,调用延迟程序。如果读得的数据是 FFH,则程序在循环中等待。这段程序如下:
KEY1,MOV AL,00H
MOV DX,ROWPORT ;ROWPORT为行线端口;地址
OUT DX,AL ;使所有行线为低
MOV DX,COLPORT ;COLPORT为列线端口地;址
IN AL,DX ;读取列值
CMP AL,0FFH ;判定是否有列线为低电平
JZ KEY1 ;没有,无闭合键,则循环等待
CALL DELAY ;有,则延迟 20ms清除抖动键盘扫描程序的第二步 是逐行扫描以判断哪一个键被按下了。开始时,将计数值设置为行数。扫描初值 11111110使第 0行为低电平,其它行为高。输出扫描初值后,马上读取列线的值,看是否有列线处于低电平。若无,则将扫描初值循环左移一位,变为
11111101,同时,计数值减 1,如此下去,直到计数值为 0,或找到按键所在行时止,程序段如下:
MOV AH,0FEH ; 扫描初值送 AH
MOV CX,8 ; 行数送 CX
KEY2,MOV AL,AH
MOV DX,ROWPORT
OUT DX,AL ; 输出行值(扫描值)
MOV DX,COLPORT
IN AL,DX ; 读进列值
CMP AL,0FFH ;判断有无接地线
JNZ KEY3 ;有,则转下一步处理
ROL AH,1 ;无,则修改扫描值;准备下一行扫描
LOOP KEY2 ;计数一次,未扫完 8行,则继续循环
JMP KEY1 ;所有行都没有键按下,则返回继;续检测
KEY3,… ; 此时,AL=列值,AH=行值,进行后; 续处理将行线接一个数据端口,先让它工作在输出方式;将列线也接到一个数据端口,先让它工作在输入方式。程序使 CPU通过输出端口往各行线上送低电平,然后读入列线值。如果此时有某键被按下,则程序再对两个端口进行方式设置,使接行线的端口改为输入方式,接列线的端口改为输出方式。并将刚才读得的列值从列线所接端口输出,再读取行线的输入值,
那么,闭合键所在的行线值必定为 0。
(2) 行反转法这样,当一个键被按下时,必定可以读得一对唯一的行值和列值。但是,要实现上述行反转法,行、列线所接的数据端口应能够改变输入、输出方式,而 8255A的 3个端口正好具有这个功能。
为了查找键代码,键盘程序设计时,可将各个键对应的行、列值放在一个表中,程序通过查表来确定哪一个键被按下,进而在另一个表中找到这个键的代码。
如果遇到多个键同时闭合的情况,则输入的行值或者列值中一定有一个以上的 0,而由程序预选建立的键值表中不会有此值,因而可以判为重键而重新查找。所以,用这种方法可以方便地解决重键问题。
KEY1,… ; 设置行线接输出端口 ROWPORT,;列线接输入端口 COLPORT,并;判断是否有键按下
KEY2,MOV AL,00H
MOV DX,ROWPORT
OUT DX,AL ;行线全为低
MOV DX,COLPORT
IN AL,DX ;读取列值
CMP AL,0FFH
JZ KEY2 ;无闭合键,循环等待
PUSH AX ;有闭合键,保存列值
PUSH AX
… ; 设置行线接输入端口 ROWPORT,;列线接输出端口 COLPORT,并判;断是否有键按下
MOV DX,COLPORT
POP AX
OUT DX,AL ;输出列值
MOV DX,ROWPORT
IN AL,DX ;读取行值
POP BX ;结合行列值,此时
MOV AH,BL ;AL=行值,AH=列值;查找键代码;查找键代码
MOV SI,OFFSET TABLE ;TABLE为键值表
MOV DI,OFFSET CHAR ;CHAR为键对应的代码
MOV CX,64 ;键的个数
KEY3,CMP AX,[SI] ;与键值比较
JZ KEY4 ;相同,说明查到
INC SI ;不相同,继续比较
INC SI
INC DI
LOOP KEY3
JMP KEY1 ;全部比较完,仍无相同,说明是重键
KEY4,MOV AL,[DI] ;获取键代码送 AL
… ; 判断按键是否释放,没有则等待
CALL DELAY ;按键释放,延时消除抖动
… ; 后续处理
TABLE DW 0FEFEH ;键 0的行列值(键值)
DW 0FDFEH ;键 1的行列值
DW 0FBFEH ;键 2的行列值
… ; 全部键的行列值
CHAR DB … ; 键 0的代码
DB … ; 键 1的代码
… ; 全部键的代码当用手按下一个键时,往往会出现按键在闭合和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也会出现类似的情况,这就是抖动 。 抖动持续时间随操作员而异,一般不大于 10ms。 抖动问题不解决就会引起对闭合键的错误识别 。
利用硬件很容易消除抖动,如图 11.16的硬件消抖电路所示。
三、抖动和重键问题图 11.16 抖动和硬件消抖电路所谓重键就是指两个或多个键同时闭合。 出现重键时,读取的键值必然出现有一个以上的 0。于是就产生了到底是否给予识别哪一个键的问题。
对重键问题的处理,简单的情况下,
可以不予识别,即认为重键是一个错误的按键 。
通常情况,则是只承认先识别出来的键,对此时同时按下的其它键均不作识别,直到所有键都释放以后,才读入下一个键,称为 连锁法 。 另外还有一种 巡回法,它的基本思想是:等被识别的键释放以后,就可以对其它闭合键作识别,而不必等待全部键释放 。 显然 巡回法比较适合于快速键入操作 。
LED数码管的主要部分是七段发光二极管
,如图 11.17( a) 所示 。 这七段发光二极管分别称为 a,b,c,d,e,f,g,有的产品还附带有一个小数点 h,通过 7个发光段的不同组合,可以显示 0~ 9和 A~ F共 16个字母数字或其它异形字符 。
11.2.3 8255A与 LED数码管接口一,LED数码管的工作原理
LED数码管有共阳极、共阴极两种结构,
如图 11.17(b)和 (c)所示。表 11.4表示了共阴极与共阳极结构字符 0~ F的编码表。编码的低位为 a,高位为 g。
由于发光二极管发光时,通过的平均电流为 10mA~ 20mA,而通常的输出锁存器不能提供这么大的电流,所以 LED各段必须接驱动电路,如图 11.17(d)所示 。
(a)数码管外型图 11.17 LED数码管
(b)共阳极结构
(d) 与 8255A的连接(c) 共阴极结构图 11.17 LED数码管显示数字编码共阴极 共阳极
0 3FH C0H
1 06H F9H
2 5BH A4H
3 4FH B0H
4 66H 99H
5 6DH 92H
6 7DH 82H
7 07H F8H
8 7FH 80H
9 67H 98H
A 77H 88H
B 7CH 83H
C 39H C6H
D 5EH A1H
E 79H 86H
F 71H 8EH
10 80H 7FH
表 11.4七段 LED编码表为了将一个十六进制数在一个 LED上显示出来,就需要将十六进制数译为 LED的 7位显示代码 。 一种方法是 采用专用的带驱动的
LED段译码器,实现 硬件译码 。 另一种常用的方法是软件译码 。 在程序设计时,将 0~ F
这 16个数字 ( 也可为 0~ 9) 对应的显示代码组成一个表 。
比如,用共阴极数码管如图 11.17(d)所示连接,则 0的显示代码为 3FH,1的显示代码为 06H,…,并在表中按顺序排列,则要显示的数字可以很方便地通过 8086的换码指令译码为该数字对应的显示代码 。
1位数字的 LED显示程序如下:
MOV BX,OFFSET BUFDATA ;BUFDATA区存放数字
MOV AL,[BX] ;取出要显示的数字
MOV BX,OFFSET TABLE ;取显示代码表首地址
XLAT ;换码为显示代码
MOV DX,PORT ;PORT为与数码管;相接的端口地址
OUT DX,AL ;输出显示
……
TABLE DB 3FH,06H,5BH,… ; 显示代码表实际使用时,往往要用几个数码管实现多位显示。如果每一个数码管占用一个独立的输出端口,将占用太多的通道,驱动电路的数目也很多。
图 11.18是多位显示的接口电路示意图,这是一种常用的方案。在这种方案中,硬件上用公共的驱动电路来驱动各数码管;软件上用扫描方法实现数字显示 。
二、多位显示反相驱动器位控制端口同相驱动器段控制端口图 11.18 多位数码管显示接口示意图从图中可以看到,用 2个 8位输出端口就可以实现 8个数码管的显示控制 。 其中,一个端口用作位控制,即控制哪个 ( 位 ) 数码管显示 。
对于图 11.18的共阳极数码管,当位控制端口的控制码某位为低电平时,经反相驱动,便在相应的数码管的阳极加上了高电平,这个数码管就可以显示数据 。
但具体显示什么数码,则由另一个端口,
即段控制端口决定。段控制端口通过段驱动电路送出显示代码到数码管响应段。此端口由 8个数码管共用,因此当 CPU送出一个显示代码时,
各数码管的阴极都收到了此代码。但是,只有位控制码中为低的位所对应的数码管才显示数字,其它管子并不发光。
综上所述,只要 CPU通过段控制端口送出段代码,然后通过位控制端口送出位代码,指定的数码管便显示相应的数字 。
如果 CPU顺序地输出段码和位码,依次让每个数码管显示数字,并不断地重复,当重复频率达到一定程度,利用人眼的视觉暂留特性,从数码管上便可见到相当稳定的数字显示 。
程序设计时可以开辟一个 BUFDATA缓冲区,依次存放要显示的数字 。 还需要建立一个显示代码表 TABLE,依次存放 0~ F对应的七段显示代码 。 显示代码是和硬件连接有关的,
在图 11.18的接口电路中,数字 0的显示代码为
C0H,1的显示代码为 F9H,… 。
下面是一段将 8位数码管依次显示一遍的子程序 。
MOV DI,OFFSET BUFDATA ;指向数字缓冲区
MOV CL,0FEH ;指向最右边数码管
DISP,MOV AL,[DI] ;取出数字
MOV BX,OFFSET TABLE ;指向显示代码表
XLAT ;得到显示代码
MOV DX,SEGPORT ;SEGPORT为段控制端口
OUT DX,AL ;送出段码
MOV AL,CL ;取出位显示代码
MOV DX,BITPORT ;BITPORT为位控制端口
OUT DX,AL ;送出位码
CALL DELAY ;延时 1ms,让数码管有充分的点亮时间
INC DI ;指向下一个数字
ROL CL,1 ;指向下一个数码管
CMP CL,0FEH ;是否指向最右边的数码管
JNZ DISP ;没有,显示下一个数字
RET ;8位数码管都显示一遍,返回
TABLE DB 0C0H,0F9H,0A4H,0B0H ;显示代码表
DB 99H,92H,82H,0F8H
DB 80H,98H,88H,83H
DB 0C6H,0A1H,86H,8EH
BUFDATA DB 8 DUP(0) ;数字缓冲区例,设 8255A的端口地址为 344H~347H。 由 16个按键组成 4?4矩阵式键盘,编写程序读取按键 (定义键值为 0~F)将键值写入输出口,在数码管上显示,以观察输入的键位 。
电路图如图所示。
11.2.4 8255A与键盘 /LED接口
8255A与键盘和 LED连接电路
8255A
PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7
PC7
PC6
PC5
PC4
PC3
PC2
PC1
PC0
LED3 LED2 LED1 LED0
+5V
D0~ D7D0~ D7
RD
WR
A0
A1
RST
CS
IOR
IOW
A0
A1
Reset
Y1
程序流程如下:
开始在 CRT上显示提示信息写 8255A控制字 80H
字型码送 B口延时且关指示灯写 8255A控制字 88H
有键按下行扫描键盘列扫描键盘延时消抖等待释放
S1~S4按下否退 出
Y N
NY
流程图相应程序如下:
DATA SEGMENT
disc DB 0BBH,0A0H,097H,0B5H,0ACH,3DH
DB 3FH,0A1H,0BFH,0BDH,0AFH,3EH,0B6H
DB 1FH,0FH ; 0~f 显示段码表
DISO DB? Press any of the keys to quit !?,24H; 提示信息
DQQ DB 0
DATA Ends
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE DS:DATA
START,MOV AL,3 ; 清屏幕
MOV AH,0
INT 10H
MOV AX,DATA ; 显示提示信息
MOV DS,AX
MOV AH,2 ; 光标定位
MOV BH,0
MOV DX,0614H
INT 10H
MOV DX,OFFSET DISO; 显示:,Press……”
QWE,MOV DX,347H ; 8255A控制寄存器初始化
MOV AL,80H ; B口,C口设为输出
OUT DX,AL
MOV DX,345H ; 345H为 8255A的 B口地址
MOV BL,DQQ
MOV BH,0
MOV DI,BX
MOV AL,[DI]; 取 ‘ 0~F’显示字形码
OUT DX,AL ; 将显示字形码送 B口
MOV DX,346H ; 8255A C口地址
MOV AL,0E0H
OUT DX,AL ;
MOV BX,DLYC1
LPO,MOV CX,DLYC2 ; 延时
LP1,LOOP LP1
DEC BX
JNZ LPO
KS,MOV DX,350H ; 指示灯显示
MOV AL,DQQ ; 按下键的二进制值
OUT DX,AL
MOV DX,347H ; 8255A初始化,写控制字 88H
MOV AL,88H ; PC0~PC3为输出,PC4~PC7为输入
OUT DX,AL ; B口输出,方式 0,A口输出。
KSLP,MOV DX,346H ; 读键盘
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JNE KP; 有键按下,转处理判别
MOV DX,350H ; 若键未按,查 S1~S4键是否退出
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JNE KPR ; S1~S4任一健按下,则转 KPR退出
JMP KSLP
KP,MOV CX,0F000H ; 扫描键盘
KP0,LOOP KP0 ; 消抖延时
MOV DX,346H
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JE KSLP ; 消抖后无键按下,则转回,视作干扰
MOV CX,0004H ; 扫描 4行
MOV DX,346H
MOV BX,0F700H ; BH扫描输出行码,先扫第 0行 (PC3=0); BL键值
KP1,MOV AL,BH ; 行扫描
OUT DX,AL
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JNE KP2 ; 是这一行的键按下,转出判断列
ADD BL,04H ; 键值加 4
ROR BH,1 ; 准备扫描下一行
LOOP KP1
JMP QWE ; 4行扫完未找到,转显示
KP2,MOV CX,0004H ; 扫描 4列
KP3,ROL AL,1 ; 列扫描
TEST AL,01
JZ KP4 ; AL=0,即是此列,转出
INC BL ; 键值加 1
LOOP KP3
KP4,MOV DQQ,BL ; 键盘送显示缓存
KS5,MOV DX,346H ; 等待键释放
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JNE KS5 ; 仍按下,继续等待
MOV CX,0F000H
KP6,LOOP KP6 ; 消抖延时
MOV DX,346H
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JNE KS5
JMP QWE ; 键处理结束
KPR,MOV AL,0 ; 退出
MOV DX,0350H ; 关所有的 LED灯
OUT DX,AL
MOV AX,4C00H
INT 21H
Main ENDP
CODE ENDS
END START