实验内容二:
将8255A的A口最为数据输出端口连接七段数码管的输入端,编程使数码管上循环显示0-9
已知一个能显示0-99的程序,删减一部分,使其符合题目要求:
带注释的asm代码文件:链接:https://pan.baidu.com/s/15-BTKKfINvzuusUOuc3e3A 提取码:2pqi
直接给代码了,里面注释很清楚:
data segment ;数据段开始
ioc equ 28ah ;c口的地址
ioCon equ 28bh ;控制口地址
ioa equ 288h ;a口地址
lednum db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;数码管显示
bz dw ?
data ends ;数据段结束
code segment ;代码段开始
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax ;把数据段中的数据送到ds中,不可省略ax
mov dx,ioCon
mov al,80h
out dx,al ;把80h,送至控制口.......1000,0000 表示方式控制字格式,A口为模式0,输出,b,c不用默认为0
again:
mov ax,0 ;ax清零为下面做准备
mov cx,100 ;sum循环次数
sum:
push cx ;保护cx
mov bx,0 ;bx清零
mov bl,al
lea si, lednum ;数码管取首地址
mov cl,[bx+si] ;cl控制个位上的显示
mov bl,ah
mov ch,[bx+si] ;ch控制十位上的显示 法一:将此处删去
call display ;调用显示程序
add ax,1 ;ax++
aaa ;这个aaa指令才是最重要的,因为aaa指令就是改变ax里的值,意思就是al的取值范围就是0~9(低四位可变,高四位为0),再多的话就要进位到ah中,其他功能的话,自行百度
push ax
mov ah,1
int 16h ;读取普通键盘的状态 无输入zf=1,否则zf=0
jne exit ;键盘有输入,则退出
pop ax
pop cx
loop sum
jmp again ;循环
exit:
mov ax,4C00H
int 21H ;中断退出
display proc ;显示子程序
push ax
push bx
push cx
push dx ;有些多余,直接pusha就行
mov bx,cx ;控制的数码管转给bx,此时bl为个位,bh为十位
mov cx,100h
dis1:
mov dx,ioa
mov al,0
out dx,al
mov dx,ioC
mov al,1
out dx,al
mov dx,ioa ;至于为什么要把这些数据送到a,c口,结合工作方位格式分析
mov al,bl
out dx,al ;个位的控制
call delay
mov dx,ioa
mov al,0
out dx,al
mov dx, ioC
mov al,02
out dx,al
mov al,bh
mov dx,ioa
out dx,al ;十位的控制
call delay
loop dis1
pop dx
pop cx
pop bx
pop ax
ret
display endp
delay proc ;延迟一部分
push cx
mov cx,10
n:
nop
loop n
pop cx
ret
delay endp
code ends
end start