www.pudn.com > pengxm1.rar > pengxm1.asm


STACK     SEGMENT PARA STACK 'STACK' 
          DB 256 DUP(0) 
STACK     ENDS 
DATA      SEGMENT PARA PUBLIC 'DATA' 
INFO      DB 'MODE1:MIAOBIAO   MODE2:TIMER               R:RESET  ESC:OVER  H:HOLD  J:GOON    SP:WRITE         CR:READ                   PLEASE CHOOSE 1 OR 2 $' 
 
INFO2     DB 'PLEASE INPUT TIME:$' 
FLAG      DB 0 
FLAG1     DB 0 
INPUT     DB 9,'0','0','0',':','0','0',':','0','0' 
 
TENMINUTE DB '0' 
MINUTE    DB '0' 
          DB ':' 
TENSECOND DB '0' 
SECOND    DB '0' 
          DB ':' 
SECOND1   DB '0' 
SECOND2   DB '0' 
          DB '     ' 
 
YEAR      DB 0 
YEAR1     DB 0 
YEAR2     DB 0 
YEAR3     DB 0 
          DB '-' 
MONTH     DB 0 
MONTH1    DB 0 
          DB '-' 
DATE      DB 0 
DATE1     DB 0 
JILU      DB  'N','O','N','E',256 dup ('$') 
DATA      ENDS 
CODE      SEGMENT PARA PUBLIC 'CODE'  
          ASSUME CS:CODE,DS:DATA,ES:DATA 
START: 
          MOV    AX,DATA 
          MOV    DS,AX 
          MOV    ES,AX  
          CALL   CLRSC 
          MOV    AH,09H                ;显示初始信息 
          MOV    DX,OFFSET INFO 
          INT    21H 
          MOV    AL,0DH                   
          CALL   DISPCHAR 
CHOOSE: 
          MOV    AH,8                  ;等待模式选择 
          INT    21H 
          CMP    AL,'1' 
          JE     CHRONOGRAPH 
          CMP    AL,'2' 
          JE     TIMER 
          CMP    AL,01BH 
          JE     OVER1 
          JMP    CHOOSE 
OVER1:                                 ;跳出程序 
          MOV    AH,4CH 
          INT    21H 
CHRONOGRAPH:                           ;进入秒表模式 
          MOV    FLAG,1 
          JMP    GO 
 
TIMER:                                 ;进入定时模式 
          MOV    FLAG,0 
          CALL   CLRSC 
          MOV    AH,09H 
          MOV    DX,OFFSET INFO2       ;输入提示信息 
          INT    21H 
          MOV    DX,OFFSET INPUT       ;输入时间 
          MOV    AH,0AH 
          INT    21H 
          MOV    SI,OFFSET INPUT+2       
          MOV    AL,[SI] 
          MOV    TENMINUTE ,AL 
          MOV    AL,[SI+1]  
          MOV    MINUTE , AL 
          MOV    AL,[SI+3]        
          MOV    TENSECOND , AL 
          MOV    AL,[SI+4] 
          MOV    SECOND ,AL 
          MOV    AL,[SI+6]      
          MOV    SECOND1, AL 
          MOV    AL,[SI+7]   
          MOV    SECOND2, AL 
GO:   
          PUSH   DI   
          CLI 
          MOV    AX,0 
          MOV    ES,AX        
          MOV    DI,20H               ;修改08H中断向量 
          MOV    AX,OFFSET TIMER0 
          STOSW 
          MOV    AX,CS 
          STOSW 
          MOV    AL,36H               ;8253初始化 
          OUT    43H,AL 
          MOV    BX,1132                
          MOV    AL,BL 
          OUT    40H,AL 
          MOV    AL,BH 
          OUT    40H,AL 
          MOV    AL,0FCH 
          OUT    21H,AL 
          STI 
          POP    DI 
          PUSH   AX                   ;调用系统日期 
          PUSH   BX 
          PUSH   CX 
          PUSH   DX 
          PUSH   SI 
          MOV    AH,2AH 
          INT    21H 
          MOV    AX,CX 
          MOV    BX,DX 
          MOV    DX,0 
          MOV    SI,1000 
          DIV    SI 
          MOV    SI,DX 
          OR     AL,30H 
          MOV    YEAR,AL 
          MOV    AX,SI 
          MOV    DL,100 
          DIV    DL 
          MOV    DH,AH 
          OR     AL,30H 
          MOV    YEAR1,AL 
          MOV    AH,0 
          MOV    AL,DH 
          MOV    DL,10 
          DIV    DL 
          OR     AL,30H 
          MOV    YEAR2,AL 
          MOV    AL,DH 
          OR     AL,30H 
          MOV    YEAR3,AL 
          MOV    CX,BX  
          MOV    AX,BX 
          MOV    AL,AH 
          MOV    AH,0 
          MOV    BH,10 
          DIV    BH 
          OR     AL,30H 
          OR     AH,30H 
          MOV    DH,AH 
          MOV    MONTH,AL 
          MOV    MONTH1,DH 
          MOV    AX,CX 
          MOV    AH,0 
          MOV    BH,10 
          DIV    BH 
          OR     AL,30H 
          OR     AH,30H 
          MOV    DH,AH 
          MOV    DATE,AL 
          MOV    DATE1,DH 
          POP    SI 
          POP    DX 
          POP    CX 
          POP    BX 
          POP    AX                ;调用日期结束 
          CALL   CLRSC 
FOREVER: 
          MOV    BX,OFFSET TENMINUTE 
          MOV    CX,23 
