用汇编写的在PC机上显示的模拟数字时钟

  10:36:37

  今天我用汇编写的在PC机上显示的模拟数字时钟,按1键可以暂停,按2键就可以继续了,按9退去!

  哈哈......运行还算稳定!

 

 

 

     D_SEG  SEGMENT               ;数据段
       SHOW1  DB        'If you want to suspend time please press 1key!'
       SHOW2  DB        'if you want to start   time please press 6key!'
       SHOW3  DB        'if you want to recede  time please press 9key!'
        TIME  DB        'time:'
          HH  DB        '0'
          HL  DB        '0'
              DB        ':'
          MH  DB        '0'
          ML  DB        '0'
              DB        ':'
          SH  DB        '0'
          SL  DB        '0'
              DB        's'
 OLD_INT_SEG  DW        0           ;存储1ch中断入口的段地址
 OLD_INT_OFF  DW        0           ;存储1ch中断入口的偏移地址
       COUNT  DB        0           ;18次为1秒
       D_SEG  ENDS
      
       S_SEG  SEGMENT   STACK       ;堆栈段
              DB        250 DUP(0)
       S_SEG  ENDS
      
       C_SEG  SEGMENT               ;代码段
              ASSUME    CS:C_SEG,DS:D_SEG,SS:S_SEG
        MAIN  PROC      FAR         ;主程序开始
              MOV       AX,D_SEG
              MOV       DS,AX       ;数据段初始化
     STARTE:
              CALL      INIT_INT    ;初始化中断
              ;MOV       AH,08H      ;键盘扫描  1键
              ;INT       21H
              ;CMP       AL,'1'
              ;JE        SUSPEND
              ;MOV       CX,65535
         L1:
              MOV       AH,08H
              INT       21H
              CMP       AL,'1'
              JE        SUSPEND
              CMP       AL,'9'
              JE        EXIT1
              JMP       L1
    SUSPEND:
              CALL      RESTORE_INT ;恢复原1ch中断入口
              MOV       AH,08H      ;键盘扫描  9键
              INT       21H
              CMP       AL,'6'
              JE        STARTE
              CMP       AL,'9'
              JE        EXIT1
      EXIT1:  MOV       AX,4C00H    ;退出,回到DOS
              INT       21H
        MAIN  ENDP                  ;主程序结束

    INIT_INT  PROC      NEAR        ;初始化中断子程序开始
              CLI                   ;关中断
              PUSH      DS          ;保存DS,因程序中修改了它
              MOV       AL,1CH
              MOV       AH,35H
              INT       21H
              MOV       OLD_INT_OFF,BX          ;保存原1ch的偏移地址
              MOV       OLD_INT_SEG,ES          ;保存原1ch的段地址
              MOV       AX,SEG DISP ;安装新中断程序入口地址
              MOV       DS,AX
              MOV       DX,OFFSET DISP
              MOV       AH,25H
              MOV       AL,1CH
              INT       21H
              POP       DS          ;恢复DS
              STI
              RET
    INIT_INT  ENDP                  ;初始化中断子程序结束
   
 RESTORE_INT  PROC      NEAR        ;恢复原中断子程序开始
              CLI
              MOV       DX,OLD_INT_OFF
              MOV       AX,OLD_INT_SEG
              MOV       DS,AX
              MOV       AH,25H
              MOV       AL,1CH
              INT       21H
              STI
              RET
 RESTORE_INT  ENDP                  ;恢复原中断子程序结束
 
        DISP  PROC      NEAR        ;新的1ch中段程序开始
              CLI
              MOV       AX,D_SEG    ;为确保访问到字符串,重新指定DS
              MOV       DS,AX
              MOV       AX,0B83CH   ;显存区地址B8000h~Bffffh,(25行,160列)
              MOV       ES,AX
  
              INC       COUNT
              CMP       COUNT,18
              JE        J
                 
       BACK:  STI
              IRET
             
              J:
              CALL      CLRSC
              MOV       BX,0        ;在屏幕显示字符
              MOV       SI,0
              MOV       CX,2EH
         S1:  MOV       AL,[BX+SHOW1]
              MOV       ES:[SI+20H],AL
              MOV       AL,[BX+SHOW2]           ;show1有46(2e)个字符
              MOV       ES:[SI+0A0H+20H] ,AL
              MOV       AL,[BX+SHOW3]
              MOV       ES:[SI+140H+20H],AL
              ADD       BX,1
              ADD       SI,2
              LOOP      S1
              MOV       AL,24H      ;字符的属性,如:2h可为绿色
              MOV       ES:[73H],AL
              MOV       AL,25H      ;字符的属性,如:2h可为绿色
              MOV       ES:[73H+0A0H],AL
              MOV       AL,27H      ;字符的属性,如:2h可为绿色
              MOV       ES:[73H+140H],AL
             
              MOV       BX,0
              MOV       SI,0
              MOV       CX,14
         S2:  MOV       AL,[BX+TIME]            ;time的首地址
              MOV       ES:[SI+280H+30H],AL
              INC       SI
              MOV       AL,7CH      ;字符的属性,如:2h可为绿色 0fch
              MOV       ES:[SI+280H+30H],AL
              INC       BX
              INC       SI
              LOOP      S2
             
              INC       SL
              CMP       SL,3AH      ;10的ascii码
              JNE       LP
              MOV       SL,'0'      ;
              INC       SH
              CMP       SH,'6'
              JNE       LP
              MOV       SH,'0'      ;
              INC       ML
              CMP       ML,3AH      ;10的ascii码
              JNE       LP
              MOV       ML,'0'      ;
              INC       MH
              CMP       MH,'6'
              JNE       LP
              MOV       MH,'0'      ;
              INC       HL
              CMP       HL,'4'
              JNE       LP
              MOV       HL,'0'      ;
              INC       HH
              CMP       HH,'2'
              JNE       LP
              MOV       HH,'0'      ;超过24h就全部清零
              MOV       HL,'0'
              MOV       MH,'0'
              MOV       ML,'0'
              MOV       SH,'0'
              MOV       SL,'0'
   
         LP:                        ;ADD       CX,18
              MOV       COUNT,0
              JMP       BACK

       CLRSC  PROC      NEAR
              PUSH      AX          ;清屏子程序
              PUSH      BX
              PUSH      CX
              PUSH      DX
              MOV       CX,0
              MOV       DH,25       ;(DH、DL)=窗口的右下角位置(Y坐标,X坐标)
              MOV       DL,80
              MOV       BH,7        ;BH=空白区域的缺省属性
              MOV       AL,0
              MOV       AH,6
              INT       10H
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
       CLRSC  ENDP
                         
        DISP  ENDP                  ;新的1ch中段程序结束
    
       C_SEG  ENDS                  ;代码段结束
              END       MAIN        ;程序结束
 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值