8255A应用举例必看
从电路中可以得出,8255A 4个端口的地址 分别是: 340H(PA端口)、 344H (PB端口) 348H (PC端口)、 34CH(控制口)
程序的设计思路是先通过PB端口选中某个数 码管(使其公共端为低电平),然后再从PA端 口输出选中的数码管所对应的显示码,在完成当 前数码管显示后,显示下一个数码管,在完成一 轮显示后,开始下一轮的显示。
图2-2 用74LS138译码器实现8255的片选电路
用一片8255A连接8个7段数码管。且使8个7 段数码管显示8个不同的数字。开始,似乎感到 有点困难。实际上,任何时刻只显示一个7段数 码管,其余7个7段数码管都没有显示状态,CPU 通过8255A逐个显示7段数码管,并在不同的7段 数码管上显示不同的数字。在逐个显示完8个数 码管后,又开始新一轮的逐个显示过程,当这个 循环周期间隔足够短时,由于人的眼睛有滞后效 应,使得人们发现每一个数码管都出于显示状态, 且显示不同的数字。
data segment org 100h buff1 db 3fh, 30h, 5bh, 4fh,66h,6dh,7dh,07h ;定义0~7 的显示码 buff2 db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,7fh ;定义位码 data ends code segment assume cs:code,ds:data start: mov dx, 34Ch ;设置8255控制端口地址 mov al, 80h ;使8255的A口、B口、C口为方式0输出 out dx, al yyy1:mov si, offset buff1 ;设置显示码指针 mov di, offset buff2 ;设置控制码指针 mov cx, 8 ;每一轮循环中显示的数码管的数目
而A3、A2 的组合和各个端口地址的关 系也如上所示,由于A1、A0没有参与译码, 其值对访问端口没有影响。综合以上讨论可 以得出, PA 、PB、 PC和控制端口的地址 分别是260H、 264H、 268H和 26CH。
在确定工作方式控制字时必须知道, PA端口为方式0输出, PB端口为方式0输 入,而PC端口没有参与电路工作,其输入 输出方式随意,由此可确定控制字为82H。 10000010
示数字0~7的程序。
解:在设计电路前,首先要了解7段数码管,掌握数码管显示 数字的原理。 图2-1给出了共阴极7段数码管逻辑结构图。
a
a b
f
b g c d a b c d e f g
e
c
e f comd来自gcom (a)7段发光二极管标号 (b)对应电路图 (c)引脚分布
图2-1 共阴极7段数码管逻辑结构
一片8255A只需4个端口地址,而题中给出的 地址范围由16个地址,这意味着低4位地址中有 些地址可以不参加地址译码。设计电路的第一部 还需要设计出片选电路。必须用指定地址范围内 状态不变的地址信号作为片选电路的输入信号。 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 1 1 0 1 0 0 0 0 0 0 340H 1 1 0 1 0 0 1 1 1 1 34FH
首先根据电路确定8255A 4个端口的 地址。确定端口地址用下述方法进行,为 了能够访问8255A,必须使8255A的片选 信号CS=0, A9~A4的信号必须如下: A9 A8 A7 A 6 A5 A4 A3 A2 1 0 0 1 1 0 0 0 PA端口 0 1 PB端口 1 0 PC端口 1 1 控制端口
控制电路工作并使其保证开关状态和 发光二极管亮灭一致的程序如下: MOV DX,26CH MOV AL, 82H OUT DX,AL MOV DX,264H IN AL,DX NOT AL MOV DX,260H OUT DX,AL
例2:
用一片8255A连接8个7段数码显示管,规定8255A的
端口地址范围为340H~34FH,用74LS138译码器实现 8255A的片选电路,并根据电路编写在8个7段数码管上显
图2-2中,用A6、A5、A4 分别连接74LS138的
G 、 G2A 、G2B, 只有当A6A5A4 =100时
74LS138才能进行译码操作,用A9 、A8、 A7
分别 连接74LS138的C、B、A,而用Y6输出连接 8255的CS,这样,只有当A9 A8A7=110 时, Y6输出为低电平。
例1 :CPU通过8255A控制8个开关和发光二
极管,要求发光二极管的亮灭和开关状态一 致,设计电路并编写程序。
解析:可以认为,处于方式0输出工作状态 的PA、PB、PC端口实际上等同一个锁存 器,而处于方式0输入工作状态的PA、 PB、PC端口实际上等同一个缓冲器。 电路如图所示。
图1 8255控制开关、发光二极管电路
yyy2: mov dx, 340h mov al , 0 out dx, al mov dx , 344h mov al, [di] out dx, al mov dx, 340h mov al, [si] out dx, al inc si inc di loop yyy2 jmp yyy1
;先使所有数码管变黑
从图2-1可以看出。当com端接低电平,a~g端 接高电平,对应的发光二极管就发亮。 如果想在7段数码管上显示数字0,需要在com 端接低电平,a 、 b 、 c 、 d 、 e 、f端接高电平, g端接低电平。 七段数码管的字形代码表如下:
显示字形 0 1 2 3 4 5 6 7 g 0 0 1 1 1 1 1 0 f 1 1 0 0 1 1 1 0 e 1 1 1 0 0 0 1 0 d 1 0 1 1 0 1 1 0 c 1 0 0 1 1 1 1 1 b 1 0 1 1 1 0 0 1 a 1 0 1 1 0 1 1 1 段码 3fh 30h 5bh 4fh 66h 6dh 7dh 07h
从上述分析中可以看出,指定地址范围内状态 不变的地址信号是A9 A8 A7 A6 A5 A4 它们的状 态分别是110100,这意味着A9~ A4上出现的信号 状态为110100,8255 A的CS必须为低电平。 下面讨论如何用74LS138译码器实现这一功能。 设计片选电路的基本原则是:用A9~ A4作为 74LS138的输入,用74LS138其中一个输出Yi去连 接8255的CS,当且仅当 A9~ A4=110100时, Yi才能变为低电平。
;选中一个数码管
;输出该数码管对应的显示码
;选择下一个数码管所对应的显示码 ;选择下一个数码管
; 显示下一个数码管
;开始新的一轮的显示
mov ah, 4ch int 21h code ends end start