📄 复件200708311058 jiaotongdeng.asm
字号:
.model small
.stack
.data
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buf db 3,0 ;存放要显示的十位和个位
;
intseg dw ?
intoff dw ?
intimr db ?
.code
.startup
start:
mov dx,28bh ;将8255设为A和C口输出
mov al,80h ;1000 0000b
out dx,al
mov al,0 ;关掉数码管显示
mov dx,288h ;port C --28ah
out dx,al
;
mov ax,350bh ;中断设置 --ES:BX IRQ3
int 21h
mov intseg,es
mov intoff,bx
cli
push ds
mov dx,offset intproc
mov ax,seg intproc
mov ds,ax
mov ax,250bh
int 21h
pop ds
in al,21h
mov intimr,al ;保存原来的中断屏蔽字
and al,0f7h ;允许IRQ3
out 21h,al
;
mov dx,283h ;向8253写控制字
mov al,36h ;使通道0为工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,280h
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
;
mov dx,283h
mov al,76h ;设8253通道1工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,281h
out dx,al ;先写低字节
mov al,ah
out dx,al ;后写高字节
;
sti
;主程序
mov dx,28ah
again1:
in al,dx
and al,18h
or al,24h
out dx,al
again11:
call disp
cmp buf,0h
ja again11
cmp buf+1,0h
ja again11
mov cx,5
mov buf,0
mov buf+1,3
again12:
cmp cx,0
jne again121
mov cx,5
in al,dx
and al,0dfh
xor al,40h
out dx,al
again121:
call disp
dec cx
cmp buf,3h
jne again12
cmp buf+1,0h
jne again12
;
again2:
in al,dx
and al,18h
or al,81h
out dx,al
again21:
call disp
cmp buf,0h
ja again21
cmp buf+1,0h
ja again21
mov cx,5
mov buf,0
mov buf+1,3
again22:
cmp cx,0
jne again221
mov cx,5
in al,dx
and al,0feh
xor al,02h
out dx,al
again221:
call disp
dec cx
cmp buf,3h
jne again22
cmp buf+1,0h
jne again22
jmp again1
;
;显示程序
disp proc
push ax
push bx
push cx
push dx
mov bl,buf ;bl为要显示的数
mov bh,0
mov al,led[bx] ;求出对应的led数码
mov dx,288h ;自8255A的口输出
out dx,al
mov dx,28ah ;使左边的数码管亮
in al,dx
or al,10h
out dx,al
mov cx,3000 ;延时
delay1:
loop delay1
;
mov dx,28ah ;关掉数码管显示
in al,dx
and al,0efh
out dx,al
;
mov bl,buf+1 ;bl为要显示的数
mov bh,0
mov al,led[bx] ;求出对应的led数码
mov dx,288h ;自8255A的口输出
out dx,al
mov dx,28ah ;使右边的数码管亮
in al,dx
or al,08h
out dx,al
mov cx,3000 ;延时
delay2:
loop delay2
;
mov dx,28ah ;关掉数码管显示
in al,dx
and al,0f7h
out dx,al
;
mov ah,0bh
int 21h
test al,al
je retp ;无键按下则正常退出显示程序
;有键按下退出所有程序
mov al,0 ;关掉数码管显示
mov dx,28ah
out dx,al
cli
mov al,intimr
out 21h,al
mov dx,intoff
mov ax,intseg
mov ds,ax
mov ax,250bh
int 21h
sti
.exit ;返回
retp:
pop dx
pop cx
pop bx
pop ax
ret
disp endp
;0bh的定时中断服务程序
intproc proc
sti
push ax
push ds
;
mov ax,@data
mov ds,ax
;
mov al,buf+1 ;秒数减1
mov ah,buf
cmp al,0
ja intp3
cmp ah,0
ja intp2
mov ah,3
jmp intp1
intp2:
dec ah
mov al,9
jmp intp1
intp3:
dec al
intp1:
mov buf+1,al
mov buf,ah
;
mov al,20h
out 20h,al
pop ds
pop ax
iret
intproc endp
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -