如何自動(dòng)決定 DS1302 是否需要初始化
針對本論壇供應(yīng)的 51HEI-5 帶有的 DS1302 實(shí)驗(yàn),同時(shí)瀏覽了本實(shí)驗(yàn)中朋友們提及的實(shí)時(shí)時(shí)鐘初始化的問題.進(jìn)行一些補(bǔ)充:
1.例程可以正常顯示時(shí)分秒 6 位數(shù)字,
但是例程不是從 00:00:00 開始,先修改為每次都是從 00:00:00 開始.
例程僅僅讀取/初始化寫入 時(shí)分秒 3 個(gè)數(shù)據(jù),也修改為 讀取/初始化寫入 年月日星期時(shí)分秒 全部數(shù)據(jù).
不論數(shù)碼管是否可以顯示這么多內(nèi)容,都應(yīng)該這么做.------例程也許起到一種引路的作用,上面修改都很容易.
2.深入一步增加花樣:
設(shè)置好一個(gè)標(biāo)志.例如:F_XS5S.由它來輪流顯示年月日 或 時(shí)分秒.
在讀取秒信號(hào)時(shí),做一個(gè)秒數(shù)值的實(shí)時(shí)備份.如果讀取的新值與備份值相同.就說明顯示數(shù)據(jù)無需更新.(不用運(yùn)行 BCD 到 BIN 顯示數(shù)據(jù)的查表).-------沒有不要反反復(fù)復(fù)對同樣的數(shù)據(jù)做顯示準(zhǔn)備.可以節(jié)省大量運(yùn)行時(shí)間.
如果讀取的新值與備份值不同,就運(yùn)行一次 年月日時(shí)分秒 數(shù)據(jù)到顯示的處理,刷新一次顯示數(shù)據(jù).
同時(shí),對這個(gè)每秒信號(hào)進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)值≥5(也可以其它數(shù)值)時(shí),清零這個(gè)計(jì)數(shù)器,同時(shí)反轉(zhuǎn)一次標(biāo)志 F_XS5S .
當(dāng) F_XS5S =0 就顯示年月日.當(dāng) F_XS55=1 就顯示時(shí)分秒.
3.每次上電,程序會(huì)進(jìn)行一次對 1302 初始化,就必然都會(huì)從初始化數(shù)據(jù)可以運(yùn)行實(shí)時(shí)時(shí)鐘.-----在沒有電池保護(hù)時(shí),實(shí)際上當(dāng) 1302 完全失電后,原來的運(yùn)行數(shù)據(jù)會(huì)全部丟失.必須重新初始化!
但是,如果在調(diào)試時(shí),板子沒有失電,1302 也沒有失電,就不應(yīng)該進(jìn)行實(shí)時(shí)時(shí)鐘的初始化.
如何自動(dòng)決定 DS1302 是否需要初始化?
方法很簡單:程序重新運(yùn)行時(shí),在 1302 初始化子程序之前,首先讀取一次 1302 的信息,然后,對其信息進(jìn)行分析或比較,以此來決定是否需要初始化!
我們利用 1302 自帶的 31 個(gè)RAM ,僅僅使用一個(gè) RAM 就可以了.在第一次上電 1302 讀取數(shù)據(jù)后,同時(shí)也讀取一個(gè) RAM 的數(shù)據(jù),拿這個(gè)數(shù)據(jù)去比較一個(gè)特征碼,相同則不用運(yùn)行 1302 初始化程序,不相同則需要運(yùn)行 1302 的初始化程序.
示例程序:
;------------------------------------------ ORG 0000H JMP B_REST ;================================================== ORG 050H B_REST: MOV WDTCR,#WDTOF MOV SP,#0E0H;SP[81H],范圍: RAM 在 00H--0FFH. CALL Z_CRAM CALL Z_OFF8X8 ;關(guān)閉8*8點(diǎn)陣----僅僅51hei-5 使用 CALL GET_TIME ;讀取1302 MOV A,4FH ;特征碼在 4FH CJNE A,#0ABH,Z_INIT1302 ;特征碼是 #0abh (也可以其它啊!) JMP Z_LOOP ;特征碼相同跳轉(zhuǎn)到 Z_LOOP Z_INIT1302: CALL DS1302_INIT ;特征碼不同運(yùn)行 1302 初始化程序
;========================================================== Z_LOOP: CALL GET_TIME ;讀取1302 JNB F_1302,Z_LOOP0 ;F_1302=1刷新顯示數(shù)據(jù)
CLR F_1302 CALL Z_RTCBIN Z_LOOP0: CALL B_LEDXS JMP Z_LOOP ;_________________________
DS1302_INIT: CLR RST CLR CLK NOP NOP SETB RST ;實(shí)時(shí)時(shí)鐘寫入 ZM0 07FH MOV R1,#80H
Z_WR1302: ;秒,分,時(shí),天,月份,星期,年度==81H,83H,85H,97H,89H,8BH,8DH MOV R0,#00H CALL WRITE INC2 R1 COM_ R1,#86H,Z_WR1302 MOV R0,#01H ;天 CALL WRITE INC2 R1 MOV R0,#01H ;月份 CALL WRITE INC2 R1 MOV R0,#06H ;星期 CALL WRITE INC2 R1 MOV R0,#11H ;年度 CALL WRITE ZB1 F_1302 MOV R1,#0C8H MOV R0,#0ABH ;寫入特征碼 CALL WRITE RET
;=====================================
;讀時(shí)間 數(shù)據(jù)子程序 GET_TIME: ; ;秒,分,時(shí),天,月份,星期,年度==81H,83H,85H,97H,89H,8BH,8DH MOV R0,#40H MOV R1,#81H; 讀秒 Z_GET_TIME0: CALL READ MOV @R0,A;41H, INC R1
INC R1 INC R0 COM_ R0,#047H,Z_GET_TIME0 MOV R1,#0C9H ;讀出特征碼;內(nèi)部RAM命令與地址:C0H--FDH.奇數(shù)=讀,偶數(shù)=寫. CALL READ MOV 4FH,A ;讀出特征碼保存到4FH MOV A,40H CJNE A,7FH,Z_F1302 ;7fh 是上一次秒數(shù)值的備份 RET Z_F1302: MOV 7FH,A ;7fh 是秒數(shù)值的備份 ZB1 F_1302 ;設(shè)置刷新顯示標(biāo)志 INC 7EH COM_ 7EH,#5,Z_7EH ZM0 7EH CPL FRLSZ ;反轉(zhuǎn)輪流顯示標(biāo)志 Z_7EH: RET ;============================================
經(jīng)過這樣補(bǔ)充,就可以增加顯示年月日(輪流顯示),以及自動(dòng)判斷是否需要對 DS1302 進(jìn)行初始化.
僅供參考!
|