?? ds1302.txt
字號:
串行日歷/時鐘芯片DS1302的應用子程序
CODE:
;范例99
; AVR與DS1302接口為:PC0--SCLK,PC1--DATA,PC2--/RST。請參看本范例之附圖。
; 結構與運作特點如下:
;(1)采用標準頻率晶體(32768HZ),便于調整(可加電容補償),可對PC0/PC1/PC2加提拉電阻。
;(2)DS1302只有8只腳,小巧精悍,耗電省,抗干擾.便于與單片機接口,以串行方式按位讀寫數(shù)據(jù).
;(3)以備用電池供電保存數(shù)據(jù),斷電后自動執(zhí)行寫保護,故可靠性高。上電后須用指令解除寫保護。
;(4)片內除8個時鐘日歷單元外還有31個RAM單元,可作為系統(tǒng)斷電保護數(shù)據(jù)存儲單元
;(5)可以并發(fā)(BURST,即連續(xù))方式讀寫8個時鐘日歷單元(秒/分/時/日/月/周/年/年)或讀寫31個RAM單元,
; 命令如下:
; $BE為以并發(fā)方式寫8個時鐘日歷單元,$BF為以并發(fā)方式讀8個時鐘日歷單元。
; $FE為以并發(fā)方式寫31個RAM單元,$FF為以并發(fā)方式讀31個RAM單元。
;(6)除以并發(fā)方式讀寫外,還可按字節(jié)讀寫,但讀寫前須先寫入命令。
; 讀寫命令格式為:1 Y A4 A3 A2 A1 A0 X,最高位為1表示命令有效,Y=0,選擇讀寫時間/日期
; Y=1,選擇讀寫片內RAM,A4-A0,片內RAM/時鐘單元地址,X=0,選擇寫操作,X=1,選擇讀
;操作.
;(7)串行時鐘上升沿寫入一位數(shù)據(jù),下降沿讀出一位數(shù)據(jù);且讀寫只有在/RST信號為高時才有效。
; 故要求/RST信號有效前時鐘信號應已就緒。
;(8)本程序AVR時鐘為4MHZ,若使用其他時鐘,重新調整讀寫延時時間(程序中NOP之個數(shù))
;(9)對RAM并發(fā)讀寫方法可參考并發(fā)讀寫時鐘日歷子程序進行.
;1)并發(fā)(BURST)方式寫時鐘日歷單元(時鐘日歷數(shù)據(jù) 秒,分,時,日,月,周,年,年分別在R8--R15,)
WBURST: CLR YH ;
LDI YL,8 ;數(shù)據(jù)指針,首指秒單元R8
RCALL DEPRV ;解除寫保護(寫入$8E00)
CBI PORTC,0 ;為上升沿寫作準備(SCLK升高)
NOP
NOP
NOP
SBI PORTC,2 ;復位信號變高(SETB RST)
NOP
NOP
NOP
NOP
NOP
NOP
LDI R18,$BE ;BURST(wr.) ADDR.&INSTRUC.(命令$BE)
RCALL WBYTE ;
WLOP: LD R18,Y+ ;r9
RCALL WBYTE ;寫入1字節(jié)數(shù)據(jù)
CPI YL,16
BRNE WLOP ;數(shù)據(jù)都寫完?
CBI PORTC,2 ;禁止讀寫
NOP
NOP
NOP
NOP
CBI PORTC,0
RET
;2)并發(fā)(BURST)方式讀時鐘日歷單元(時鐘日歷數(shù)據(jù) 秒,分,時,日,月,周,年,
;分別讀到R8--R14中)
RBURST: CLR YH ;首指R8
LDI YL,8
SBI DDRC,0 ;SCLK 輸出
SBI DDRC,2 ;WR/RD ENABLE 輸出
SBI PORTC,0 ;時鐘SCLK初始輸出為低
NOP
NOP
NOP
SBI PORTC,2 ;復位有效,允許時鐘相關沿有效
NOP
NOP
NOP
NOP
NOP
NOP
LDI R18,$BF ;BURST(rd.) ADDR.&INSTRUC.
RCALL WBYTE ;寫入并發(fā)讀命令
RLOP: RCALL RBYTE ;讀出一字節(jié)時鐘/日歷數(shù)據(jù)
ST Y+,R18 ;存儲
CPI R28,15
BRNE RLOP ;數(shù)據(jù)都讀完?
CBI PORTC,2 ;禁止讀寫
NOP
NOP
NOP
NOP
CBI PORTC,0 ;使SCLK變低
RET
;3)解除寫保護子程序(對DS1302寫入$8E,$00)
DEPRV: SBI DDRC,0 ;SCLK 輸出
SBI DDRC,2 ;WR/RD ENABLE 輸出
CBI PORTC,0 ;時鐘SCLK初始輸出為低
NOP
NOP
NOP
SBI PORTC,2 ;復位有效,允許時鐘相關沿有效
NOP
NOP
NOP
NOP
NOP
NOP
LDI R18,$8E
RCALL WBYTE
NOP
NOP
CLR R18
RCALL WBYTE ;寫入$8E和$00
CBI PORTC,2 ;禁止讀寫
NOP
NOP
NOP
NOP
CBI PORTC,0
RET
;4)對DS1302秒,分,時單元寫入3字節(jié)數(shù)據(jù)
WTIME: CLR YH ;
LDI R17,$80 ;寫秒單元命令
LDI YL,8 ;R8(秒)R9(分)R10(時)
LDI R19,3
WCOM: RCALL DEPRV ;解除寫保護
WLOP1: CBI PORTC,0 ;時鐘SCLK初始輸出為低
NOP
NOP
NOP
SBI PORTC,2 ;復位有效,允許時鐘相關沿有效
NOP
NOP
NOP
NOP
NOP
NOP
MOV R18,R17
RCALL WBYTE ;寫入一字節(jié)命令
SUBI R17,$FE ;指向時間下一單元 相當于 r17+2
LD R18,Y+ ;Y地址的數(shù)據(jù)加載后 地址+1
RCALL WBYTE ;寫入時間單元1字節(jié)
CBI PORTC,2 ;禁止讀寫
NOP
NOP
NOP
NOP
CBI PORTC,0
DEC R19
BRNE WLOP1 ;寫完規(guī)定字節(jié)?
RET
;5)寫入日期子程序
WDATE: CLR YH ;
LDI YL,11 ;R11(日)R12(月)R13(周)R14(年)
LDI R17,$86 ;寫日單元命令
LDI R19,4
RJMP WCOM
;6)讀出時間子程序
RTIME: CLR YH ;
LDI R17,$81 ;讀秒單元命令
LDI YL,8 ;讀出數(shù)據(jù)送到R8(秒)R9(分)R10(時)
LDI R19,3
RCOM: SBI DDRC,0 ;SCLK 輸出
SBI DDRC,2 ;WR/RD ENABLE 輸出
RLOP1: CBI PORTC,0 ;時鐘SCLK初始輸出為低
NOP
NOP
NOP
SBI PORTC,2 ;允許讀寫
NOP
NOP
NOP
NOP
NOP
NOP
MOV R18,R17
RCALL WBYTE ;寫入讀命令
SUBI R17,$FE ;指向下一單元地址
RCALL RBYTE ;讀出一字節(jié)數(shù)據(jù)
ST Y+,R18
CBI PORTC,2 ;禁止讀寫
NOP
NOP
NOP
NOP
CBI PORTC,0 ;時鐘變低
DEC R19
BRNE RLOP1 ;已讀出規(guī)定字節(jié)?
RET
;7)讀出日期子程序
RDATE: CLR YH
LDI YL,11 ;讀出數(shù)據(jù)放入R11(日)R12(月)R13(周)R14(年)
LDI R17,$87 ;讀出日單元命令
LDI R19,4
RJMP RCOM
;8)將R18中數(shù)據(jù)寫入DS1302
WBYTE: LDI R16,8 ;8位/字節(jié)
SBI DDRC,1 ;PC1為輸出
WB1: CBI PORTC,0 ;時鐘SCLK初始輸出為低
ROR R18 ;一位數(shù)據(jù)傳到進位C
BRCC WB10
SBI PORTC,1
RJMP WB2
WB10: CBI PORTC,1 ;1位數(shù)據(jù)輸出到數(shù)據(jù)線(DS1302'DATA BUS)
WB2: NOP
NOP
NOP
NOP
SBI PORTC,0 ;上升沿寫入一位
DEC R16
BRNE WB1 ;8位數(shù)據(jù)都寫完?
RET
;9)讀出DS1302一字節(jié)數(shù)據(jù)在r18中
RBYTE: LDI R16,8 ;8位/字節(jié)
CBI DDRC,1 ;PC1輸入
RD1: CBI PORTC,0 ;下降沿讀出一位數(shù)據(jù)
NOP
NOP
NOP
NOP
SBI PORTC,1 ;上拉電阻激活
CLC
SBIC PINC,1
SEC ;讀出一位數(shù)據(jù)并-->C
ROR R18 ;組織數(shù)據(jù)
SBI PORTC,0 ;SCLK升高,為下位讀準備
DEC R16
BRNE RD1 ;8位數(shù)據(jù)都寫完?
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -