|
;這是DS1302的讀寫子程序部分,已經(jīng)注釋的很清楚了。
;********************************************************
;DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302
;以下是有關(guān)DS1302的讀寫、設(shè)置程序
;由于DS1302的寄存數(shù)據(jù)是壓縮BCD碼,為了和其他程序?qū)臃奖?
;MCU的數(shù)據(jù)仍然用16進(jìn)制,所以讀出和寫入前先轉(zhuǎn)換成16進(jìn)制
;**********************************************************
ZH_16_BCD:
MOV A, YEAR ;為了和顯示子程序接口進(jìn)行了調(diào)整
CALL ZH_16_BCD1
MOV H_YEAR, A
MOV A, MONTH
CALL ZH_16_BCD1
MOV H_MONTH, A ;
MOV A, DATE
CALL ZH_16_BCD1
MOV H_DATE, A ;
MOV A, HOUR ;
CALL ZH_16_BCD1
MOV H_HOUR, A
MOV A, MIN_F ;
CALL ZH_16_BCD1
MOV H_MIN_F, A
MOV A, SEC ;
CALL ZH_16_BCD1
MOV H_SEC, A
RET
ZH_16_BCD1:
MOV B, #10
DIV AB ;16進(jìn)制轉(zhuǎn)換到10進(jìn)制后寫入1302
SWAP A ;"壓縮BCD碼"
ADD A, B
RET
;**********************************************************
ZH_BCD_16: ;二—十BCD碼轉(zhuǎn)換成十六進(jìn)制碼
PUSH 00H
MOV @R0, #0 ;BCD碼轉(zhuǎn)換成16進(jìn)制
XCHD A, @R0 ;個(gè)位轉(zhuǎn)到@R0暫存
SWAP A ;十位轉(zhuǎn)到低4位
MOV B, #0AH ;十位數(shù)乘以10(0AH)
MUL AB ;
ADD A, @R0 ;加上個(gè)位數(shù)
POP 00H
RET
;********************************************
;入口參數(shù):寫入或讀出的首數(shù)據(jù)在H_SEC中,寫或讀的首地址
;固定為秒;寫入或讀出的字節(jié)個(gè)數(shù)在R7中
;********************************************
RW1302:
MOV A, CMD1302
RW1302_11:
CLR RST1302
CLR SCLK1302 ;拉高RST前,一定置SCLK低
NOP ;
SETB RST1302 ;拉高RST,對(duì)1302讀寫有效
RW1302_1: ;發(fā)送指令
MOV A, CMD1302 ;取指令
MOV R6, #8 ;循環(huán),8位指令
RW1302_2: ;
CLR SCLK1302 ;
RRC A ;
MOV IO1302, C ;
NOP ;
SETB SCLK1302 ;
DJNZ R6, RW1302_2 ;以上6行是寫指令
RW1302_22:
MOV R6, #8 ;8位數(shù)據(jù)
MOV A, CMD1302 ;僅僅判斷程序走向
JNB ACC.0, RW1302_4 ;讀寫分別處理,ACC.0=0,轉(zhuǎn)
RW1302_3: ;ACC.0=1,是讀,轉(zhuǎn)來
CLR SCLK1302 ;以下是讀數(shù)據(jù)
NOP ;
MOV C, IO1302
NOP ;
SETB SCLK1302 ;
RRC A ;
DJNZ R6, RW1302_3 ;以上7行是寫數(shù)據(jù)
MOV @R0, A ;送緩存
SJMP RW1302_6 ;跳過“寫”
RW1302_4: ;
MOV A, @R0 ;如果ACC.0=0,是寫,轉(zhuǎn)來
RW1302_5: ;
RRC A ;
CLR SCLK1302 ;
MOV IO1302, C ;
NOP ;
SETB SCLK1302 ;
DJNZ R6, RW1302_5 ;
RW1302_6: ;
INC R0 ;指向下一緩存位
DJNZ R7, RW1302_22 ;字節(jié)數(shù)沒完,轉(zhuǎn)回繼續(xù)
CLR RST1302 ;讀寫完后,拉低RST,禁止讀寫1302
; NOP ;
; CLR SCLK1302 ;
RET ;
;********************************************
;INITIALIZE DS1302, 打開寫保護(hù)
;設(shè)置充電, 啟動(dòng)時(shí)鐘
;********************************************
INIT1302: ;
CLR SCLK1302 ;
CLR RST1302 ;
MOV CMD1302, #8EH ;打開寫保護(hù),允許寫入
MOV H_SEC, #0 ;讀寫的數(shù)據(jù)
MOV R7, #1 ;讀寫的字節(jié)數(shù)
MOV R0, #H_SEC ;地址送R0
CALL RW1302 ;調(diào)用讀寫子程序
MOV CMD1302, #90H ;涓流充電
MOV H_SEC, #0A5H ;數(shù)據(jù),一個(gè)二極管,2K電阻
MOV R7, #1 ;讀寫的字節(jié)數(shù)
MOV R0, #H_SEC ;
CALL RW1302 ;調(diào)用讀寫子程序
CALL ZH_16_BCD ;將時(shí)間值16進(jìn)制轉(zhuǎn)換成BCD
MOV H_SEC+7, #00 ;1302第8個(gè)寄存器,寫保護(hù)
MOV CMD1302, #0BEH ;連續(xù)寫時(shí)鐘數(shù)據(jù)指令
MOV R7, #8 ;讀寫的字節(jié)數(shù),設(shè)置7,也是連續(xù)8個(gè)數(shù)據(jù)
MOV R0, #H_SEC ;
CALL RW1302 ;調(diào)用讀寫子程序
MOV CMD1302, #11000000B ;寫入1302 RAM 00H單元
MOV H_SEC, #00000101B ;讀寫的數(shù)據(jù),寫入05H,設(shè)置過標(biāo)記
MOV R7, #1 ;讀寫的字節(jié)數(shù)
MOV R0, #H_SEC ;地址送R0
CALL RW1302 ;調(diào)用讀寫子程序
MOV CMD1302, #10000000B ;寫秒寄存器指令
MOV A, SEC ;H_SEC的值已被改變,重讀
CALL ZH_16_BCD1 ;寫入“秒“當(dāng)前值
CLR ACC.7 ;最高位=0,啟動(dòng)時(shí)鐘(冗余)
MOV H_SEC, A ;讀寫的數(shù)據(jù),最高位為0,啟動(dòng)時(shí)鐘
MOV R7, #1 ;讀寫的字節(jié)數(shù)
MOV R0, #H_SEC ;
CALL RW1302 ;調(diào)用讀寫子程序
MOV CMD1302, #10001110B ;設(shè)置寫保護(hù)指令
MOV H_SEC, #10000000B ;讀寫的數(shù)據(jù),不允許寫入
MOV R7, #1 ;讀寫的字節(jié)數(shù)
MOV R0, #H_SEC ;地址送R0
CALL RW1302 ;調(diào)用讀寫子程序
RET
;DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 DS1302 |
|