📄 时钟.asm
字号:
;*******************************;
;* 用中断方式获取8253的1秒钟计时,实现00~59循环计数 *;
;*******************************;
data segment
io8255a equ 28ah ;C
io8255b equ 28bh
io8255c equ 288h ;A
io8255d equ 289h ;B
io8253a equ 280h
io8253b equ 281h
io8253c equ 283h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buffer1 db 0,0 ;存放要显示的十位和个位
bz dw ? ;位码
data ends
code segment
assume cs:code,ds:data
start:
mov ax,cs
mov ds,ax
mov dx,offset int3
mov ax,250bh
int 21h
in al,21h
and al,0f7h
out 21h,al
mov dx,io8253c ;向8253写控制字
mov al,36h ;使0通道为工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,io8253a
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
mov dx,io8253c
mov al,76h ;设8253通道1工作方式2
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,io8253b
out dx,al ;先写低字节
mov al,ah
out dx,al ;后写高字节
disp:
mov ax,data
mov ds,ax
mov dx,io8255b ;将8255设为A口输出,B口输入
; mov al,80h ;1000 0000
mov al,82h ;1000 0010
out dx,al
mov di,offset buffer1 ;设di为显示缓冲区
ll:loop ll
loop1: mov bh,02
lll: mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di] ;bl为要显示的数
pop di
mov bh,0
mov si,offset led ;置led数码表偏移地址为SI
add si,bx ;求出对应的led数码
mov al,byte ptr [si]
mov dx,io8255c ;自8255A的口输出
out dx,al
mov al,byte ptr bz ;使相应的数码管亮
mov dx,io8255a
out dx,al
push cx
mov cx,100
delay: loop delay ;延时
pop cx
mov al,00h
out dx,al
mov bh,byte ptr bz
shr bh,1
jnz lll
jmp loop1 ;循环延时
sti
int3:
mov ax,word ptr [di]
cmp ah,05
jnz set
cmp al,09
jnz set
mov ax,0000
mov [di],al
mov [di+1],ah
jmp OUT1
set:
mov ah,01
int 16h
jne exit ;有键按下则转exit
mov ax,word ptr [di]
inc al
aaa
mov [di],al ;al为十位
mov [di+1],ah ;ah中为个位
OUT1:
mov al,20h
out 20h,al
jmp next
in al,21h
or al,08h
out 21h,al
sti
exit:
mov ah,4ch
int 21h
next: iret
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -