📄 clock.asm
字号:
data segment para'data'
port equ 280h
port_led equ 2b0h
old_0b dw 0,0
time db 2,3,5,9,5,0
old_8259 db 0
code_led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
data ends
sstack segment stack'stack'
db 256 dup(?)
sstack ends
code segment
assume cs:code,ds:data,ss:sstack,es:data
main proc far
mov ax,data
mov es,ax
mov ds,ax
mov al,00110110b ;初始化8253,选择计数器0,LSB,MSB,方式3,2进制计数
mov dx,port+3
out dx,al
mov ax,1000
mov dx,port
out dx,al
mov al,ah
out dx,al
mov al,01110110b ;选择计数器1,LSB,MSB,方式3,2进制计数,与计数器0级联
mov dx,port+3
out dx,al
mov ax,1000
mov dx,port+1
out dx,al
mov al,ah
out dx,al
mov ax,350bh ;保护原中断
int 21h
mov old_0b,bx
mov old_0b+2,es
push ds
mov ax,250bh ;设置新中断
mov dx,offset int_0b
mov bx,seg int_0b
mov ds,bx
int 21h
pop ds
in al,21h
mov old_8259,al ;保存当前中断屏蔽标志
and al,11110111b ;清除中断屏蔽位
out 21h,al
sti ;开中断
display:mov si,0 ;显示时间
mov bl,00000001b ;用于数码管位选
display1:
mov dx,port_led
mov al,bl
out dx,al
mov dx,port_led+1
mov al,time[si] ;选择小时、分、秒
mov ah,0
mov di,ax
mov al,code_led[di] ;显示小时、分、秒
out dx,al
call delay ;延时
rol bl,1 ;左旋bl
inc si
cmp al,10000000B
jz display ;显示完秒的低位,继续循环显示
jmp display1
mov ah,1
int 16h
jnz old_int ;有键按下,恢复原中断
jmp display1
old_int:
cli ;关中断
push ds ;恢复原中断
mov dx,old_0b
mov ax,old_0b+2
mov ds,ax
mov ax,250bh
int 21h
pop ds
mov al,old_8259 ;恢复原中断屏蔽标志
out 21h,al
mov ah,4ch
int 21h
main endp
int_0b proc far ;中断服务程序
cmp time+5,9 ;比较秒的低位
je a1
inc time+5 ;加一秒
jmp exit
a1:
mov time+5,0
inc time+4 ;加十秒
cmp time+4,6 ;比较秒的高位
jne exit
mov time+4,0
inc time+3 ;加一分
cmp time+3,10 ;比较分的低位
jne exit
inc time+2 ;加十分
mov time+3,0
cmp time+2,6 ;比较分的高位
jne exit
inc time+1 ;加一小时
mov time+2,0
cmp time,2 ;比较时的高位
je a2
cmp time+1,4 ;比较时的低位
jne exit
inc time ;加十小时
mov time+1,0
jmp exit
a2:
cmp time+1,4
jne exit
mov time,0
mov time+1,0
exit:
mov al,20h ;EOI,结束中断
out 20h,al
iret
int_0b endp
delay proc near ;延时子程序
mov ax,0066h
d2: mov dl,0ffh
d1: dec dl
jnz d1
dec ax
jnz d2
ret
delay endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -