汇编语言实验14动态显示时间

汇编语言实验14动态显示时间

建议先自己思考问题的答案,不懂则返回看书

编程:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。

死循环法

assume cs:code
data segment
 db 9,8,7,4,2,0
data ends

code segment
start:
	mov bx,data
	mov ds,bx
	mov si,0

	mov bx,0b800h
	mov es,bx
	mov di,160*12+30*2

	mov cx,6
s0:
	push cx
	mov al,ds:[si]
	push ax
	inc si
	out 70h,al
	in al,71h

	mov ah,al
	mov cl,4
	shr ah,cl
	and al,00001111b

	add ah,30h
	add al,30h

	mov byte ptr es:[di],ah
	add di,2
	mov byte ptr es:[di],al
	add di,2

	pop ax
	cmp al,0
	je over

	cmp al,7h
	je kongge
	
	ja fanxiegang

	jb maohao

fanxiegang:
	mov ax,'/'
	jmp next
	
maohao:
	mov ax,':'	
	jmp next
	
kongge:
	mov ax,' '
	jmp next
	
next:
	mov byte ptr es:[di],al
	add di,2
over:
	pop cx
	loop s0

	jmp start		;产生死循环,再从头开始执行程序

mov ax,4c00h
int 21h
code ends
end start

中断例程法:(按键盘上的 ‘T’按键产生中断显示时间)

assume cs:code
code segment
start:
	push cs
	pop ds

	mov ax,0
	mov es,ax

	mov si,offset int9
	mov di,204h
	mov cx,offset int9ends-offset int9
	cld
	rep movsb

	push es:[9*4]
	pop es:[200h]
	push es:[9*4+2]
	pop es:[202h]

	cli
	mov word ptr es:[9*4],200h
	mov word ptr es:[9*4+2],0
	sti

mov ax,4c00h
int 21h

int9:	
	jmp short int9start
	data db 9,8,7,4,2,0
int9start:
	push ax
	push bx
	push cx
	push es
	push di
	push si

	in al,60h
	pushf
	call dword ptr cs:[200h]
	
	cmp al,14h	;T
	jne int9ret


	mov si,206h

	mov bx,0b800h
	mov es,bx
	mov di,160*12+30*2

	mov cx,6
s0:
	push cx

	push es
	mov bx,0
	mov es,bx
	mov al,es:[si]
	pop es
	
	push ax
	inc si
	out 70h,al
	in al,71h

	mov ah,al
	mov cl,4
	shr ah,cl
	and al,00001111b

	add ah,30h
	add al,30h

	mov byte ptr es:[di],ah
	add di,2
	mov byte ptr es:[di],al
	add di,2

	pop ax
	cmp al,0
	je over

	cmp al,7h
	je kongge
	
	ja fanxiegang

	jb maohao

fanxiegang:
	mov ax,'/'
	jmp next
	
maohao:
	mov ax,':'	
	jmp next
	
kongge:
	mov ax,' '
	jmp next
	
next:
	mov byte ptr es:[di],al
	add di,2
over:
	pop cx
	loop s0

int9ret:
	pop si
	pop di
	pop es
	pop cx
	pop bx
	pop ax
	iret
int9ends:
	nop

code ends
end start

下面是51单片机LED动态显示的实验汇编语言程序: ```assembly ORG 0H // 程序起始地址 MOV P0,#0FFH // P0口设置为输出状态,关闭LED灯 MOV P2,#0FH // P2口低四位设为输出状态,用于控制数码管 MOV R0,#0 // 初始化计数器为0 MAIN: MOV A,R0 // 将计数器存入累加器 ANL A,#0FH // 只保留低四位(个位) MOV P0,#0FFH // 关闭LED灯 MOV P2,#0FH // P2口低四位设为输出状态,用于控制数码管 JNB P3.2,DIS2 // 判断P3.2是否为0,若为0则跳转到DIS2 MOV P2,#0EH // P2口第二位设为0,控制数码管的L1引脚显示 JMP DISPLAY // 跳转到DISPLAY DIS2: MOV P2,#0DH // P2口第三位设为0,控制数码管的L2引脚显示 DISPLAY: MOV P0,#00H // 显示编码 MOV A,R0 // 将计数器存入累加器 ANL A,#F0H // 只保留高四位(十位) SWAP A // 高低四位交换 ORL A,#80H // 与80H或运算,使数码管显示小数点 MOV P0,A // 显示编码 ACALL DELAY // 延时 INC R0 // 计数器加1 CJNE R0,#10H,MAIN // 判断计数器是否为10,若不为10则跳转到MAIN SJMP MAIN // 若计数器为10则跳转到MAIN DELAY: MOV R1,#0FFH // 初始化R1为FFH AGAIN: MOV R2,#0FFH // 初始化R2为FFH AGAIN1: DJNZ R2,AGAIN1 // R2自减,若R2不为0,则跳转到AGAIN1 DJNZ R1,AGAIN // R1自减,若R1不为0,则跳转到AGAIN RET // 延时结束,返回 ``` 此程序使用了共阴极数码管显示0~9的编码,通过循环动态显示0~9,每次循环调用显示函数,在显示函数中获取十位和个位上的数,然后依次显示出来。其中,延时函数用于控制显示时间。汇编语言相对于C语言来说,更加底层,更加灵活,但是需要掌握更多的指令和语法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值