MINUTE EQU 41H ;存放分信息的單元
SECOND EQU 42H ;存放秒信息的單元
NUM EQU 43H ;存放T0溢出次數的單元
ORG 0000H ;程序入口
AJMP MAIN
ORG 0030H ;主程序入口
MAIN:MOV SP,#60H ;指定堆棧棧底
MOV HOUR,#00H
MOV MINUTE,#00H
MOV SECOND,#00H ;將時、分、秒分別清零
MOV NUM,#0
MOV TMOD,#01H ;設T0工作於方式1,用於定時
MOV TH0,#4CH ;設置T0的初始值
MOV TL0,#00H
MOV IE,#00H ;關中斷
SETB TR0 ;開啟定時器T0
LOOP:NOP
NOP
ACALL DISPLAY ;調用顯示子程序
NOP
NOP
LOOP1:JB TF0,TIME ;等待定時溢出
LJMP LOOP1
TIME:CLR TR0 ;關閉定逼?
PUSH DPL ;保護現場
PUSH DPH
PUSH ACC
MOV TH0,#4CH ;重新設置T0的值
MOV TL0,#00H
SETB TR0 ;開啟T0
MOV A,NUM
INC A ;溢出次數+1
MOV NUM,A
CJNE A,#0AH,TT1 ;檢測鍵盤
MOV P1,#0FH ;設鍵盤初值
MOV R0,#04H ;延時消抖
LCALL DELAY
JNB P1.0,T0C1 ;為0表示P1.0按下,轉T0C1調整秒
JNB P1.1,T0C2 ;為0表示P1.1按下,轉T0C2調整分
JNB P1.2,T0C3 ;為0表示P1.2按下,轉T0C3調整時
TT1: CJNE A,#140,RR4
MOV NUM,#00H
T0C1:MOV A,SECOND
INC A ;秒單元內容加1
DA A ;調整為BCD碼
MOV SECOND,A
CJNE A,#60H,RR4 ;不為60秒繼續等待
setb flag:
clr flag
RR1: MOV SECOND,#00H ;為60秒將秒單元清零
T0C2:MOV A,MINUTE
INC A ;分單元內容加1
DA A ;調整為BCD碼
MOV MINUTE,A
CJNE A,#60H,RR4 ;不為60分繼續等待
RR2: MOV MINUTE,#00H ;為60分,分單元清零
T0C3:MOV P1,#0F0H ; 1小時閃壹次
LCALL DELAY ;延時
MOV P1,#0FH
MOV A,HOUR
INC A ;時單元內容加1
DA A ;調整為BCD碼
MOV HOUR,A
CJNE A,#24H,RR4 ;不為24小時繼續等待
RR3: MOV HOUR,#00H ;為24小時,時單元清零
RR4: POP ACC ;恢復現場
POP DPH
POP DPL
LJMP LOOP
DELAY:MOV R1,#10H ;延時子程序
DELAY1:MOV R2,#20H
DJNZ R2,$
DJNZ R1,DELAY1
DJNZ R0,DELAY
RET
DISPLAY:MOV DPTR,#TAB ;送表頭基地址
MOV A,HOUR
ANL A,#0FH ;屏蔽時高位
MOVC A,@A+DPTR ;查時高位
MOV P0,A
CLR P2.6 ;開顯示
MOV R0,#1 ;延時消除鬼影
LCALL DELAY
SETB P2.6 ;關顯示
MOV A,HOUR
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
MOV R0,#1
LCALL DELAY
SETB P2.7
MOV A,MINUTE
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
MOV R0,#1
LCALL DELAY
SETB P2.4
MOV A,MINUTE
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
MOV R0,#1
LCALL DELAY
SETB P2.5
MOV A,SECOND
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
MOV R0,#1
LCALL DELAY
SETB P2.2
MOV A,SECOND
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
MOV R0,#1
LCALL DELAY
SETB P2.3
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
setb flag: clr flag