ds3231程序
;宏定義區;
N_NOP MACRO
nop
nop
nop
ENDM
TRAP MACRO
nop
nop
nop
sjmp $
ENDM
TRAP_RET MACRO
nop
nop
nop
ret
nop
nop
nop
sjmp $
ENDM
;====================================================
; function: start_sd ;時鐘啟動
; input: ---------
; output: ---------
; usage: ---------
;======================================================
start_sd: ;時鐘啟動
;clr bsda
;N_NOP
setb sda
N_NOP
setb scl
N_NOP
jb sda, ssd_on
setb bsda
ssd_on: clr sda
;N_NOP
;clr scl
N_NOP
ret
;======================================================
; function: stop_sd ;時鐘停止
; input: ---------
; output: ---------
; usage: ---------
;=======================================================
stop_sd: ;時鐘停止
clr sda
N_NOP
clr sda
N_NOP
setb scl
N_NOP
setb scl
N_NOP
setb sda
N_NOP
ret
;==================================================
; function: ack(應答) bsend------發送位
; input: ---------
; output: ---------
; usage: ---------
;=====================================================
ack: ;時鐘應答
clr sda
N_NOP
setb scl
N_NOP
clr scl
ret
;=====================================================
; function: nack ;發送非應答位
; input: ---------
; output: ---------
; usage: ---------
;========================================================
nack: ;非應答
setb sda
N_NOP
setb scl
N_NOP
clr scl
ret
;=========================================================
; function: check_ack ;應答位檢查
; input: ---------
; output: ---------
; usage: ---------
;========================================================
check_ack: ;檢查應答信號;
clr scl
N_NOP
setb sda
N_NOP
setb scl
N_NOP
mov r6, #255
cck_lp: jnb sda, cck_goon
djnz r6, cck_lp
cck_goon: clr scl
N_NOP
ret
;========================================================
; function: out_bit ;發送一位數給實時時鐘
; input: c
; output: ---------
; usage: c
;========================================================
out_bit: ;發送一位數給實時時鐘
;lcall dog_int_feed
clr scl
N_NOP
mov sda, c
N_NOP
setb scl
N_NOP
clr scl
N_NOP
TRAP_RET
;===============================================
; function: in_bit ;從實時時鐘接收一位數
; input: ---------
; output: c
; usage: c
;=========================================================
in_bit: ;從實時時鐘接收一位數
;lcall dog_int_feed
setb sda
N_NOP
setb scl
N_NOP
mov c, sda
clr scl
N_NOP
clr sda
N_NOP
TRAP_RET
;=====================================================
; function: sendh_l (高到低);發送一個字節給實時時鐘
; input: a-----發送數據
; output: ---------
; usage: a,c,r7
; r7----發送位數(8位)
;=================================================
send_H_L: ;發送一個字節給實時時鐘(高到低)
mov r7, #08h
send_loop: mov c, acc.7
lcall out_bit
rl a
djnz r7, send_loop
nop
nop
ret
;=======================================================
; function: receiveh_l(高到低) ;從總線接收一個字節
; input: ---------
; output: a---接收數據
; usage: a,r3,
;======================================================
receive_H_L: ;從總線接收一個字節(高到低)
mov r3, #08h
re_loop: lcall in_bit
rlc a
djnz r3, re_loop
ret
;=======================================================
; function: write_1_sd ;向I2C總線發送1個字節數據
; input: r0-----欲發送緩沖區地址
; r1-----器件地址
; output: ----------
; usage: a,r0,r1
;=========================================================
write_1_sd: ;向I2C總線發送1個字節數據
lcall start_sd
jb bsda, w1sd_end
mov a, #0d0h;#64h ;寫命令字
lcall send_H_L
lcall check_ack
mov a, r1 ;寫器件地址
;anl a, #0fh
;swap a
lcall send_H_L
lcall check_ack
mov a, @r0 ;寫發送的數據
lcall send_H_L
lcall check_ack
lcall ack ;應答
w1sd_end: lcall stop_sd
ret
;=========================================================
; function: read_1_sd ;從I2C總線接收1個字節數據
; input: ---------
; r0----器件地址
; r1----欲接收數據存放緩沖區地址
; output: year,month...(時間寄存器)
; usage: a,r1
;========================================================
read_1_sd: ;從I2C總線接收1個字節數據
lcall start_sd
jb bsda, r1sd_end
mov a, #0d0h;#64h ;寫命令字
lcall send_H_L
lcall check_ack
mov a, r0 ;寫器件地址
;anl a, #0fh
;swap a
lcall send_H_L
lcall check_ack
lcall start_sd
jb bsda, r1sd_end
mov a, #0d1h;#65h
lcall send_H_L
lcall check_ack
lcall receive_H_L ;讀數據放于時間寄存器
mov @r1, a
lcall nack
lcall stop_sd
ret
r1sd_end: lcall stop_sd
TRAP_RET
;================================================
; fuction: read_sd ;讀實時時鐘
; input: ------------
; output: year,month...(時間寄存器)
; usage: a,r0,r1
;=================================================
read_sd: ;讀實時時鐘
;--------------------------------------------------------
;function: read_1_sd ;從I2C總線接收1個字節數據
;input: ---------
; r0----器件地址
; r1----欲接收數據存放緩沖區地址
;output: year,month...(時間寄存器)時間寄存器)
;usage: a,r0,r1,r2---循環次數
;--------------------------------------------------------
mov r0, #0
mov r1, #second
mov r2, #3
rsd_lp: lcall read_1_sd
inc r1
inc r0
djnz r2, rsd_lp
ret
;=========================================================
; fuction: write_sd ;寫實時時鐘
; input: date_set
; output: ------------
; usage: a,r0,r1,r2
;============================================================
write_sd: ;寫實時時鐘
;--------------------------------------------------------
;function: write_1_sd ;向I2C總線發送1個字節數據
;input: r0-----欲發送緩沖區地址
; r1-----器件地址
;output: ----------
;usage: a,r0,r1,r2---循環次數
;--------------------------------------------------------
mov r0, #date_set
mov r1, #0
mov r2, #3
;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
jb brun, ws_ret
jb bstop, ws_ret
jb bset, ws_ret
jb bset1, ws_ret
jnb bset2, ws_ret
mov a, in_code
cjne a, #53, ws_ret
;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
wsd_lp: jnb bsaveT, ws_ret
lcall write_1_sd
inc r0
inc r1
djnz r2, wsd_lp
ws_ret: clr bsaveT
ret
;==========================================================
; fuction: time_int ;時鐘初始化程序
; input: ------------
; output: ------------
; usage: a,r0
;=======================================================
time_int: ;時鐘初始化程序
lcall start_sd
mov a, #0d0h;#64h
lcall send_H_L
lcall check_ack
mov a, #0f0h
lcall send_H_L
lcall check_ack
mov a, #20h
lcall send_H_L
lcall check_ack
lcall stop_sd
lcall start_sd
mov a, #0d0h;#64h
lcall send_H_L
lcall check_ack
mov a, #70h
lcall send_H_L
lcall check_ack
mov a, #00h
lcall send_H_L
lcall check_ack
lcall stop_sd
TRAP_RET
ds3231應用電路圖
評論
查看更多