1、DATA SEGMENT UIS DB 0DH,0AH,10 dup(0),50 DUP('*'),'$' UIE DB 0DH,0AH,10 dup(0),50 DUP('*'),'$';界面字符 MSG1 DB "The date is: $" MSG2 DB "The time is: $" MSGIN DB "Please select input methods:",0DH,0AH DB 21 DUP(" "),"Press a for single ,press i for all $" MSGDIR DB "Please input like this: OO:0
2、0",0DH,0AH DB 21 DUP(" "),"Press enter to continue $" MSGWARN DB "Error!Please enter again$" MSGAI DB "Press a to change position ",0DH,0AH DB 21 DUP(" "),"i to change value,enter to continue $" MSGSEC DB "Press i to start or stop ",0DH,0AH DB 21 DUP(" "),"Pre
3、ss q to quit,a to clear when it was 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
4、 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 为闹钟与秒表标志位。下面为处理闹钟
5、 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
6、 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
7、 AL,'q' JE EXIT 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
8、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,MO
9、N ;月 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 A
10、H,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 MO
11、V 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
12、 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
13、 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 BFLA
14、G,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
15、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键切换光标位置**
16、 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
17、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
18、 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
19、 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
20、[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 KEY
21、NUM,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 A
22、L,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
23、 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
24、 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 TO: MOV HOUR,0 MOV MIN,0 MOV SEC,0 MOV MSEC,0 KSCANW: MOV AH,0BH INT 21H
25、 CMP AL,00 JE KSCANW MOV AH,08H INT 21H CMP AL,'q' JE EXIT CMP AL,'m' JE QTIME CMP AL,'i' JE TOI CMP AL,'a' JNE KSCANW CMP SFLAG,1 JE KSCANW JMP TO TOI: MOV SFLAG,1 CALL INITIR WSTART: MOV DX,0915H MOV AH,02 MOV BH,0 INT 10H CALL TIMESHOW WSTOP: MOV AH,0
26、BH 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
27、 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,
28、 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
29、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 EXIT: MOV AH,4CH ;返回DOS状态 INT 21H CODE ENDS END START






