data segment
s1 db 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;0~F
time dw ?
x db 45 ;延迟倒计时时间
y dw 20000 ;延迟输入显示时间
data ends
stack segment para stack
db 64 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov dx,66h ;8255控制器端口地址
mov al,10000011B ;方式0,A输出,B输入,C输入
out dx,al ;输出控制字
mov time,0
mov bx,offset s1
begin:
mov dx,62h
in al,dx ;输入
cmp al,0f0H
jne shuru
mov dx,64h
cmp al,0FEh ;al与1111 1110H比较,判断PC0(开始)是否工作
jne begin ;没工作,跳到begin
k1:
mov dx,64h ;c口
in al,dx ;c口输入
cmp al,0dfh ;al与1111 1101H比较,判断PC1(复位)是否工作
je k2 ;相等,执行复位功能,跳到K2
mov dx,64h ;c口
in al,dx ;c口输入
cmp al,0bfh ;al与1111 1011比较,判断PC2(暂停)是否工作
je k3 ;相等,执行暂停功能,一直输出当前的数,跳到K3
call shuchu ;输出当前数字
dec x ;延时,直到x减到0时继续执行
jnz k1 ;判断x等不等于0
mov x,45 ;time每减次1,都需要延时,重新赋值x=45
dec time ;倒计时
jz k2 ;判断倒计时结没结束
jmp k1
k2:
mov time,0 ;复位就是将time变成0,输出
call shuchu
jmp begin
k3:
call shuchu ;暂停就是一直输出当前数字
mov dx,64h
mov dx,64h ;c口
in al,dx ;c口输入
cmp al,0bfh ;al与1111 1011比较,判断PC2(暂停)工没工作
je k3 ;工作继续执行
jmp k1 ;不工作,回到最开始,继续倒计时
shuru:
mov dx,62h
in al,dx
a:
dec y ;显示输入的延迟
jnz a ;延时结没结束
mov y,20000 ;再赋值
call shuchu ;输出
jmp begin
shuchu proc
mov dx,al
xlat ;xlat查表功能。
mov dx,60h ;a口
out dx,al ;输出a口
call delay ;延迟灯亮
ret
shuchu endp
delay proc near
push bx ;两次循环延时
push cx ;10次0ffh~0
mov bx,10
t0: mov cx,0ffh
t1: loop t1
dec bx
jnz t0
pop cx
pop bx
ret
delay endp
code ends
end start