📄 electric clock.asm
字号:
Data segment
Disptime db 00,00,":",00,00,":",00,00,"$" ;为了存储要显示的时间
Time dw A10,A11,A12,A13,A14,A15,A16,A17,A18,A19
Welcome db 02,00,'Welcome To Use Our Electric Clock','$'
ESCExit db 03,00,'Press ESC to exit','$'
ShowT db 04,00,'1 Show time','$' ;1 开始显示时钟
SetT db 05,00,'2 Set time','$' ;2 设置时间'
MenuW db 'Menu Window','$'
ShowTimeW db 'ShowTime Window','$'
SetTimeW db 'SetTime Window','$'
Tip db 'Hour:Minute:Second','$' ;设置时间提示
Error db 'Set time error,please set again!','$' ;设置时间错误
Stime db 6 dup(?)
;*****定义0-9十个图形数字*****
s0 db 6
db 5fh,0fah,0,0 ;5fh为ASCII码的95即"-"
db 7ch,0fah,1,-1 ;0fah为01111010对于属性字符的白底绿色
db 7ch,0fah,1,0 ;7ch为ASCII码的1247即"|"
db 5fh,0fah,0,1
db 7ch,0fah,0,1
db 7ch,0fah,-1,0
s1 db 2
db 7ch,0fah,1,0
db 7ch,0fah,1,0
s2 db 5
db 5fh,0fah,0,0
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
db 7ch,0fah,1,-1
db 5fh,0fah,0,1
s3 db 5
db 5fh,0fah,0,0
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
s4 db 4
db 7ch,0fah,1,0
db 5fh,0fah,0,1
db 7ch,0fah,1,1
db 7ch,0fah,-1,0
s5 db 5
db 5fh,0fah,0,0
db 7ch,0fah,1,-1
db 5fh,0fah,0,1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
s6 db 6
db 5fh,0fah,0,0
db 7ch,0fah,1,-1
db 5fh,0fah,0,1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
db 7ch,0fah,0,-1
s7 db 3
db 5fh,0fah,0,0
db 7ch,0fah,1,1
db 7ch,0fah,1,0
s8 db 7
db 7ch,0fah,1,0
db 5fh,0fah,-1,1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
db 7ch,0fah,0,-1
s9 db 6
db 7ch,0fah,1,0
db 5fh,0fah,-1,1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
db 7ch,0fah,1,1
db 5fh,0fah,0,-1
s10 db 2
db 07h,0fah,1,0
db 07h,0fah,1,0
Data ends
;...................
Clear macro att,ulrow,ulcol,lrrow,lrcol ;清屏宏
push ax
push bx
push cx
push dx
mov ah,6
mov al,0 ;上卷行数. al为0时实际完成的是清除屏幕
mov bh,att ;attribute 卷入行属性
mov ch,ulrow ;upper left row 左上角行号
mov cl,ulcol ;upper left column 左上角列号
mov dh,lrrow ;lower right row 右下角行号
mov dl,lrcol ;lower right column 右下角列号
int 10h
pop dx
pop cx
pop bx
pop ax
endm
;......................
Display macro string ;显示字符串
push ax
push bx
push cx
push dx
push di
mov ah,09h
lea dx,string
int 21h
pop di
pop dx
pop cx
pop bx
pop ax
endm
;........................
Locate macro row,col ;光标定位,参数为行和列
push ax
push bx
push cx
push dx
push di
mov bh,0 ;bh为行号
mov dh,row
mov dl,col
mov ah,02h
int 10h
pop di
pop dx
pop cx
pop bx
pop ax
endm
;........................
ShowChange macro c1,c2,c3 ;系统时间转换到Disptime中
mov al,c1
cbw
mov bh,10
div bh
add al,'0'
mov Disptime[c2],al
add ah,'0'
mov Disptime[c3],ah
endm
;........................
Setchange macro c1,c2,c3 ;设置系统时间放到Stime中
mov al,Stime[c2]
sub al,'0'
mov bh,10
mul bh
add al,Stime[c3]
sub al,'0'
mov c1,al
endm
;-------------------------------------------------------------------
Code segment
assume cs:Code,ds:Data
;--------------主函数----------------
Start:
mov ax,Data
mov ds,ax
call Menu
mov ah,01h ;输入选择
int 21h
cmp al,'1'
je Choice1
cmp al,'2'
je Choice2
cmp al,1bh ;按Esc退出
je Exit1
jmp Start
Choice1:
call ShowTime
Choice2:
call SetTime
Exit1:
jmp Exit
;--------子函数----------
ShowTime proc near
Clear 07h,0,0,2,79
Locate 2,34
Display MenuW
Clear 0a0h,3,18,10,60
Clear 0f7h,4,19,9,59 ;从第四行,20列开始
Locate 4,22
Display Welcome
Locate 6,22
Display ShowT
Locate 7,22
Display SetT
Locate 9,41
Display ESCExit
mov ah,01h
mov ch,20h
int 10h ;取消鼠标显示
Clear 0ah,12,36,12,79
Locate 12,32
Display ShowTimeW
Clear 0b0h,13,18,21,60
Show:
Clear 0f0h,14,19,20,59 ;刷新显示时间的部分
mov ah,2ch
int 21h ;取系统时间
Showchange ch,0,1
Showchange cl,3,4
Showchange dh,6,7
mov bx,0
mov dx,0f18h
Again:
Locate dh,dl
mov al,Disptime[bx]
cmp al,':'
je A20
sub al,'0'
shl al,1
cbw
mov si,ax
jmp Time[si]
Return:
add dx,0004h
inc bx
cmp bx,8
jnz Again
call Delay ;调用延迟为了显示时间慢些
jmp Show
A10:
call prog0
jmp Return
A11:
call prog1
jmp Return
A12:
call prog2
jmp Return
A13:
call prog3
jmp Return
A14:
call prog4
jmp Return
A15:
call prog5
jmp Return
A16:
call prog6
jmp Return
A17:
call prog7
jmp Return
A18:
call prog8
jmp Return
A19:
call prog9
jmp Return
A20:
call prog10
jmp Return
ret
ShowTime endp
;---------------------------------
SetTime proc near ;输入时间子程序
Clear 07h,0,0,2,79
Locate 2,34
Display MenuW
Clear 0a0h,3,18,10,60
Clear 0f7h,4,19,9,59 ;从第四行,20列开始
Locate 4,22
Display Welcome
Locate 6,22
Display ShowT
Locate 7,22
Display SetT
Locate 9,41
Display ESCExit
Clear 0ah,12,36,12,79
Locate 12,32
Display SetTimeW
Clear 0b0h,13,18,21,60
Clear 0f0h,14,19,20,59
Locate 15,30
Display Tip
Locate 17,37
lea dx,Stime
mov bx,0
Input:
mov ah,08h ;键盘输入缓冲区
int 21h
cmp al,1bh
je Exit2
jne Next
Exit2:
jmp Exit
Next:
cmp al,48 ;小于字符'0'
jb Input
cmp al,57 ;大于字符'9'
ja Input
mov Stime[bx],al
mov dl,al
mov ah,02h
int 21h
inc bx
cmp bx,6
jne Input
SetChange ch,0,1
SetChange cl,2,3
SetChange dh,4,5
mov dl,00
mov ah,2dh ;设置系统时间
int 21h
cmp al,00 ;返回参数al=00成功
jne E
call ShowTime
E:
call ErrorTime
ret
SetTime endp
;---------------------------------------
ErrorTime proc near
Clear 0f0h,14,19,20,59 ;刷新显示时间的部分
Locate 17,23
Display Error
mov ah,01h
int 21h
jmp Choice2
ret
ErrorTime endp
;---------------------------------------
prog0 proc
lea di,s0
call Moveshape
ret
prog0 endp
prog1 proc
lea di,s1
call Moveshape
ret
prog1 endp
prog2 proc
lea di,s2
call Moveshape
ret
prog2 endp
prog3 proc
lea di,s3
call Moveshape
ret
prog3 endp
prog4 proc
lea di,s4
call Moveshape
ret
prog4 endp
prog5 proc
lea di,s5
call Moveshape
ret
prog5 endp
prog6 proc
lea di,s6
call Moveshape
ret
prog6 endp
prog7 proc
lea di,s7
call Moveshape
ret
prog7 endp
prog8 proc
lea di,s8
call Moveshape
ret
prog8 endp
prog9 proc
lea di,s9
call Moveshape
ret
prog9 endp
prog10 proc
lea di,s10
call Moveshape
ret
prog10 endp
;------------------------------------------------
Moveshape proc near
push ax
push bx
push cx
push dx
push di
mov ah,0fh
int 10h ;取当前显示方式
sub ch,ch
mov cl,[di] ;循环显示一个字的次数
inc di
plotnext:
add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h ;设置光标位置
mov al,[di]
mov bl,[di+1]
push cx
mov cx,1
mov ah,09
int 10h
pop cx
add di,4
loop plotnext
pop di
pop dx
pop cx
pop bx
pop ax
ret
Moveshape endp
;-----------------------------------------
Menu proc near
Clear 0ah,0,0,24,79 ;清除全屏
Locate 2,34
Display MenuW ;定位显示 'MenuWindow'
Clear 0a0h,3,18,10,60
Clear 0f0h,4,19,9,59 ;设置窗口和字体颜色
Locate 4,22
Display Welcome
Locate 6,22
Display ShowT
Locate 7,22
Display SetT
Locate 9,41
Display ESCExit
Locate 7,35
ret
Menu endp
Delay proc near ;延迟
push ax
push cx
push dx
mov cx,1000h
Again1:
mov ax,1000h
again2:
dec ax
jnz Again2
mov dl,0ffh
mov ah,06h
int 21h
cmp al,'2'
je C2
cmp al,1bh
je Exit3
jmp continue
C2:
jmp Choice2
Exit3:
jmp Exit
continue:
loop again1
pop dx
pop cx
pop ax
ret
Delay endp
Exit:
Clear 07h,0,0,24,79
mov ah,4ch
int 21h
Code ends
end Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -