南邮微机实验:计时器:刷新显示时分秒

利用日时钟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

 

posted @ 2022-05-18 19:56  玄修杰  阅读(543)  评论(0编辑  收藏  举报