SEC EQU 32H ;秒 即時時間 \偽指令
MIN EQU 31H ;分
HOUR EQU 30H ;時
DAY EQU 35H ;日
MON EQU 34H ;月
YEAR EQU 33H ;年
MIN_1 EQU 41H ;分 定時器1 路、開存儲單元
HOUR_1 EQU 42H ;時
DAY_1 EQU 43H ;
MON_1 EQU 44H ;
YEAR_1 EQU 45H ;
MIN_11 EQU 40H ;分 定時器1 路、關存儲單元
HOUR_11 EQU 46H ;時
DAY_11 EQU 47H ;日
MON_11 EQU 48H ;月
YEAR_11 EQU 49H ;年
;***********************
ORG 0000H
ljmp MAIN
ORG 0003H ;中斷轉換顯示年月日、INT0(SB4 鍵)
LJMP SHOW
ORG 000BH ;計數中斷 T0、方式1
LJMP TIME
ORG 0013H
LJMP CHANGE; 調整時間、定時、INT1(SB0 鍵)
;------主程序
ORG 0030H
MAIN:
;--------初始化付值
MOV YEAR , #02
MOV MON , #05
MOV DAY , #01
MOV HOUR , #00
MOV MIN , #00
MOV SEC , #00
CLR 40H ;定時單元1 路清零
CLR 41H
CLR 42H
CLR 43H
CLR 44H
CLR 45H
CLR 46H
CLR 47H
CLR 48H
CLR 49H
;-------開中斷
MOV TMOD , #01H ;計數、模式1、T0
MOV TL0, #0B0H ;100SM 計數定時
MOV TH0, #3CH ;
clr p3.0
MOV 20H, #0AH ;10 次*100SM
SETB PT0 ;T0 為最高級
SETB TR0 ;允許計數
SETB ET0 ;允許T0 中斷
SETB EX0 ;允許INT0 中斷
SETB EX1 ;允許INT1 中斷
SETB EA ;開總中斷
;------顯示、定時器啟動判斷
LOOP:
MOV R1, #30H; 存儲單元
MOV R4, #01H; 位選通
MOV R3, #03H; 三組顯示
NEXT:
MOV A , @R1 ;
MOV B , #10 ;將存儲單元轉換成兩高低兩組的BCD 碼
DIV AB
SWAP A
ORL A, B
MOV P0, A;輸出
MOV P2, R4
INC R1 ;下一單元
MOV A, R4 ;
RL A ;位移
MOV R4, A
LCALL DE5SM ;延時0.5SM
DJNZ R3, NEXT ;全掃描顯示一偏
;------判斷定時輸出(只編寫了一路)
CJNE R7, #88H,LOOP ;是8 則開,否則、定時已關、轉
;---------開
MOV A, YEAR
CJNE A, YEAR_1, LOOP_1;年比較,不等轉關
MOV A, MON
CJNE A, MON_1, LOOP_1
MOV A, DAY
CJNE A , DAY_1,LOOP_1
MOV A, HOUR
CJNE A, HOUR_1,LOOP_1
MOV A, MIN
CJNE A, MIN_1, LOOP_1
CPL P3.0
;---------關
LOOP_1:
MOV A, YEAR
CJNE A, YEAR_11, LOOP;年比較
MOV A, MON
CJNE A, MON_11, LOOP
MOV A, DAY
CJNE A , DAY_11,LOOP
MOV A, HOUR
CJNE A, HOUR_11,LOOP
MOV A, MIN
CJNE A, MIN_11, LOOP
CPL P3.0
LJMP LOOP
;-----年月日顯示中斷子程序
SHOW:
PUSH PSW
push ACC
PUSH B
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
MOV R2, #0FFH ;中斷掃描次數
TURN: MOV R1 , #33H
MOV R4 , #01H
MOV R3 , #03H
NEXT_1:
MOV A, @R1
MOV B , #10
DIV AB
SWAP A
ORL A, B
MOV P0, A
MOV P2, R4
INC R1
RL A
MOV R4 ,A
LCALL DE5SM
DJNZ R3, NEXT_1
DJNZ R2, TURN ;反復顯示一定時間后返回
POP 04H
POP 03H
POP 02H
POP 01H
POP B
POP ACC
POP PSW
RETI
;-----計數中斷服務子程序
TIME:
PUSH PSW
PUSH ACC
PUSH B
PUSH 06H
MOV TH0 , #3CH;重裝計數
MOV TL0 , #0BH;
DJNZ 20H, OUT ;轉到中斷跳出pop 程序
MOV 20H, #0AH ; 重裝:100*10=1000
;-----進位程序
INC SEC
MOV R6, SEC ;
CJNE R6, #60, OUT;比較
MOV SEC , #00 ;
INC MIN
MOV R6, MIN
CJNE R6, #60, OUT
MOV MIN , #00
INC HOUR
MOV R6 , HOUR
CJNE R6 , #25 , OUT
MOV HOUR ,#00
INC DAY
MOV R5, MON
CJNE R5, #1, MON_22;是否1 月、不是轉2 月
MOV R5, DAY
CJNE R5, #32, OUT ; 本月是否益出
INC MON
MOV DAY,#1
LJMP OUT
OUT:
POP 06H
POP B
POP ACC
POP PSW
RETI
MON_22:
MOV R5, MON
CJNE R5 , #2 , MON_33;是否2 月、不是轉3 月
MOV A, YEAR ;判斷是否瑞年
MOV B, #4
DIV AB
MOV A , B
JNZ OUT_1;不是則轉(A 不為零則轉)
MOV R5 ,DAY
CJNE R5,#30, OUT;如是瑞年、判斷是否到29 天
INC MON
MOV DAY ,#1
LJMP OUT
OUT_1:
MOV R5, DAY
CJNE R5, #29, OUT ;平年二月判斷
INC MON
MOV DAY , #1
LJMP OUT
MON_33:
MOV R5, MON
CJNE R5, #3 , MON_44
MOV R5, DAY
CJNE R5 , #32, OUT
INC MON
MOV DAY , #1
LJMP OUT
MON_44:
MOV R5, MON
CJNE R5,#4, MON_55
MOV R5, DAY
CJNE R5 ,#31,OUT
INC MON
MOV DAY , #1
LJMP OUT
MON_55:
MOV R5,MON
CJNE R5,#5, MON_66
MOV R5,DAY
CJNE R5,#32,OUT
INC MON
MOV DAY,#1
LJMP OUT
MON_66:
MOV R5, MON
CJNE R5,#6, MON_77
MOV R5, DAY
CJNE R5 ,#31,OUT
INC MON
MOV DAY , #1
LJMP OUT
MON_77:
MOV R5, MON
CJNE R5,#7, MON_88
MOV R5, DAY
CJNE R5,#32,L1
INC MON
MOV DAY , #1
L1: LJMP OUT
MON_88:
MOV R5, MON
CJNE R5,#8, MON_99
MOV R5, DAY
CJNE R5 ,#32,L2
INC MON
MOV DAY , #1
L2: LJMP OUT
MON_99:
MOV R5, MON
CJNE R5,#9, MON_00
MOV R5,DAY
CJNE R5 ,#31,L3
INC MON
MOV DAY , #1
L3: LJMP OUT
MON_00:
MOV R5, MON
CJNE R5,#10, MON_AA
MOV R5, DAY
CJNE R5 ,#32,L4
INC MON
MOV DAY , #1
L4: LJMP OUT
MON_AA:
MOV R5, MON
CJNE R5,#11, MON_BB
MOV R5,DAY
CJNE R5,#31,L5
INC MON
MOV DAY , #1
L5: LJMP OUT
MON_BB:
MOV R5, DAY
CJNE R5 ,#32,L6
INC YEAR
MOV MON, #1
MOV DAY , #1
L6:LJMP OUT
;-------按SB2\定時器年單元加1 子程序
SB3_2: LJMP SHOW_2 ;二路沒編返回
SB3_3: LJMP SHOW_3 ;三路沒編返回
SB3_1:
MOV A , YEAR_1 ; 調時年單元
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H, SB3_1
CJNE A, #0FBH, KEY2_7 ;按SB2 轉年調整
LJMP MON_111 ;按SB1 往下調月單元
KEY2_7:CJNE A, #0FDH, SB3_1
INC YEAR_1 ; 1 路年單元加1
MOV R5,YEAR_1
CJNE R5,#09,SB3_1 ;益出
MOV YEAR_1, #00H
AJMP SB3_1 ;
;-------月單元加1 子程序
MON_111:
MOV A , MON_1 ; 調時月單元顯示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H, MON_111
CJNE A, #0FBH, KEY2_8 ;按SB2 轉月調整
LJMP DAY_111
KEY2_8:
CJNE A,#0FDH,MON_111
INC MON_1 ;1 路月單元加1
MOV R5,MON_1
CJNE R5,#13,MON_111;益出
MOV MON_1, #01H
AJMP MON_111 ; 轉到月顯
;_------日單元加1 子程序
DAY_111:
MOV A , DAY_1 ; 調時日單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #04H
LCALL READ
LCALL DE250SM
CJNE A, 01H,DAY_111
CJNE A, #0FBH, KEY2_9 ;按SB2 轉日調整
LJMP HOUR_111
KEY2_9: CJNE A,#0FDH,DAY_111
INC DAY_1 ;1 組日單元加1
MOV R5, DAY_1
CJNE R5,#32,DAY_111;益出
MOV DAY_1, #01H
AJMP DAY_111 ; 轉到日顯
;-------按SB2 時單元加1 子程序
HOUR_111:
MOV A , HOUR_1 ; 調時時單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H,HOUR_111
CJNE A, #0FBH, KEY2_10 ; 按SB2 轉時調整
LJMP MIN_111
KEY2_10:CJNE A,#0FDH,HOUR_111
INC HOUR_1
MOV R5,HOUR_1
CJNE R5,#24,HOUR_111;益出
MOV HOUR_1, #00H
AJMP HOUR_111 ; 轉到時顯
;-------分單元加1 子程序
MIN_111:
MOV A , MIN_1 ; 調時分單元、并顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H,MIN_111
CJNE A, #0FBH, KEY2_11 ;按SB2 轉分調整
AJMP OFF_CH ;按SB3 往下調定時:關單元
KEY2_11: CJNE A, #0FDH, MIN_111
INC MIN_1 ;1 路分單元加1
MOV R5, MIN_1
CJNE R5,#60,MIN_111;益處
MOV MIN_1, #00H
AJMP MIN_111 ; 轉到分顯
年單元調整
OFF_CH: MOV A , YEAR_11 ; 調時年單元
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H, OFF_CH
CJNE A, #0FBH, KEY2_F7 ;按SB2 轉年調整
LJMP MON_OFF ;按SB1 往下調月單元
KEY2_F7:CJNE A, #0FDH, OFF_CH
INC YEAR_11 ; 1 路年單元加1
MOV R5,YEAR_11
CJNE R5,#09,OFF_CH ;益出
MOV YEAR_11, #00H
AJMP OFF_CH ;
;-------月單元加1 子程序
MON_OFF:
MOV A , MON_11 ; 調時月單元顯示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H, MON_OFF
CJNE A, #0FBH, KEY2_F8 ;按SB2 轉月調整
LJMP DAY_OFF
KEY2_F8:
CJNE A,#0FDH,MON_OFF
INC MON_11 ;1 路月單元加1
MOV R5,MON_11
CJNE R5,#13,MON_OFF;益出
MOV MON_11, #01H
AJMP MON_OFF ; 轉到月顯
;_------日單元加1 子程序
DAY_OFF:
MOV A , DAY_11 ; 調時日單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #04H
LCALL READ
LCALL DE250SM
CJNE A, 01H,DAY_OFF
CJNE A, #0FBH, KEY2_F9 ;按SB2 轉日調整
LJMP HOUR_OFF
KEY2_F9: CJNE A,#0FDH,DAY_OFF
INC DAY_11 ;1 組日單元加1
MOV R5, DAY_11
CJNE R5,#32,DAY_OFF;益出
MOV DAY_11, #01H
AJMP DAY_OFF ; 轉到日顯
;-------按SB2 時單元加1 子程序
HOUR_OFF:
MOV A , HOUR_11 ; 調時時單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H,HOUR_OFF
CJNE A, #0FBH, KEY2_F10 ; 按SB2 轉時調整
LJMP MIN_OFF
KEY2_F10:CJNE A,#0FDH,HOUR_OFF
INC HOUR_11
MOV R5,HOUR_11
CJNE R5,#24,HOUR_OFF;益出
MOV HOUR_11, #00H
AJMP HOUR_OFF ; 轉到時顯
;-------分單元加1 子程序
MIN_OFF:
MOV A , MIN_11 ; 調時分單元、并顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H,MIN_OFF
CJNE A, #0FBH, KEY2_F11 ;按SB2 轉分調整
LJMP ON_1 ;按SB3 往下調定時:開與關
KEY2_F11: CJNE A, #0FDH, MIN_OFF
INC MIN_11 ;1 路分單元加1
MOV R5, MIN_11
CJNE R5,#60,MIN_OFF;益處
MOV MIN_11, #00H
LJMP MIN_OFF ; 轉到分顯
;-------開、關定時
ON_1:CJNE A, #0FBH, MIN_OFF
K1: MOV A, #88H
MOV R7, A
MOV P0, A
MOV P2, #0FFH;三組都顯示開
LCALL READ
LCALL DE250SM
CJNE A, 01H, ON_1;去抖后比較
CJNE A, #0FBH,KEY2_12 ;按SB2 轉關
LJMP OUT_A ;按SB3 調出、處于開狀態
KEY2_12: CJNE A, #0FDH, K1
k2: MOV A, #00H; 顯示0 關
MOV R7, A
MOV P0, A
MOV P2, #0FFH;
LCALL READ
LCALL DE250SM
CJNE A, 01H, K2;去抖后比較
CJNE A, #0FBH,KEY2_13 ;按SB2 轉開
LJMP OUT_A ;SB3 調出、處關狀態
KEY2_13:
CJNE A, #0FDH, K2 ; 比較按了沒
LJMP K1 ; 按了SB2、轉開
OUT_A:
POP 00H
POP B
POP ACC
POP PSW
RETI
;_------讀取按鍵程序
READ:MOV A , P1;讀取按鍵
MOV R1, A
LCALL DE10MS
MOV A, P1
RET
;_----延時程序
DE5SM:
PUSH 01H
MOV R1, #0FFH
DJNZ R1,$
POP 01H
RET
DE10MS: PUSH 04H
PUSH 05H
MOV R4, #0AH
Dl1: MOV R5, #0FFH
dl2: DJNZ R5,$
DJNZ R4,dl1
POP 05H
POP 04H
RET
DE250SM:PUSH 02H
PUSH 00H
MOV R0, #0FFH
DEL:MOV R2, #0FFH
DJNZ R2,$
DJNZ R0, DEL
POP 00H
POP 02H
RET
;_---調整時間進位程序
MIN_AD:
INC MIN
MOV R6, MIN
CJNE R6, #60, OU1
MOV MIN , #00
OU1: RET
HOUR_AD:
INC HOUR
MOV R6 , HOUR
CJNE R6 , #25 , OU2
MOV HOUR ,#00
OU2: RET
DAY_AD:
INC DAY
MOV R6, DAY
CJNE R6 , #32, OU3 ; 是否益出
MOV DAY ,#01H
OU3: RET
MON_AD:
INC MON
MOV R6, MON
CJNE R6, #13, OU4 ; 是否益出
MOV MON ,#01H
OU4: RET
YEAR_AD:
INC YEAR
MOV R6, YEAR
CJNE R6, #09, OU5;是否益出
MOV YEAR ,#00H
OU5: RET
END
|