AD8255PA EQU 08H AD8255PB EQU 0AH AD8255PC EQU 0CH AD8255CON EQU 0EH
AD82530 EQU 10H AD8253CON EQU 16H
STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS
DATA SEGMENT LEDS DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H HOUR DB 0 MINUTE DB 0 SECOND DB 0 DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA
START:
PUSH DS MOV AX,DATA MOV DS,AX
CLI MOV AX,0 MOV ES,AX MOV SI,08H MOV AX,OFFSET TIME_INT MOV ES:[SI],AX MOV AX,CS MOV ES:[SI+2],AX
MOV AL,81H OUT AD8255CON,AL
MOV AL,36H OUT AD8253CON,AL MOV AX,40000 OUT AD82530,AL MOV AL,AH OUT AD82530,AL
L: CALL TIME_CHANGE CALL DISPLAY_TIME JMP L
TIME_CHANGE: PUSH AX IN AL,AD8255PC AND AL,0FH CMP AL,06H JE ADD_SECOND CMP AL,0AH JE ADD_MINUTE CMP AL,0CH JE ADD_HOUR JMP ADD_NULL
ADD_SECOND: CALL INC_SECOND CALL DELAY_KEY JMP ADD_NULL
ADD_MINUTE: CALL INC_MINUTE CALL DELAY_KEY JMP ADD_NULL
ADD_HOUR: CALL INC_HOUR CALL DELAY_KEY
ADD_NULL: POP AX RET
INC_SECOND: PUSH AX INC SECOND MOV AL,SECOND CMP AL,60 JNE END0 MOV AL,0 MOV SECOND,AL CALL INC_MINUTE
END0: POP AX RET
INC_MINUTE: PUSH AX INC MINUTE MOV AL,MINUTE CMP AL,60 JNE END1 MOV AL,0 MOV MINUTE,AL CALL INC_HOUR
END1: POP AX RET
INC_HOUR: PUSH AX INC HOUR MOV AL,HOUR CMP AL,24 JNE END2 MOV AL,0 MOV HOUR,AL
END2: POP AX RET
WRITE_LEDS: MOV BP,SP PUSH AX PUSH DX MOV AX,[BP+4] OUT AD8255PB,AL MOV BX,[BP+2] LEA SI,LEDS MOV AL,[BX+SI] OUT AD8255PA,AL POP DX POP AX RET 4
WRITE_TIME: MOV BP,SP PUSH AX PUSH CX PUSH DX MOV AX,[BP+2] MOV DL,10 DIV DL MOV CL,AH MOV DX,[BP+4] PUSH DX XOR AH,AH PUSH AX CALL WRITE_LEDS CALL DELAY INC DX PUSH DX XOR CH,CH PUSH CX CALL WRITE_LEDS POP DX POP CX POP AX RET 4
DISPLAY_TIME: PUSH AX
MOV AX,0 PUSH AX MOV AL,HOUR XOR AH,AH PUSH AX CALL WRITE_TIME CALL DELAY
MOV AX,2 PUSH AX MOV AL,MINUTE XOR AH,AH PUSH AX CALL WRITE_TIME CALL DELAY
MOV AX,4 PUSH AX MOV AL,SECOND XOR AH,AH PUSH AX CALL WRITE_TIME CALL DELAY POP AX RET
DELAY: PUSH BX PUSH CX MOV BX,2
DEL0: MOV CX,100
DEL1: DEC CX CMP CX,0 JNE DEL1 DEC BX CMP BX,0 JNE DEL0 POP CX POP BX RET
DELAY_KEY: PUSH BX PUSH CX MOV BX,50
DEL_K0: MOV CX,300
DEL_K1: DEC CX CMP CX,0 JNE DEL_K1 DEC BX CMP BX,0 JNE DEL_K0 POP CX POP BX RET
TIME_INT: CALL INC_SECOND IRET
CODE ENDS END START
|