实验四 并行接口芯片8255A实验

实验内容二:

将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



发布了29 篇原创文章 · 获赞 13 · 访问量 2746

猜你喜欢

转载自blog.csdn.net/zmx2473162621/article/details/103533216