📄 vs1307.asm
字号:
NAME READBYT
PUBLIC WriteTim
PUBLIC ReadTim
SCL BIT P3.6
SDA BIT P3.7
DS1307W EQU 0D0H
DS1307R EQU 0D1H
VS1307 SEGMENT CODE
RSEG VS1307
;-------------------------------------------------------------------------
; THESE SUB SENDS THE START & STOP CONDITIONS
;-------------------------------------------------------------------------
SEND_START:
SETB SDA
LCALL SCL_HIGH ; SDA
CLR SDA
LCALL DELAY ; SCL ^START CONDITION
CLR SCL
RET
SEND_STOP:
CLR SDA ; SDA
LCALL SCL_HIGH ;
SETB SDA ; SCL ^STOP CONDITION
RET
;-------------------------------------------------------------------------
; THIS SUB SENDS ONE BYTE OF DATA TO THE DS1307
;-------------------------------------------------------------------------
SEND_BYTE:
PUSH B
MOV B,#08H ; SET COUNTER FOR 8 BITS
SB_LOOP:
RLC A ; CHECK TO SEE IF BIT 7 OF ACC IS A 1
MOV SDA,C
LCALL SCL_HIGH ; TRANSITION SCL LOW蠺O蠬IGH
CLR SCL ; TRANSITION SCL HIGH蠺O蠰OW
DJNZ B,SB_LOOP ; LOOP FOR 8 BITS
SETB SDA ; SET SDA HIGH TO LOOK FOR ACKNOWLEDGE PULSE
LCALL SCL_HIGH ; TRASITION SCL LOW TO HIGH
MOV C,SDA
LCALL DELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH O蠰OW
LCALL DELAY ; DELAY FOR AN OPERATION
POP B
RET
;-------------------------------------------------------------------------
; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307
;-------------------------------------------------------------------------
READ_BYTE:
PUSH B
MOV B,#08H ; SET COUNTER FOR 8 BITS OF DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE FREE
READ_BITS:
LCALL SCL_HIGH ; TRANSITION SCL LOW蠺O蠬IGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY BIT
RLC A ; ROTATE CARRY BIT INTO ACC.0
CLR SCL ; TRANSITION SCL HIGH蠺O蠰OW
DJNZ B,READ_BITS ; LOOP FOR 8 BITS
CLR SDA ; ACKNOWLEDGE BIT
LCALL SCL_HIGH ; PULSE SCL TO TRANSIMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
POP B
RET
READ_LAST:
PUSH B
MOV B,#08H ; SET COUNTER FOR 8 BITS OF DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE FREE
R8_BITS:
LCALL SCL_HIGH ; TRANSITION SCL LOW蠺O蠬IGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY BIT
RLC A ; ROTATE CARRY BIT INTO ACC.0
CLR SCL ; TRANSITION SCL HIGH蠺O蠰OW
DJNZ B,R8_BITS ; LOOP FOR 8 BITS
SETB SDA
LCALL SCL_HIGH ; PULSE SCL TO TRANSIMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
POP B
RET
;-------------------------------------------------------------------------
; THIS SUB SETS THE CLOCK LINE HIGH
;-------------------------------------------------------------------------
SCL_HIGH:
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
RET
;-------------------------------------------------------------------------
; DELAY & DELAY_4 to lower THE BUS
;-------------------------------------------------------------------------
DELAY: NOP ; DELAY FOR BUS TIMING
RET
DELAY_4:
NOP ; DELAY FOR BUS TIMING
NOP
NOP
NOP
RET
;-------------------------------------------------------------------------
; THIS SUB READS THE CLOCK AND WRITES IT TO THE SCRATCH PAD MEMORY ;
;-------------------------------------------------------------------------
ReadTim:
LCALL SEND_START ; SEND START CONDITION
MOV A,#DS1307W ; SET POINTER TO REG 00H ON DS1307
LCALL SEND_BYTE
MOV A,#00H
LCALL SEND_BYTE
LCALL SEND_STOP ; SEND STOP CONDITION
LCALL SEND_START ; SEND START CONDITION
MOV A,#DS1307R ; SEND READ COMMAND TO DS1307
LCALL SEND_BYTE
MOV R0,#20H
MOV B,#07h
READ0_6:
LCALL READ_BYTE ; READ A BYTE OF DATA
MOV @R0,A ; MOVE DATA IN SCRATCHPAD MEMORY
INC R0
DJNZ B,READ0_6
READ7:
LCALL READ_LAST
MOV @R0,A ; MOVE DATA IN SCRATCHPAD MEMORY
INC R0
;-------------------------------------------------------------------------
; THIS SUB SETS THE CLOCK (MANUAL)
;-------------------------------------------------------------------------
WriteTim:
MOV R0,#20H ; POINT TO BEGINNING OF CLOCK DATA IN SCRATCHPAD MEMORY
LCALL SEND_START ; SEND 2WIRE START CONDITION
MOV A,#DS1307W ; SEND DS1307 WRITE COMMAND
LCALL SEND_BYTE
MOV A,#00H ; SET DATA POINTER TO REGISTER 00H ON
LCALL SEND_BYTE ; THE DS1307
MOV B,#08h
SEND_LOOP:
MOV A,@R0 ; MOVE THE FIRST BYTE OF DATA TO ACC
LCALL SEND_BYTE ; SEND DATA ON 2WIRE BUT
INC R0
DJNZ B,SEND_LOOP ; LOOP UNTIL CLOCK DATA SENT TO DS1307
LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -