📄 daytime.asm
字号:
STACK SEGMENT STACK ;堆栈段
DW 200 DUP (?)
TP DB 256 DUP(0)
TPP EQU LENGTH TP
STACK ENDS
DATA SEGMENT ;数据段
SPACE DB 1000 DUP (' ')
PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')
DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')
DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ')
DBUFFER DB 8 DUP (':'),12 DUP (' ') ;显示时间
DBUFFER1 DB 20 DUP (' ') ;显示日期
STR DB 0DH,0AH, 'PLEASE INPUT DATE(D) OR TIME(T) OR QUIT(Q) OR (C) $'
STR1 DB 0AH,0AH,'DESIGN BY GUAN GANG YU $'
COUNT DB 0
T1 DB ' counter time:' ;显示跑表
TENH DB 30H
HOUR DB 30H
DB ':'
TENM DB 30H
MINUTE DB 30H
DB ':'
TENS DB 30H
SECOND DB 30H,13,'$' ;不换行
DATA ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,0001H ;设置显示方式为40*25彩色文本方式,并清屏
INT 10H
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV BP,OFFSET SPACE
MOV DX,0B00H ;设置显示的位置为0B行,00列
MOV CX,1000 ;设置显示颜色的长度
MOV BX,0040H ;
MOV AX,1300H
INT 10H
MOV BP,OFFSET PATTERN ;显示矩形条
MOV DX,0B00H
MOV CX,120
MOV BX,004EH
MOV AX,1301H
INT 10H
LEA DX,STR ;显示提示信息
MOV AH,9
INT 21H
LEA DX,STR1 ;显示提示信息
MOV AH,9
INT 21H
MOV AH,1 ;从键盘输入单个字符
INT 21H
CMP AL,44H ;AL='D'?
JNE A
CALL DATE ;显示系统日期
A: CMP AL,54H ;AL='T'?
JNE B
CALL TIME ;显示系统时间
B: CMP AL,43H ;AL='C'?
JNE D
CALL COUNTER ;显示跑表
D: CMP AL,51H ;AL='Q'?
JNE START
MOV AH,4CH ;返回dos状态
INT 21H
DATE PROC NEAR ;显示日期子程序
DISPLAY:MOV AH,2AH ;取日期
INT 21H
MOV SI,0
MOV AX,CX
MOV BX,100
DIV BL
MOV BL,AH
CALL BCDASC1 ;日期数值转换成相应的ASCII码字符
MOV AL,BL
CALL BCDASC1
INC SI
MOV AL,DH
CALL BCDASC1
INC SI
MOV AL,DL
CALL BCDASC1
MOV BP,OFFSET DBUFFER1
MOV DX,0C0DH
MOV CX,20
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H ;设置光标位置
MOV DX,0300H
MOV BH,0
INT 10H
MOV BX,0018H
REPEA: MOV CX,0FFFFH ;延时
MAO: LOOP MAO
DEC BX
JNZ REPEA
MOV AH,01H ;读键盘缓冲区字符到AL寄存器
INT 16H
JE DISPLAY
JMP START
MOV AX,4C00H
INT 21H
RET
DATE ENDP
TIME PROC NEAR ;显示时间子程序
DISPLAY1:MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取时间
INT 21H
MOV AL,CH
CALL BCDASC ;将时间数值转换成ASCII码字符
INC SI
MOV AL,CL
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC
MOV BP,OFFSET DBUFFER
MOV DX,0C0DH
MOV CX,20
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H
MOV DX,0300H
MOV BH,0
INT 10H
MOV BX,0018H
RE: MOV CX,0FFFFH
REA: LOOP REA
DEC BX
JNZ RE
MOV AH,01H
INT 16H
JE DISPLAY1
JMP START
MOV AX,4C00H
INT 21H
RET
TIME ENDP
COUNTER PROC
MOV DX,0C0DH ;定时间显示颜色位置
MOV CX,8 ;显示颜色长度
MOV BX,004EH ;设置背景颜色(00)和前景颜色(4E)
MOV AX,1300H
INT 10H
MOV AH,02H
MOV DX,0C00H ;定显示位置
MOV BH,0 ;页号为0
INT 10H
PUSH DS
MOV AX,0
PUSH AX
CLI ;关中断
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,TPP
MOV AX,351CH ;取中断al=1ch中断向量号
INT 21H
PUSH BX ;保存中断向量
PUSH ES
MOV DX,SEG TIMER
MOV DS,DX
LEA DX,TIMER
MOV AX,251CH ;设置中断
INT 21H
MOV AX,DATA
MOV DS,AX
CHECK: MOV AH,1 ;读键盘缓冲区字符
INT 16H
JZ TICKON3 ;显示字符
JMP E
TICKON3: JMP TICKON2
E: CLI ;关中断
MOV AH,00H ;从键盘读字符
INT 16H
CMP AL,'C'
JE TICKON
CMP AL,'P'
JE TICKON1
CMP AL,'R'
JE RESET
CMP AL,'Q'
JE TICKOFF ;返回dos状态
JMP TICKON
T: JMP START
;子程序
TICKON1: MOV AX,DATA ;暂停
MOV DS,AX
MOV AX,351CH
INT 21H
MOV DX,SEG TIMER1
MOV DS,DX
LEA DX,TIMER1
MOV AX,251CH
INT 21H
MOV AX,DATA
MOV DS,AX
JMP E
RESET: MOV COUNT,0
MOV SECOND,30H
MOV TENS,30H
MOV MINUTE, 30H
MOV TENM,30H
MOV HOUR, 30H
MOV TENH,30H
MOV DX,OFFSET T1
MOV AH,9 ;显示字符
INT 21H
MOV AH,0 ;从键盘读字符
INT 16H
CMP AL,'Q'
JE TICKOFF
CMP AL,'C'
JNE RESET
TICKON: MOV AX,351CH ;开始计时
INT 21H
MOV DX,SEG TIMER
MOV DS,DX
LEA DX,TIMER
MOV AX,251CH
INT 21H
MOV AX,DATA
MOV DS,AX
TICKON2: MOV DX,OFFSET T1
MOV AH,9 ;显示字符
INT 21H
JMP CHECK
TICKOFF: CLI ;关中断 返回DOS状态
POP DS
POP DX
MOV AX,251CH
INT 21H
STI ;开中断
MOV AH,4CH ;返回DOS状态
INT 21H
RET
COUNTER ENDP
TIMER1 PROC ;恢复中断
IRET
TIMER1 ENDP
TIMER PROC FAR
PUSH AX
MOV AX,DATA
MOV DS,AX
ASSUME DS:DATA
INC COUNT
CMP COUNT,18 ;日时钟的计时单位是54.9毫秒,54.9*18=1秒
JL EXIT ;计数不满18跳回
MOV COUNT,0 ;计数满18清0重置
INC SECOND ;秒加1
CMP SECOND,39H
JLE EXIT
MOV SECOND,30H ;等于9清0重计
INC TENS ;十位加一
CMP TENS,36H ;十位为6
JL EXIT
MOV TENS,30H
INC MINUTE
CMP MINUTE,39H
JLE EXIT
MOV MINUTE, 30H
INC TENM
CMP TENM,36H
JL EXIT
MOV TENM,30H
INC HOUR
CMP HOUR,39H
JLE EXIT
MOV HOUR, 30H
INC TENH
CMP TENH,32H
JE TIME1
JL EXIT
TIME1: CMP HOUR , 34H
JL EXIT
MOV TENH,30H
EXIT: POP AX
IRET
TIMER ENDP
BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
BCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER1[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER1[SI],AH
INC SI
POP BX
RET
BCDASC1 ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -