实验六 时钟实验
一、实验目的
综合运用前面6个实验掌握的知识,实现数据通过中断调用从键盘输入,经过转换、处理后,通过中断调用输出处理结果。
二、实验内容
设计24小时进位的电子表。
利用加法、码制转换或DOS功能调用设计电子表。
显示格式为:时:分:秒
把时间稳定地显示在CRT上,起始时间可调,时间采用24小时进制或读取系统时钟。
根据要求画出程序框图、编写出程序并调试通过。
三、实验内容
四、实验源代码
DATA SEGMENT
sentence1 DB 'Input now time,like xx:xx:xx',0AH,0DH,'$'
sentence2 DB 'A new day begins!',0AH,0DH,'$'
sentence3 DB 'Input error!',0AH,0DH,'$'
Time DB 9,?,9 DUP(?);存储时间值
NewLine DB 0AH,0DH,'$'
Retvalue DB 0
DATA ENDS
STACK SEGMENT
DW 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
AGAIN: CALL INPUT;输入倒计时
CMP Retvalue,1
JZ TIMING;输入格式正确
LEA DX,sentence3;输入格式错误
MOV AH,09H
INT 21H
JMP AGAIN
TIMING: CALL DELAY;延时
CALL UPDATE;更新计时值
CMP Retvalue,1;判断计时是否结束
JZ TIMING
JMP AGAIN
MOV AH,4CH
INT 21H
;输入倒计时时间,格式为xx:xx上限是59:59
;返回值在RetValue中,输入格式正确值为1,否则为0
INPUT PROC
PUSH AX
PUSH DX
LEA DX,sentence1;输出指示字符串
MOV AH,09H
INT 21H
LEA DX,Time;输入倒计时值
MOV AH,0AH
INT 21H
MOV AL,Time+2;检测输入是否符合格式
CMP AL,'0'
JB ERROR
CMP AL,'2'
JA ERROR
JZ B1
MOV AL,Time+3
CMP AL,'0'
JB ERROR
CMP AL,'9'
JA ERROR
JMP B2
B1: MOV AL,Time+3
CMP AL,'0'
JB ERROR
CMP AL,'3'
JA ERROR
B2: MOV AL,Time+4
CMP AL,':'
JNZ ERROR
MOV AL,Time+5
CMP AL,'0'
JB ERROR
CMP AL,'5'
JA ERROR
MOV AL,Time+6
CMP AL,'0'
JB ERROR
CMP AL,'9'
JA ERROR
MOV AL,Time+7
CMP AL,':'
JNZ ERROR
MOV AL,Time+8
CMP AL,'0'
JB ERROR
CMP AL,'5'
JA ERROR
MOV AL,Time+9
CMP AL,'0'
JB ERROR
CMP AL,'9'
JA ERROR
CALL OUTPUT
MOV Retvalue,1;输入正确返回值为1
JMP EXITI
ERROR: MOV Retvalue,0;输入错误返回值为0
EXITI: POP DX
POP AX
RET
INPUT ENDP
;输出函数,输出当前的计时到屏幕
OUTPUT PROC
PUSH AX
PUSH DX
LEA DX,Time+2
MOV AH,09H
INT 21H
POP DX
POP AX
RET
OUTPUT ENDP
;更新计时时间
;返回值在RetValue中,倒计时结束值为0,否则为1
UPDATE PROC
PUSH AX
PUSH BX
LEA BX,Time+9;判断是否计时结束
MOV AL,[BX]
CMP AL,'9'
JNZ U1
DEC BX
MOV AL,[BX]
CMP AL,'5'
JNZ U2
DEC BX
DEC BX
MOV AL,[BX]
CMP AL,'9'
JNZ U3
DEC BX
MOV AL,[BX]
CMP AL,'5'
JNZ U4
DEC BX
DEC BX
DEC BX
MOV AL,[BX]
CMP AL,'2'
JZ A1
INC BX
MOV AL,[BX]
CMP AL,'9'
JNZ U5
JMP A2
A1: INC BX
MOV AL,[BX]
CMP AL,'3'
JNZ U5
A2: DEC BX
MOV AL,[BX]
CMP AL,'2'
JNZ U6
MOV [BX],'0'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
CALL OUTPUT
LEA DX,sentence2;计时结束输出字符提示
MOV AH,09H
INT 21H
MOV Retvalue,0;返回值为0
JMP EXITU
;修改计时值
;格式为xx:xx(x为非0值)
U1: INC AL
MOV [BX],AL
CALL OUTPUT
JMP RETURN
;格式为xx:x0(x为非0值)
U2: INC AL
MOV [BX],AL
INC BX
MOV [BX],'0'
CALL OUTPUT
JMP RETURN
;格式为xx:00(x为非0值)
U3: INC AL
MOV [BX],AL
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
CALL OUTPUT
JMP RETURN
;格式为x0:00(x为非0值)
U4: INC AL
MOV [BX],AL
INC BX
MOV [BX],'0'
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
CALL OUTPUT
JMP RETURN
U5: INC AL
MOV [BX],AL
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
CALL OUTPUT
JMP RETURN
U6: INC AL
MOV [BX],AL
INC BX
MOV [BX],'0'
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],':'
INC BX
MOV [BX],'0'
INC BX
MOV [BX],'0'
CALL OUTPUT
JMP RETURN
RETURN: MOV Retvalue,1;返回值为1
EXITU: POP BX
POP AX
RET
UPDATE ENDP
;延时1s左右
DELAY PROC NEAR
PUSH BX
PUSH CX
MOV BX,300H
DLOOP1: MOV CX,0FFFH
DLOOP2: LOOP DLOOP2
DEC BX
JNZ DLOOP1
POP CX
POP BX
RET
DELAY ENDP
CODE ENDS
END START
RET
UPDATE ENDP
;延时1s左右
DELAY PROC NEAR
PUSH BX
PUSH CX
MOV BX,300H
DLOOP1: MOV CX,0FFFH
DLOOP2: LOOP DLOOP2
DEC BX
JNZ DLOOP1
POP CX
POP BX
RET
DELAY ENDP
CODE ENDS
END START