DISPCLK: 
          MOV    AL,[BX]           ;显示时间几日期 
          CALL   DISPCHAR 
          INC    BX 
          LOOP   DISPCLK 
          MOV    AL,0DH 
          CALL   DISPCHAR 
          MOV    AL,SECOND2 
 
WAIT3:   
          CMP    AL,SECOND2 
          CLI 
          PUSHF 
          PUSH   AX 
          MOV    AH,0BH            ;键盘扫描 
          INT    21H 
          CMP    AL,0FFH 
          JE     SCAN  
          jmp    WAIT1          
SCAN:                            
          MOV    AH,7 
          INT    21H 
          CMP    AL,72H 
          JE     RESET 
          CMP    AL,01BH 
          JE     OVER 
          CMP    AL,68H 
          JE     HOLD 
          CMP    AL,020H 
          JE     WRITE 
          JMP    WAIT1 
OVER: 
          MOV    AH,4CH            ;跳出程序 
          INT    21H 
WRITE:                             ;存储当前时间 
          PUSH   AX 
          cmp    flag1,0 
          jne    write1 
          MOV    DI,OFFSET JILU                             
          mov    FLAG1,2 
WRITE1:  
          MOV    AL,TENMINUTE 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,MINUTE 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,':' 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,TENSECOND 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,SECOND 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,':' 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL, SECOND1 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,SECOND2 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,' ' 
          MOV    [DI],AL 
          INC    DI 
          MOV    AL,' ' 
          MOV    [DI],AL 
          INC    DI 
          POP    AX 
          JMP    WAIT1 
WAIT2 :  
          JMP    WAIT3               ;中间跳点   
RESET:                               ;复位 
          MOV    TENMINUTE , '0' 
          MOV    MINUTE , '0' 
          MOV    TENSECOND , '0' 
          MOV    SECOND , '0' 
          MOV    SECOND1, '0' 
          MOV    SECOND2 , '0' 
          CALL   START 
HOLD:                               ;暂停 
          PUSHF 
          PUSH   AX 
          MOV    AH,08h 
          INT    21H 
          CMP    AL,0DH 
          JE     READ 
          CMP    AL,6AH 
          JNE    HOLD 
          POP    AX 
          POPF  
          JMP    WAIT1 
READ:                                ;显示记录 
          CALL   CLRSC       
          MOV    DX,OFFSET JILU 
          MOV    AH,09H 
          INT    21H 
          MOV    AH,4CH 
          INT    21H 
WAIT1:   
          POP    AX 
          POPF  
          STI 
          JZ     WAIT2  
          JMP    FOREVER 
TIMER0    PROC   FAR                 ;08H中断向量入口 
          PUSH   AX 
          CMP    FLAG,0 
          JNE    TIMER2 
TIMER1: 
          DEC    SECOND2             ;定时 
          CMP    SECOND2,'0' 
          JGE    TIMERX 
          MOV    SECOND2,'9' 
          DEC    SECOND1 
          CMP    SECOND1,'0' 
          JGE    TIMERX 
          MOV    SECOND1,'9' 
          DEC    SECOND 
          CMP    SECOND,'0' 
          JGE    TIMERX 
          MOV    SECOND,'9' 
          DEC    TENSECOND 
          CMP    TENSECOND,'0' 
          JGE    TIMERX 
          MOV    TENSECOND,'5' 
          DEC    MINUTE 
          CMP    MINUTE,'0' 
          JGE    TIMERX 
          MOV    MINUTE,'9' 
          DEC    TENMINUTE 
          CMP    TENMINUTE,'0' 
          JGE    TIMERX 
          MOV    AH,4CH 
          INT    21H 
TIMERX: 
          MOV    AL,20H 
          OUT    20H,AL 
          POP    AX 
          IRET 
TIMER2:                               ;秒表 
          INC    SECOND2 
          CMP    SECOND2,'9' 
          JLE    TIMERX1 
          MOV    SECOND2,'0' 
          INC    SECOND1 
          CMP    SECOND1,'9' 
          JLE    TIMERX1 
          MOV    SECOND1,'0' 
          INC    SECOND 
          CMP    SECOND,'9' 
          JLE    TIMERX1 
          MOV    SECOND,'0' 
          INC    TENSECOND 
          CMP    TENSECOND,'6' 
          JL     TIMERX1 
          MOV    TENSECOND,'0' 
          INC    MINUTE 
          CMP    MINUTE,'9' 
          JLE    TIMERX1 
          MOV    MINUTE,'0' 
          INC    TENMINUTE 
          CMP    TENMINUTE,'9' 
          JLE    TIMERX1 
          MOV    TENMINUTE,'0' 
TIMERX1: 
          MOV    AL,20H 
          OUT    20H,AL 
          POP    AX 
          IRET 
DISPCHAR  PROC   NEAR               ;显示字符子程序 
          PUSH   BX 
          MOV    BX,0 
          MOV    AH,14 
          INT    10H 
          POP    BX 
          RET 
DISPCHAR  ENDP 
CLRSC     PROC   NEAR 
          PUSH   AX                 ;清屏子程序 
          PUSH   BX 
          PUSH   CX 
          PUSH   DX 
          MOV    CX,0 
          MOV    DH,25 
          MOV    DL,79 
          MOV    BH,7 
          MOV    AL,0 
          MOV    AH,6 
          INT    10H 
          POP    DX 
          POP    CX 
          POP    BX 
          POP    AX 
          RET 
CLRSC     ENDP 
CODE      ENDS 
          END    START