?? main.asm
字號:
;單片機時鐘控制程序,使用DS12887時鐘芯片,具有掉電保護功能
;設計:張更生,時間:2005年11月6日
;版本:1。0
;********************************************************
;編譯預定義
CS EQU P1.3
HOUR EQU 40H ;小時
MUNITE EQU 41H ;分鐘
SECOND EQU 42H ;秒
YEAR EQU 43H ;年
MONTH EQU 44H ;月
DAY EQU 45H ;日
HOLIDAY EQU 46H ;星期
MS EQU 3AH ;MS,MS255共用于定時
MS255 EQU 3BH
KEY_DIR_1 EQU 01H
OVER3S EQU 02H ;是否按住按鍵超過三秒
KEY_DIR EQU 03H ;是否有按鍵輸出
KEY_VOL EQU 3CH ;用于存按鍵值
FLASH_BIT EQU 3DH
ORG 0000H
SJMP 0030H
ORG 000BH ;定時器T0中斷控制動態顯示
LJMP ITP_T0
ORG 0030H
MAIN:
MOV SP, #60H ;INIT_RAM
CLR EA
CLR KEY_DIR_1
CLR KEY_DIR
CLR OVER3S
MOV TMOD, #01H ;初始化定時器T0
MOV TH0, #0FCH ;定時1MS
MOV TL0, #17H
MOV P0, 30H
MOV 38H, #0FEH
MOV 39H, #30H ;動態顯示緩存指針
MOV P2, #0FEH
MOV FLASH_BIT,#00H
SETB EA ;啟動定時器1MS中斷顯示功能
SETB ET0
SETB TR0
;********************************************************
;DS12887初始化
DS12887:
CLR TR0
CLR CS
PUSH P0
MOV P0, #0FFH
MOV DPH, P2
MOV DPL, #0AH
MOV A, #20H
MOVX @DPTR, A
MOV DPL, #0BH
MOV A, #02H
MOVX @DPTR, A
MOV DPL, #50H
MOV A, #20H
MOVX @DPTR, A
POP P0
SETB CS
SETB TR0
;********************************************************
LOOP:
CALL TIME_DISP ;調用時間顯示子程序
CALL KEYBO ;調用按鍵查詢
CALL DATE_DISP ;調用日期顯示
CALL CHANGE_TIME ;調用時間設置子程序
CALL CHANGE_RING ;改變打鈴設置
SJMP LOOP
;***************************************************************************************
;***************************************************************************************
;定時器一中斷子程序
ITP_T0: CLR EA
PUSH ACC
MOV R0, 39H
INC R0
MOV 39H, R0
CJNE R0, #38H, N_RESET
MOV R0, #30H ;如果超出緩存范圍,指針重置
MOV 39H, #30H
N_RESET:MOV A, @R0
CPL A
MOV P0, A
MOV A, 38H
RL A
MOV 38H, A
ORL A, FLASH_BIT
MOV P2, A
MOV A, MS ;計時(MS,MS255)
ADD A, #01H
MOV MS, A
MOV A, MS255
ADDC A, #00H
MOV MS255, A
MOV A, MS
CJNE A, #0FEH, TIP_T0_NEXT
SETB 00H
TIP_T0_NEXT:
MOV TH0, #0FCH ;定時1MS
MOV TL0, #17H
POP ACC
SETB EA
RETI
;*********************************************************
;時間顯示子程序
TIME_DISP:
JNB 00H, TIME_RET
CLR 00H
CLR TR0
CLR CS
PUSH P0
MOV P0, #0FFH
MOV DPH, P2
MOV DPL, #0AH
MOVX A, @DPTR
JB ACC.7, TIME_DISP;直到UIP位為0時才能讀數據
MOV DPL, #04H
MOVX A, @DPTR
MOV HOUR, A
MOV DPL, #02H
MOVX A, @DPTR
MOV MUNITE, A
MOV DPL, #00H
MOVX A, @DPTR
MOV SECOND, A
POP P0 ;恢復
SETB CS
SETB TR0
MOV DPTR, #TIME_TAB ;拆字并送往顯存
MOV 32H, #40H ;顯示"-"
MOV 35H, #40H
MOV A, HOUR ;以下產生時的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 30H, A
MOV A, HOUR ;以下產生時的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 31H, A
MOV A, MUNITE ;以下產生分的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 33H, A
MOV A, MUNITE ;以下產生分的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 34H, A
MOV A, SECOND ;以下產生秒的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 36H, A
MOV A, SECOND ;以下產生秒的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 37H, A
; sjmp $
TIME_RET:RET
TIME_TAB:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH, 00H, 78H
DB 31H, 40H
;***************************************************************
;日期顯示子程序
DATE_DISP:
JNB KEY_DIR,DATE_RET2 ;按鍵確認
MOV A, KEY_VOL
CJNE A, #01H, DATE_RET
CLR KEY_DIR
MOV MS, #00H ;對計時器清零
MOV MS255, #00H
DATE_DISP1:
JNB 00H, DATE_DIS_NO;每255MS調用一次日期顯示
CLR 00H
CLR TR0
CLR CS
PUSH P0
MOV P0, #0FFH
CALL GET_DATE ;獲取日期數據
POP P0 ;恢復
SETB CS
SETB TR0
MOV DPTR, #TIME_TAB ;拆字并送往顯存
MOV 32H, #40H ;顯示"-"
MOV 35H, #00H
MOV A, MONTH ;以下產生月份的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 30H, A
MOV A, MONTH ;以下產生月份的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 31H, A
MOV A, DAY ;以下產生日期的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 33H, A
MOV A, DAY ;以下產生日期的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 34H, A
MOV A, HOLIDAY ;以下產生星期的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 36H, A
MOV A, HOLIDAY ;以下產生星期的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 37H, A
DATE_DIS_NO:
CALL KEYBO
JNB KEY_DIR,DATE_WAIT
CLR KEY_DIR
SJMP DATE_RET
DATE_RET2:SJMP DATE_RET;中轉
DATE_WAIT:
MOV A, MS255 ;日期顯示時間超過4秒后退出
CJNE A, #0FH, DATE_DISP1
DATE_RET:RET
;****************************************************************
;
GET_DATE:
MOV DPH, P2
MOV DPL, #0AH
MOVX A, @DPTR
JB ACC.7, DATE_DIS_NO;直到UIP位為0時才能讀數據
MOV DPL, #09H
MOVX A, @DPTR
MOV YEAR, A
MOV DPL, #08H
MOVX A, @DPTR
MOV MONTH, A
MOV DPL, #07H
MOVX A, @DPTR
MOV DAY, A
MOV DPL, #06H
MOVX A, @DPTR
MOV HOLIDAY, A
;****************************************************************
;系統設置子程序
CHANGE_TIME:
JB KEY_DIR, CHANGE1
CGE_RET1:LJMP CHANGE_RET
CHANGE1:
MOV A, KEY_VOL
CJNE A, #81H, CGE_RET1
CLR KEY_DIR
CLR TR0 ;以下十行程序用于關閉DS12887的時鐘更新
CLR CS
PUSH P0
MOV DPH, P2
MOV DPL, #0BH
MOV A, #82H
MOVX @DPTR, A
CALL GET_DATE
POP P0
SETB CS
SETB TR0
MOV DPTR, #TIME_TAB ;拆字并送往顯存
MOV 32H, #00H ;顯示"="
MOV 35H, #00H
MOV A, YEAR ;以下產生年的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 30H, A
MOV A, YEAR ;以下產生年的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 31H, A
MOV A, MONTH ;以下產生月份的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 33H, A
MOV A, MONTH ;以下產生月份的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 34H, A
MOV A, DAY ;以下產生日期的高位
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
MOV 36H, A
MOV A, DAY ;以下產生日期的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 37H, A
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^關于年份的設置
CHANGE_YEAR:
MOV R7, #00000011B ;位閃
CALL FLASH
CHANGE_YEAR2:
CALL KEYBO
JNB OVER3S, YEAR_NEXT
MOV A, KEY_VOL
CJNE A, #82H, YEAR_NEXT
CALL INC_YEAR
CALL DLY100MS
CALL SAVE_12887 ;更新DS12887的數據
SJMP CHANGE_YEAR2
YEAR_NEXT:
JNB KEY_DIR,CHANGE_YEAR
CLR KEY_DIR
MOV A, KEY_VOL
CJNE A, #01H, YEAR_KEY2 ;按功能鍵的處理
SJMP CHANGE_MONTH
YEAR_KEY2:CJNE A, #02H, YEAR_KEY3 ;按調整鍵的處理
CALL INC_YEAR
CALL SAVE_12887
SJMP CHANGE_YEAR
YEAR_KEY3:CJNE A, #04H, CHANGE_YEAR ;按返回鍵的處理
CALL UPDATA_ON
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^關于月份的調置
CHANGE_MONTH:
MOV R7, #00011000B
CALL FLASH
CHANGE_MONTH2:
CALL KEYBO
JNB OVER3S, MONTH_NEXT
MOV A, KEY_VOL
CJNE A, #82H, MONTH_NEXT
CALL INC_MONTH
CALL DLY100MS
CALL SAVE_12887 ;更新DS12887的數據
SJMP CHANGE_MONTH2
MONTH_NEXT:
JNB KEY_DIR,CHANGE_MONTH
CLR KEY_DIR
MOV A, KEY_VOL
CJNE A, #01H, MONTH_KEY2 ;按功能鍵的處理
SJMP CHANGE_DAY
MONTH_KEY2:CJNE A, #02H, MONTH_KEY3 ;按調整鍵的處理
CALL INC_MONTH
CALL SAVE_12887
SJMP CHANGE_MONTH
MONTH_KEY3:CJNE A, #04H, CHANGE_MONTH ;按返回鍵的處理
CALL UPDATA_ON
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^關于天的設置
CHANGE_DAY:
MOV R7, #11000000B
CALL FLASH
CHANGE_DAY2:
CALL KEYBO
JNB OVER3S, DAY_NEXT
MOV A, KEY_VOL
CJNE A, #82H, DAY_NEXT
CALL INC_DAY
CALL DLY100MS
CALL SAVE_12887 ;更新DS12887的數據
SJMP CHANGE_DAY2
DAY_NEXT:
JNB KEY_DIR,CHANGE_DAY
CLR KEY_DIR
MOV A, KEY_VOL
CJNE A, #01H, DAY_KEY2 ;按功能鍵的處理
SJMP CHANGE_HOUR_L
DAY_KEY2:CJNE A, #02H, DAY_KEY3 ;按調整鍵的處理
CALL INC_DAY
CALL SAVE_12887
SJMP CHANGE_DAY
DAY_KEY3:CJNE A, #04H, CHANGE_DAY ;按返回鍵的處理
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -