南邮微机实验:计时器:刷新显示时分秒
利用日时钟1CH中断设计定时中断程序,每隔一秒刷新屏幕上显示的时、分、秒。最终屏幕中的打印形式为24小时制形式:HH:MM:SS,每秒钟进行刷新一次,可采用INT 21H打印字符串的子功能,每秒进行重新打印即可实现覆盖刷新。同时要注意时间显示格式要采用24小时制的时、分、秒的更新。
.486 DATA SEGMENT USE16 MESG DB 0, 0, ':', 0, 0, ':', 0, 0, 0DH, '$' ;用来显示,0AH对应这换行符 ROOM DW 17H, 3BH, 3BH ;用来计数 OLD1C DD ? ICOUNT DB 18 ;中断计数初值 DATA ENDS CODE SEGMENT USE16 ASSUME CS: CODE, DS: DATA BEG: MOV AX, DATA MOV DS, AX CLI ;关中断 CALL READ1C CALL WRITE1C STI ;开中断 ;READTIME: MOV AH, 2CH ;取时间,时CH,分CL,秒DH ; INT 21H ; MOV BYTE PTR[ROOM],CH ; MOV BYTE PTR[ROOM+2],CL ; MOV BYTE PTR[ROOM+4],DH SCAN: MOV AH, 01H ;INT 16H的01H功能,查看键盘缓冲区,当有按键输入时,Z=0. INT 16H JZ SCAN ;当键盘没有输入,SCAN一直循环 CALL RESET MOV AH, 4CH INT 21H ;--------------------------------- SERVICE PROC PUSHA ;保护现场 PUSH DS MOV AX, DATA ;将DATA数据段基地址放到DS里 MOV DS, AX DEC ICOUNT ;中断计数 JNZ EXIT ;不满18次调用时转到EXIT MOV ICOUNT, 18 ;计满18次后,将计数器值复位 CALL SETDATA CALL ADDDATA MOV AH, 09H ;显示字符串 LEA DX, MESG ;将MESG的偏移地址放到DX中 INT 21H EXIT: POP DS ;恢复现场 POPA IRET ;返回系统8型中断服务程序 SERVICE ENDP SETDATA PROC ;显示当前的时间 MOV AX, [ROOM] MOV BL, 0AH DIV BL MOV [MESG+1], AH MOV [MESG], AL ADD BYTE PTR [MESG+1], 30H ADD BYTE PTR [MESG], 30H MOV AX, [ROOM+2] MOV BL, 0AH DIV BL MOV [MESG+4], AH MOV [MESG+3], AL ADD BYTE PTR [MESG+4], 30H ADD BYTE PTR [MESG+3], 30H MOV AX, [ROOM+4] MOV BL, 0AH DIV BL MOV [MESG+7], AH MOV [MESG+6], AL ADD BYTE PTR [MESG+7], 30H ADD BYTE PTR [MESG+6], 30H RET SETDATA ENDP ADDDATA PROC ;个给初始时间加秒 CMP [ROOM+4], 3BH JNZ ADDMIAO MOV [ROOM+4], 00H CMP [ROOM+2], 3BH JNZ ADDFEN MOV [ROOM+2], 00H CMP [ROOM], 17H JNZ ADDSHI MOV [ROOM], 00H JMP LAST ADDSHI: ADD [ROOM], 01H JMP LAST ADDFEN: ADD [ROOM+2], 01H JMP LAST ADDMIAO: ADD [ROOM+4], 01H LAST: RET ADDDATA ENDP ;---------------------------------- READ1C PROC MOV AH, 35H ;使用INT21H的35H子功能,读出指定n型向量 MOV AL, 1CH INT 21H MOV WORD PTR OLD1C, BX ;原1CH的中断向量偏移地址读到BX MOV WORD PTR OLD1C+2, ES ;原1CH的中断向量基地址躲到ES RET READ1C ENDP ;--------------------------------- WRITE1C PROC PUSH DS ;将DS寄存器的内容压入堆栈保存 ;MOV AX,CODE MOV AX, SEG SERVICE ;将服务子程序所在代码段的基地址写入DS MOV DS, AX MOV DX, OFFSET SERVICE ;将服务子程序入口的偏移地址写入DX MOV AH, 25H ;使用INT21H的25H子功能,写入指定n型向量 MOV AL, 1CH INT 21H POP DS ;将DS寄存器的内容从堆栈弹出恢复 RET WRITE1C ENDP ;--------------------------------- RESET PROC ;恢复系统1CH型中断向量 MOV DX, WORD PTR OLD1C MOV DS, WORD PTR OLD1C+2 MOV AH, 25H MOV AL, 1CH INT 21H RET RESET ENDP CODE ENDS END BEG