a79bc531-a6e5-4954-a9fe-734f8277d391
例1:
CPU通过8255A控制8个开关和发光二极管,要求发光二极管的亮灭和开关状态一致,设计电路并编写程序。
答:可以认为,处于方式0输出工作状态的PA、PB、PC端口实际上等同一个锁存器,而处于方式0输入工作状态的PA、PB、PC端口实际上等同一个缓冲器。
8255控制开关、发光二极管电路如图所示:
首先根据电路确定8255A 4个端口的地址。确定端口地址用下述方法进行,为了能够访问8255A,必须使8255A的片选信号CS=0, A9~A4的信号必须如下:
A9 A8 A7 A6 A5 A4 A3 A2
1 0 0 1 1 0 0 0 PA端口
0 1 PB端口
1 0 PC端口
1 1 控制端口
而A3、A2 的组合和各个端口地址的关系也如上所示,由于A1、A0没有参与译码,其值对访问端口没有影响。综合以上讨论可以得出, PA 、PB、 PC和控制端口的地址分别是260H、 264H、 268H 和 26CH。
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 1 1 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0
1 0 0 1 1 0 1 0 0 0
1 0 0 1 1 0 1 1 0 0
在确定工作方式控制字时必须知道, PA端口为方式0输出, PB端口为方式0输入,而PC端口没有参与电路工作,其输入输出方式随意,由此可确定控制字为 1 0 0 0 0 0 1 0(82H)。
控制电路工作并使其保证开关状态和发光二极管亮灭一致(开关闭合,发光二极管亮,开关断开,发光二极管灭)的程序如下:
MOV DX, 26CH
MOV AL, 82H
OUT DX, AL 计数器0送控制字
MOV DX, 264H
IN AL, DX 将端口的数据输入到AL中
NOT AL AL 取反运算
MOV DX, 260H
OUT DX, AL 将AL的数据输出到DX中
例二:
用一片8255A连接8个7段数码显示管,规定8255A的端口地址范围为340H~34FH, 用74LS138译码器实现8255A的片选电路,并根据电路编写在8个7段数码管上显示数字0~7的程序。
共阴极7段数码管逻辑结构图如下:
如图所示:当com端接低电平,a~g端接高电平,对应的发光二极管就发亮。
如果想在7段数码管上显示数字0,需要在com端接低电平,a 、 b 、 c 、 d 、 e 、f端接高电平,g端接低电平。
七段数码管的字形代码表如下:
一片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 0 0 0 1 341H
1 1 0 1 0 0 0 0 1 0 342H
1 1 0 1 0 0 0 0 1 1 343H
1 1 0 1 0 0 0 1 0 0 344H
...
...
...
1 1 0 1 0 0 1 1 1 1 34FH
从上述分析中可以看出,指定地址范围内状态不变的地址信号是A9 A8 A7 A6 A5 A4 它们的状态分别是110100,这意味着A9~A4上出现的信号状态为110100,8255A的CS必须为低电平。
下面讨论如何用74LS138译码器实现这一功能。
设计片选电路的基本原则是:用A9~A4作为74LS138的输入,用74LS138其中一个输出Yi去连接8255的CS,当且仅当 A9~A4=110100时,Yi才能变为低电平。
下图(用74LS138译码器实现8255的片选电路)中,用A6、A5、A4 分别连接74LS138的 G、 /(G2A ) 、/(G2B ) , 只有当A6 A(5 ) A4 =100时74LS138才能进行译码操作,用A9、A8、A7分别 连接74LS138的C、B、A,而用Y6输出连接8255的CS,这样,只有当A9 A8 A7=110时,Y6输出为低电平。
用一片8255A连接8个7段数码管。且使8个7段数码管显示8个不同的数字。开始,似乎感到有点困难。实际上,任何时刻只显示一个7段数码管,其余7个7段数码管都没有显示状态,CPU通过8255A逐个显示7段数码管,并在不同的7段数码管上显示不同的数字。在逐个显示完8个数码管后,又开始新一轮的逐个显示过程,当这个循环周期间隔足够短时,由于人的眼睛有滞后效应,使得人们发现每一个数码管都出于显示状态,且显示不同的数字。
从电路中可以得出,8255A 4个端口的地址分别是:
340H(PA端口)、 344H (PB端口)
348H(PC端口)、 34CH (控制口)、
程序的设计思路是先通过PB端口选中某个数码管(使其公共端为低电平),然后再从PA端口输出选中的数码管所对应的显示码,在完成当前数码管显示后,显示下一个数码管,在完成一轮显示后,开始下一轮的显示。
工作方式控制字: 10000000(80H)
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 ax, data
mov ds, ax ;初始化ds
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 ;每一轮循环中显示的数码管的数目
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 ;开始新的一轮的显示
code ends
end start