📄 电子时钟.asm
字号:
.model small
.386
.data
keep21 db ?
count db ?
mess1 db 'Input the time like hh:mm:ss',0dh,0ah,'$'
string db 12,?,9 DUP(0),0dh,0ah,'$'
timetable1 db 12,?,9 DUP(0),0dh,0ah,'$'
timetable2 db 12,?,9 dup(0),0dh,0ah,'$'
string2 db 'Input your timetable1',13,10,'$'
string4 db 'Input your timetable2',13,10,'$'
string3 db 13,10,'$'
time db 0f3h,60h,0b5h,0f4h,066h,0d6h,0d7h,070h,0f7h,0f6h
sound db 0
.stack
.code
start:
mov ax,@data
mov ds,ax
mov dx,offset mess1 ;输出提示语句
mov ah,09h
int 21h
mov ah,0ah ;以字符串形式将输入的时间值存入数据区
mov dx,offset string
int 21h
mov dx,offset string3 ;输出提示语句
mov ah,09h
int 21h
mov dx,offset string2
mov ah,09h
int 21h
mov ah,0ah ;以字符串形式将输入的时间值存入数据区
mov dx,offset timetable1
int 21h
mov dx,offset string3 ;输出提示语句
mov ah,09h
int 21h
mov dx,offset string4
mov ah,09h
int 21h
mov ah,0ah ;以字符串形式将输入的时间值存入数据区
mov dx,offset timetable2
int 21h
mov count,0
;8259的初始化
cli
mov ah,35h ;读中断
mov al,0fh ;中断IRQ7
int 21h
push bx
push es
push ds
mov ax,seg intproc ;取中断地址
mov ds,ax
mov dx,offset intproc
mov ah,25h ;写中断
mov al,0Fh
int 21h
pop ds
;8253的初始化
mov dx,233h ;控制字端口 230,(或者213--210)
mov al,36h ;CNT0控制字
out dx,al
mov dx,230h ;230口
OUT DX,AL ;0端口
MOV AH,10H
MOV AL,27H
OUT DX,AL
;8255 初始化
mov dx,253h
mov al,80h
out dx,al
mov dx,250h
mov al,00h
out dx,al
;8279 初始化
mov dx,271h
mov al,06h
out dx,al
mov dx,271h
mov al,2ah
out dx,al
;mov al,90h
;out dx,al
;清屏操作和光标设置
in al,21h ;读原中断
mov keep21,al ;保存原中断屏蔽字
and al,7fh ;允许IRQ7中断
out 21h,al
;清屏
mov bh,07h
mov ah,07h
mov al,0
mov cx,0
mov dh,24
mov dl,79
int 10h
sti
again:
mov ah,01h;判断键盘是否有键按下
int 16h
jz again
mov ah,0h;读键盘输入
int 16h
cmp al,73h ;是否是s键按下
jne nextstep1
mov dx,250h
in al,dx
and al,11111110b
out dx,al
nextstep1:
cmp al,6eh ;是否是n键按下
jne nextstep2
mov sound,00h
nextstep2:
cmp al,01bh ;是否输入 esc
jne again
mov al,keep21 ;恢复原中断
out 21h,al
pop ds
pop dx
mov ah,25h
mov al,0fh
int 21h
mov ah,4ch
int 21h
;***********************************
intproc proc far
sti
push ax
push bx
push ds
mov ax,@data
mov ds,ax
mov dx,250h
in al,dx
xor al,sound
out dx,al
inc count
cmp count,100
jne exit ;<=100跳转
mov count,0 ;否则,count=0,秒个位加1
mov dx,271h
mov al,90h
out dx,al
mov dx,270h
mov al,string[2]
sub al,'0'
mov bl,al
mov bh,0
mov al,time[bx]
out dx,al
mov al,string[3]
sub al,'0'
mov bl,al
mov bh,0
mov al,time[bx]
out dx,al
mov al,string[5]
sub al,'0'
mov bl,al
mov bh,0
mov al,time[bx]
out dx,al
mov al,string[6]
sub al,'0'
mov bl,al
mov bh,0
mov al,time[bx]
out dx,al
mov al,string[8]
sub al,'0'
mov bl,al
mov bh,0
mov al,time[bx]
out dx,al
mov al,string[9]
sub al,'0'
mov bl,al
mov bh,0
mov al,time[bx]
out dx,al
mov si,0
next:
mov al,string[si]
cmp al,timetable1[si]
jne cmp2
cmp al,'$'
je math
inc si
jmp next
cmp2:
mov si,0
next1:
mov al,string[si]
cmp al,timetable2[si]
jne nomatch
cmp al,'$'
je math1
inc si
jmp next1
math:
mov ah,02h ;设光标位置
mov bh,0h
mov dh,0bh
mov dl,0ah
int 10h
mov dx,offset timetable1
mov ah,09h
int 21h
mov dx,250h
mov al,01h
out dx,al
jmp nomatch
math1:
mov ah,02h ;设光标位置
mov bh,0h
mov dh,0ch
mov dl,0ah
int 10h
mov dx,offset timetable2
mov ah,09h
int 21h
mov sound,10h
jmp nomatch
nomatch:
inc string+9
;秒个位10进制
cmp string+9,39h
jbe exit ;<=9跳转
mov string+9,30h ;否则,秒个位赋0 ,秒十位加1
inc string+8
;秒十位6进制
cmp string+8,36h
jb exit ;<6跳转
mov string+8,30h ;否则,秒十位赋0,分个位加1
inc string+6
;分个位10进制
cmp string+6,39h
jbe exit ;<=9跳转
mov string+6,30h ;否则,分个位赋0,分十位加1
inc string+5
;分十位6进制
cmp string+5,36h
jb exit ;<6跳转
mov string+5,30h ;否则,分十位赋0,小时个位加1
inc string+3
;小时12进制
cmp string+3,34h
jne go ;小时个位<=4跳转
cmp string+2,32h
jne go ;小时十位<=2跳转
mov string+2,30h ;否则,小时个位十位赋0
mov string+3,30h
go: cmp string+3,39h
jbe exit ;<=9跳转
mov string+3,30h ;否则,小时个位赋0,小时十位加1
inc string+2
exit:
mov al,20h
out 20h,al ;保存现场
mov ah,02h ;设光标位置
mov bh,0h
mov dh,0ah
mov dl,0ah
int 10h
lea dx,string+2 ;送数据区1单元地址 ,输出时间
mov ah,09h
int 21h
pop ds
pop bx
pop ax
iret
intproc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -