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