Main program (main), as follows:
ORG 0000H
Ajmp main
ORG 000BH
AJMP TIME
ORG 0300H
MAIN:
Mov 20h, # 00H
Mov 21h, # 00H
Mov 22h, # 00H
Mov 23h, # 00H
MOV IP, # 02h; IP, IE initialization
Mov IE, # 82h
MOV TMOD, # 01H; Set the timer mode?
MOV TL0, # 0B0H
Mov TH0, # 3ch
Setb TR0; start timing?
MOV SP, # 40H; Reset Stack Pointer
Next: LCALL DISP; call the display subroutine?
LCALL Key; call button detection subroutine
JZ NEXT;
LCALL Ankey; call button processing subroutine
SJMP next; recirculation
NOP
NOP
NOP
Timed interrupt handler:
Time: Push ACC; Protection Scene
Push PSW
MOV TL0, # 0B4H; Attribute initial value
Mov TH0, # 3ch
INC 20H;
Mov a, 20h
CJNE A, # 20, RETI1
MOV 20H, # 00H; one second time
Mov A, 21h
Add A, # 01h
DA A
MOV 21h, A
CJNE A, # 60h, Reti1
MOV 21h, # 00H; one minute
Mov A, 22h
Add A, # 01h
DA A
MOV 22H, A
CJNE A, # 60h, Reti1
Mov 22h, # 00H; one hour time
Mov A, 23h
Add A, # 01h
DA A
MOV 23h, A
CJNE A, # 24h, Reti1
MOV 23H, # 00H; to time reached 24 hours, clear.
Reti1: POP PSW; Restore Scene
POP ACC
Reti; interrupt return?
NOP
NOP
Show subroutine
DISP: ANL 2FH, # 10h; processing decimal point
Mov A, 21h; Treatment Second 21h -> 2DH, 2EH
ANL A, # 0fh
Orl A, 2FH
MOV 2FH, A
Mov A, 21h
ANL A, # 0f0h
SWAP A
Mov 2Eh, A
ANL 2DH, # 10h
Mov A, 22H; Treatment minutes 22H -> 2CH, 2DH
ANL A, # 0fh
Orl A, 2DH
MOV 2DH, A
Mov A, 22h
ANL A, # 0f0h
SWAP A
MOV 2ch, A
ANL 2BH, # 10h
MOV A, 23H; Treatment hours 23H -> 2ah, 2bh
ANL A, # 0fh
Orl a, 2bh
MOV 2BH, A
Mov A, 23h
ANL A, # 0f0h
SWAP A
Mov 2ah, A
MOV R0, # 2FH; display offset
Mov R3, # 06h
Mov dptr, # TABLE
Mov A, # 0bfh
LOOP1: MOV B, A;
MOV P2, A
Mov A, @ r0
MOVC A, @ a dptr
MOV P0, A; send display
MOV R2, # 80h; delay
DJNZ R2, $
Dec r0
Mov A, B
RR A
DJNZ R3, LOOP1; loop display
RET
Table: DB 28H, 7EH, 0A2H, 62H, 74H, 61H, 21h; without decimal points
DB 7AH, 20H, 60H, 00, 00, 00, 0000
DB 8H, 5EH, 82H, 42H, 54H, 41H, 1H, 5AH; with a decimal point
DB 00H, 40H, 00, 00, 00, 0000
NOP
NOP
Key judgment program
Key: MOV P3, # 0ffh;
Mov A, P3
CPL A
ANL A, # 3ch
JZ RETX; Return
LCALL DISP;
LCALL DISP
Mov A, P3
CPL A
ANL A, # 3ch
JZ RETX; keyboard to jitter.
MOV R6, A; deposit the key value to R6.
LOOP2: LCALL DISP;
Mov A, P3
CPL A
ANL A, # 3ch
JNZ loop2; Waiting button release
Mov A, R6
RETX: RET
NOP
NOP
Key to process subroutines
Ankey: CLR EA; Off Interrupt
LX: MOV A, R6
JB ACC.2, L1; is a function key to turn L1
JB ACC.3, L2; is confirmed to turn L2
JB ACC.4, L3; is reduced by 1 button to L3
JNB ACC.5, L12; not 1 button, turn L12
JB 2BH.4, L6; Judging which one (time, minute, second) value plus 1
JB 2DH.4, L8
JB 2FH.4, L9
L12: LCALL DISP
LCALL DISP
LCALL Key; Judging whether there is a keyry.
JZ L12
LJMP LX
L2: MOV 25h, # 00H; Confirm key handler
CLR 2BH.4
CLR 2DH.4
CLR 2FH.4
Setb EA
RET
L3: JB 2BH.4, L61; Add a key handler
JB 2DH.4, L81
JB 2FH.4, L91
AJMP L12
L1: MOV A, 25H; Function key handler
JZ LB1
JB ACC.0, LB2
JB ACC.1, LB3
JNB ACC.2, L12
LB1: MOV 25H, # 01H; 25H unit is a flag, (25h) = 01h adjustment time unit value
Setb 2bh.4
CLR 2DH.4
CLR 2FH.4
AJMP L12
LB3: MOV 25H, # 04H; 25H unit is a flag bit, (25h) = 01h adjustment second unit value
Setb 2fh.4
CLR 2DH.4
CLR 2BH.4
AJMP L12
LB2: MOV 25H, # 02H; 25H unit is a flag, (25h) = 01H adjustment unit value
Setb 2DH.4
CLR 2BH.4
CLR 2FH.4
AJMP L12
L61: AJMP L611;
L81: AJMP L811;
L91: AJMP L911
L6: MOV A, 23H;
Add A, # 01h
DA A
MOV 23h, A
CJNE A, # 24h, l15
L15: JC L112
Mov 23h, # 00H
L112: AJMP L12
L8: MOV A, 22H;
Add A, # 01h
DA A
MOV 22H, A
CJNE A, # 60h, L16
L16: JC L112
Mov 22h, # 00H
AJMP L12
L9: MOV A, 21h; second plus one
Add A, # 01h
DA A
MOV 21h, A
CJNE A, # 60h, L17
L17: JC L112
Mov 21h, # 00H
AJMP L12
L611: MOV A, 23h;
Add A, # 99h
DA A
MOV 23h, A
CJNE A, # 99h, l112
Mov 23h, # 23h
AJMP L12
L811: MOV A, 22H; Divided
Add A, # 99h
DA A
MOV 22H, A
CJNE A, # 99h, l112
Mov 22h, # 59h
AJMP L12
L911: MOV A, 21H; second reduction
Add A, # 99h
DA A
MOV 21h, A
CJNE A, # 99h, l112
Mov 21h, # 59h
AJMP L12
NOP
NOP
End