1、实验目的:要求掌握8255芯片的工作原理、初始化、编程应用。
2、实验原理:通过端口A和端口B的输出实现数字在数码管的显示。
3、实验内容:修改或自己编写程序将自己学号分三次、间隔1秒显示出来。
提示:多个数码管同时显示可以通过设置余辉时间实现.
程序及解释如下:
Data segment
PortA equ 404H ;8255的PA口地址
xz db 0f9h,92h,0c0h,92h
qs db 0c0h,0b0h,0c0h,0b0h
qd db 0f9h,90h
s db "Display a b c d at the same time. Press any key to exit...",0dh,0ah,"$" ;程序功能提示
Data ends
Code segment
assume cs:code,ds:data
Start:mov ax,data
mov ds,ax
mov dx,offset s ;显示提示
mov ah,9
int 21h
mov dx, PortA+3
mov al,80H
out dx,al ;PA、PB口初始化为基本输出方式
L0: lea si,xz ;将xz地址给si
mov ah,08h ;置位选初值,从左边开始显示
L1: push ax ; 栈堆指令,数据进桟
mov al,[si] ;显示数字
mov dx,PortA
out dx,al
mov al,ah
mov dx,PortA+1 ;地址加一
out dx,al ;到端口dx
call de; 延时
inc si; 准备显示下一数字
pop ax ;栈堆指令,将数据打出
shr ah,1; 选择下一数码管
cmp ah,0; 判断是否显示完"d"
jnz l1
shr ah,1 ; 选择下一数码管
push ax ;栈堆指令,数据进桟
mov dx,PortA
out dx,al
mov al,ah
mov dx,PortA+1
out dx,al
pop ax;栈堆指令,将数据打出
call de
L2: lea si,qs
mov ah,08h ;置位选初值,从左边开始显示
L3: push ax;栈堆指令,数据进桟
mov al,[si] ;显示数字
mov dx,PortA
out dx,al
mov al,ah
mov dx,PortA+1
out dx,al
call de; 延时
inc si; 准备显示下一数字
pop ax;栈堆指令,将数据打出
shr ah,1; 选择下一数码管
cmp ah,0; 判断是否显示完"d"
jnz l3
shr ah,1
push ax;栈堆指令,数据进桟
mov dx,PortA
out dx,al
mov al,ah
mov dx,PortA+1
out dx,al
pop ax;栈堆指令,将数据打出
call de
L4: lea si,qd
mov ah,08h ;置位选初值,从左边开始显示
L5: push ax;栈堆指令,数据进桟
mov al,[si] ;显示数字
mov dx,PortA
out dx,al
mov al,ah
mov dx,PortA+1
out dx,al
call de; 延时
inc si; 准备显示下一数字
pop ax;栈堆指令,将数据打出
shr ah,1; 选择下一数码管
cmp ah,2; 判断是否显示完"d"
jnz l5
shr ah,1
shr ah,1
push ax
mov dx,PortA
out dx,al
mov al,ah
mov dx,PortA+1
out dx,al
pop ax;栈堆指令,将数据打出
call de
jmp l0
Exit:mov ah,4ch ; 结束程序
int 21h
de proc near ; 循环延时子程序
push cx
push bx
mov cx,0000H
d1: mov bx,9f00h
d2: dec bx
jnz d2
loop d1
pop bx;栈堆指令,将数据打出
pop cx;栈堆指令,将数据打出
ret
de endp
Code ends
end Start