资源描述
西南科技大学微机原理课程设计
题目 电子实时时钟软件设计
1 任务
Date YYYY:MM:DD
Time
HH:MM:SS
Beep On/Off
HH:MM:SS
Meter
00:00:00:00
M
M
M
M
实现如图所示电子日历时钟功能。
2 基本要求
1) 可通过M键切换显示模式:日期(年、月、日)、时间(小时、分、秒)、秒表(小时、分、秒、1/100秒)、闹钟(小时、分)。
2) 在秒表显示模式,可通过I键切换(启动/暂停)计时,当暂停计时时可通过A键复位。
3) 在闹钟显示模式,有两种输入方式
方式一:直接按格式输入时间
方式二:可通过A键依次使On/Off标志、小时、分、秒闪烁或变色,这时可通过I键切换On/Off标志或加1调整。
4) 可通过esc键结束程序。
3 扩展要求
1) 在日期显示模式,可通过A键依次使年、月、日闪烁或变色,这时可通过I键加1调整。
2) 在时间显示模式,可通过A键依次使小时、分、秒闪烁或变色,这时可通过I键加1调整。
3) 调整和秒表操作不影响日期和时间的准确性。
4) 自定义的其它扩展功能
说明:本程序为西科微机原理课程设计题目,下面的代码只实现了基本要求部分,并且秒表还存在部分问题(秒表模式修改了定时器0,结束后对时间略有影响,测试闹钟时可以直接在秒表模式下,按q键跳过秒表模式),代码仅供参考,欢迎对其繁琐处进行修改,调试。
各部分程序流程图:
该过程与代码略有不同,处理on/off 位是后来添加的代码,流程图没有加入
DATA SEGMENT
UIS DB 0DH,0AH,10 dup(0),50 DUP('*'),'$'
UIE DB 0DH,0AH,10 dup(0),50 DUP('*'),'$';界面字符
MSG1 DB "THE DATA IS $"
MSG2 DB "THE TIME IS $"
MSGIN DB "PLEASE CHOOSE INPUT METHODS:",0DH,0AH
DB 21 DUP(" "),"PRESS A FOR A/I METHOD,OR FOR DIRECT METHOD$"
MSGDIR DB "PLEASE INPUT LIKE THIS: OO:00",0DH,0AH
DB 21 DUP(" "),"PRESS ENTER TO CONFIRM $"
MSGWARN DB "ERROR!PLEASE ENTER AGAIN$"
MSGAI DB "PRESS a TO CHANGE POSITION ",0DH,0AH
DB 21 DUP(" "),"i TO CHANGE VALUE,ENTER TO CONFIRM $"
MSGSEC DB "PRESS i TO START AND STOP ",0DH,0AH
DB 21 DUP(" "),"q TO QUIT,a TO CLEAR IF IT HAS STOPED $"
NULINE DB 25 DUP(?),'$' ;清空行
KSBUF DB 6,0,6 DUP(?)
KEYNUM DB ?
MODE DB ?
DAY DB ?
MON DB ?
YEAR DW ?
SEC DB ?
MSEC DB ?
MIN DB ?
HOUR DB ?
BEEPHOUR DB 0 ,0
BEEPMIN DB 0,0
SWIOFF DB "FF$"
SWION DB "N $"
SETSTR DB "00:00 OFF/ON",'$'
WSTR DB "00:00:00 ",'$'
BFLAG DB 0
SFLAG DB 0
INISEG DW 0
INIOFF DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CALL CLEAR
CALL CREATUI
MOV MODE,0
CALL SOUND
AGAIN: CALL REFRESH ;刷新时间日期
;******BFALG 为闹钟与秒表标志位。下面为处理闹钟
CMP BFLAG,0
JE SETMOU
CMP BFLAG,1
JNE CRING
CALL CHESTART
JMP SETMOU
CRING: CALL CHESTOP
JMP SETMOU
JMAGAN: JMP AGAIN ;二级跳转
SETMOU: MOV DX,0815H
MOV AH,02
MOV BH,0
INT 10H ;设置光标
;模式判断***********
CMP MODE,0
JE MODE0
CMP MODE,1
JE MODE1
CMP MODE,2
JE MODE2
CMP MODE,3
JE MODE3
MODE0: CALL TIMESHOW
JMP KEYSCAN
MODE1: CALL DATESHOW
JMP KEYSCAN
MODE2: CALL BEEP
MOV MODE,03H
JMP KEYSCAN
MODE3: CALL SEDWHATCH
MOV MODE,0H
;键盘扫描*********
KEYSCAN:MOV AH,0BH
INT 21H
CMP AL,00
JE AGAIN
MOV AH,08H
INT 21H
CMP AL,1BH
JZ STOP
CMP AL,'m'
JNE AGAIN
INC MODE
CMP MODE,4
JNE JMAGAN
MOV MODE,0
JMP JMAGAN
STOP: MOV AH,4CH
INT 21H
;*******时间日期刷新*****
REFRESH PROC
PUSH AX
PUSH CX
PUSH DX
MOV AH,2AH
INT 21H
MOV DAY,DL
MOV MON,DH
MOV YEAR,CX
MOV AH,2CH
INT 21H
MOV HOUR,CH
MOV MIN,CL
MOV SEC,DH
MOV MSEC,DL
POP DX
POP CX
POP AX
RET
REFRESH ENDP
;********年月日显示
DATESHOW PROC
PUSH AX
PUSH CX
PUSH DX
MOV DX,OFFSET MSG1
MOV AH,09
INT 21H
MOV AX,YEAR ;取年
CALL BTOBCD
MOV DL,'/'
MOV AH,02H
INT 21H
MOV AH,0
MOV Al,MON ;月
CALL BTOBCD
MOV DL,'/'
MOV AH,02H
INT 21H
MOV AH,0
MOV AL,DAY ;日
CALL BTOBCD
MOV DX,OFFSET NULINE
MOV AH,09
INT 21H
POP DX
POP CX
POP AX
RET
DATESHOW ENDP
;*********时间显示
TIMESHOW PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DX,OFFSET MSG2
MOV AH,09
INT 21H
MOV AH,0
MOV AL,HOUR ;取时
CALL BTOBCD
MOV DL,':'
MOV AH,02H
INT 21H
MOV AH,0
MOV AL,MIN ;分
CALL BTOBCD
MOV DL,':'
MOV AH,02H
INT 21H
MOV AH,0
MOV AL,SEC ;秒
CALL BTOBCD
CMP SFLAG,0
JE TOCLR
MOV DL,':'
MOV AH,02H
INT 21H
MOV AH,0
MOV AL,MSEC ;10M秒
CALL BTOBCD
TOCLR: MOV DX,OFFSET NULINE
MOV AH,09
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
TIMESHOW ENDP
;将二进制转化为BCD码并显示
BTOBCD PROC
PUSH DX
PUSH BX
PUSH CX
MOV CX,0
MOV BX,10
BTOD: MOV DX,0
DIV BX
PUSH DX
INC CL
CMP AX,0
JA BTOD
SHOW: POP DX
ADD DL,30h
MOV AH,02h
INT 21h
LOOP SHOW
POP CX
POP BX
POP DX
RET
BTOBCD ENDP
;*****闹钟设定******
BEEP PROC
MOV DX,0715H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET MSGIN
MOV AH,09
INT 21H
CMP BFLAG,2;设定时还在响,那么关闭
JNE SETM
IN AL,61H
AND AL,0FDH
OUT 61H,AL
SETM: MOV DX,0715H
MOV AH,02
MOV BH,0
INT 10H
MOV AH,07H
INT 21H
CMP AL,'a'
JE INA ;选择输入方式,a为切换输入,其他键为键盘直接输入
MOV DX,OFFSET MSGDIR
MOV AH,09
INT 21H
MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET KSBUF
MOV AH,10
INT 21H ;键盘输入字符存入缓存区
MOV BFLAG,1
MOV SI,OFFSET KSBUF+1
MOV CL,BYTE PTR[SI]
MOV BX,10
INC SI
AND BYTE PTR[SI],0FH
MOV AL,BYTE PTR[SI]
MUL BL
INC SI
AND BYTE PTR[SI],0FH
ADD AL,BYTE PTR[SI]
MOV BEEPHOUR,AL
ADD SI,2
AND BYTE PTR[SI],0FH
MOV AL,BYTE PTR[SI]
MUL BL
INC SI
AND BYTE PTR[SI],0FH
ADD AL,BYTE PTR[SI]
MOV BEEPMIN,AL
JMP TOEND
INA: MOV DX,OFFSET MSGAI ;A/I切换输入方式
MOV AH,09
INT 21H
MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET SETSTR
MOV AH,09
INT 21H
MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
MOV SI,OFFSET BEEPHOUR
;*****a键切换光标位置*********
KASCAN: MOV AH,0BH
INT 21H
CMP AL,00
JE KASCAN
MOV AH,08H
INT 21H
MOV KEYNUM,AL
CMP AL,'a'
JNE KISCAN
MOV BH,0
MOV AH,03H
INT 10H
INC DL
INC SI
CMP DL,17H
JE TOMI
CMP DL,1AH
JE TOSW
CMP DL,22H
JE TOHO
JMP SETF
TOMI: INC DL
JMP SETF
TOSW: MOV DL,21H
JMP SETF
TOHO: MOV DL,15H
MOV SI,OFFSET BEEPHOUR
SETF: MOV AH,02H
INT 10H
KAJMP: JMP KASCAN
;*****i键改变光标处字符*****
KISCAN: CMP KEYNUM,'i'
JNE JKCR0
MOV AH,08H;读光标处字符
INT 10H
INC AL
INC BYTE PTR[SI]
CMP SI,OFFSET BEEPHOUR
JE JUGHOR
CMP SI,OFFSET BEEPHOUR+1
JE JUGHOR2
CMP SI,OFFSET BEEPHOUR+2
JE JUGMIN
CMP SI,OFFSET BEEPHOUR+3
JE JUGMIN2
CMP SI,OFFSET BEEPHOUR+4
JE CHGSW
JMP JUGHOR
JKCR0: JMP KCR
JUGHOR: CMP AL,32H
JNA PRINT
MOV BYTE PTR[SI],0
MOV AL,30H
JMP PRINT
JUGHOR2:CMP BEEPHOUR,2H
JE TO2
CMP AL,39H
JNA PRINT
MOV BYTE PTR[SI],0
MOV AL,30H
JMP PRINT
TO2: CMP AL,34H
JNA PRINT
MOV BYTE PTR[SI],0
MOV AL,30H
JMP PRINT
JUGMIN: CMP AL,35H
JNA PRINT
MOV BYTE PTR[SI],0
MOV AL,30H
JMP PRINT
JUGMIN2:CMP AL,39H
JNA PRINT
MOV BYTE PTR[SI],0
MOV AL,30H
JMP PRINT
CHGSW: DEC BYTE PTR[SI]
CMP BFLAG,0
JE TOON
MOV BFLAG,0
MOV DX,OFFSET SWIOFF
JMP PRISW
TOON: MOV BFLAG,1
MOV DX,OFFSET SWION
PRISW: MOV AH,09H
INT 21H
MOV DX,0921H
MOV AH,02
MOV BH,0
INT 10H
JMP KAJMP0
PRINT: MOV CX,1H
MOV BX,07H
MOV AH,09H
INT 10H
KAJMP0: JMP KAJMP
KCR: CMP KEYNUM,0DH
JNE KAJMP0
MOV AL,BEEPHOUR
MOV BX,10
MUL BL
ADD AL,BEEPHOUR+1
MOV BEEPHOUR,AL
MOV AL,BEEPMIN
MUL BL
ADD AL,BEEPMIN+1
MOV BEEPMIN,AL
TOEND: RET
BEEP ENDP
CHESTART PROC
MOV CH,HOUR
MOV CL,MIN
CMP BEEPHOUR,CH
JNE RETURN
CMP BEEPMIN,CL
JNE RETURN
IN AL,61H
OR AL,2
OUT 61H,AL
INC BFLAG
RETURN: RET
CHESTART ENDP
CHESTOP PROC
MOV CL,SEC
CMP CL,3
JB ESCP
IN AL,61H
AND AL,0FDH
OUT 61H,AL
AND BFLAG,0
ESCP: RET
CHESTOP ENDP
SOUND PROC
MOV AL,10110110B
OUT 43H,AL
MOV DX,0012H
MOV AX,34DEH
MOV DI,1000
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
AND AL,0FDH
OUT 61H,AL
IN AL,61H
OR AL,1
OUT 61H,AL
RET
SOUND ENDP
;*********以下为秒表部分************
SEDWHATCH PROC
MOV DX,0715H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET MSGSEC
MOV AH,09
INT 21H
MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
CLI
MOV AL,1CH
MOV AH,35H
INT 21H
MOV INISEG,ES
MOV INIOFF,BX
SHOWINI:MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET WSTR
MOV AH,09
INT 21H
KSCANW: MOV AH,0BH
INT 21H
CMP AL,00
JE KSCANW
MOV AH,08H
INT 21H
CMP AL,'q'
JE QTIME
CMP AL,'i'
JE TOI
CMP AL,'a'
JNE KSCANW
CMP SFLAG,1
JE KSCANW
JMP SHOWINI
TOI: MOV SFLAG,1
MOV HOUR,0
MOV MIN,0
MOV SEC,0
MOV MSEC,0
CALL INITIR
WSTART: MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
CALL TIMESHOW
WSTOP: MOV AH,0BH
INT 21H
CMP AL,00
JE WSTART
MOV AH,08H
INT 21H
CMP AL,'i'
JNE WSTART
MOV SFLAG,0
JMP KSCANW
QTIME: CLI
PUSH DS
MOV DX,INIOFF
MOV DS,INISEG
MOV AL,1CH
MOV AH,25H
INT 21H
STI
POP DS
MOV AL, 00110100B
OUT 43H, AL
MOV AL,0FFH
OUT 40H,AL
OUT 40H,AL
MOV DX,0715H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET NULINE
MOV AH,09
INT 21H
MOV DX,0915H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET NULINE
MOV AH,09
INT 21H
RET
SEDWHATCH ENDP
INITIR PROC
CLI
;初始化8253计时器0,先送低八位,再送高八位,工作方式3,二进制计数方式
MOV AL, 00110110B
OUT 43H, AL
MOV AX, 11932 ;计数初值送AX
OUT 40H, AL
MOV AL,AH
OUT 40H,AL
PUSH DS
MOV DX,OFFSET TIMER
MOV AX,SEG TIMER
MOV DS,AX
MOV AX,251CH
INT 21H
POP DS
RET
INITIR ENDP
TIMER PROC
PUSH AX
PUSH DS
MOV AX,DATA
MOV DS,AX
INC MSEC
CMP MSEC,100
JNE QUIT
MOV MSEC,0
INC SEC
CMP SEC,60
JNE QUIT
AND SEC,0H
INC MIN
CMP MIN,60
JNE QUIT
INC HOUR
AND MIN,0H
QUIT: POP AX
MOV DS,AX
POP AX
STI
IRET
TIMER ENDP
CREATUI PROC
PUSH AX
PUSH BX
PUSH DX
MOV DX,OFFSET UIS
MOV AH,09
INT 21H
MOV DX,1000H
MOV AH,02
MOV BH,0
INT 10H
MOV DX,OFFSET UIE
MOV AH,09
INT 21H
POP DX
POP BX
POP AX
RET
CREATUI ENDP
CLEAR PROC
MOV AX,0002H
INT 10H
RET
CLEAR ENDP
CODE ENDS
END START
展开阅读全文