;=====
;=====IN THIS EXAMPLE WE'LL ONLY READ THE DATA INSIDE THE DS1307
;=====TO WRITE THE DATA ONTO DS1307, ALL YOU NEED IS TO MOVE DATA
;=====INTO THE ALLOCATED MEMORY ADDRESSES BELOW, THEN CALLING ON
;=====THE WRITE_BYTE PROCEDURE.
;=====
;=====THE MOST IMPORTANT PROCEDURE IN THIS PROGRAM IS THE ""START""
;=====PROCEDURE, THERE IS WHERE YOU GET YOUR INFO AND LATER CAN USE IT
;=====WHEREVER YOU WANT!
;=====

$mod51
	ORG 0000H

;===================================================================================

	SCL			EQU    P2.0	;IN THIS EXAMPLE I USED PORT 2.0
	SDA			EQU    P2.1	;AND PORT 2.1 FOR THE I2C LINES
					;YOU CAN CHANGE THEM TO WHATEVER ACCEPTABLE

;===================================================================================
;=====THE READ AND WRITE COMMANDS (0D0H AND 0D1H)

	CONT_BYTE_W		EQU	11010000B
	CONT_BYTE_R		EQU	11010001B

;===================================================================================

	ORG    0060H

;===================================================================================
;=====ADD_LOW IS THE DPL, THIS IS THE ADDRESS INISDE THE DS1307
;=====DAVAVA IS THE VARIABLE TO STORE DATA WHEN IT GETS BACK FROM THE DS1307

	ADD_LOW			EQU	62H
	DAVAVA			EQU	63H

;===================================================================================
;=====VARIABLES TO STORE THE TIME IN, COULD BE USED ALSO TO STORE DATA TO WRITE ON DS1307

	SEC			EQU	64H
	MIN			EQU	65H
	HOUR			EQU	66H
	DAY			EQU	67H
	DATE			EQU	68H
	MONTH			EQU	69H
	YEAR			EQU	6AH
	RAND			EQU	6BH

	ORG    0100H

;==================================================================================
;=====THIS PROCEDURE INITIATES THE DS1307, WITHOUT IT THE DS1307 WON'T START!!!!!!

	BEGIN:
		CLR	SCL
		CLR	SDA
		NOP
		SETB	SCL
		SETB	SDA
		NOP
		MOV     ADD_LOW,#00H
		MOV     DAVAVA,#00H
		LCALL   WRITE_BYTE

;==================================================================================
;=====THIS IS THE MOST IMPORTANT PROCEDURE!!!! HERE YOU GET ALL THE DATA FROM THE DS1307

	Start:


		CALL INIT_PORT


	SJMP START	;LOOP, YOU CAN ADD A LONGER DELAY, THEN END IT TO LCD OR ANYTHING YOU WANT

;==================================================================================
;=====PAY ATTENTION, HERE IS WHERE YOU CHOOSE WHAT DATA YOU WANT, AND WHERE TO STORE IT!!

	INIT_PORT:
;==================================================READS SECONDS
			MOV     ADD_LOW,#00h
			LCALL   READ_BYTE
			MOV 	SEC,DAVAVA
			LCALL	I2C_STOP
;==================================================READS MINUTES
			MOV     ADD_LOW,#01h
			LCALL   READ_BYTE
			MOV 	MIN,DAVAVA
			LCALL	I2C_STOP
;==================================================READS HOURS
			MOV     ADD_LOW,#02h
			LCALL   READ_BYTE
			MOV 	HOUR,DAVAVA
			LCALL	I2C_STOP
;==================================================READS DAYS
			MOV     ADD_LOW,#03h
			LCALL   READ_BYTE
			MOV 	DAY,DAVAVA
			LCALL	I2C_STOP
;==================================================READS DATE OF WEEK
			MOV     ADD_LOW,#04h
			LCALL   READ_BYTE
			MOV 	DATE,DAVAVA
			LCALL	I2C_STOP
;==================================================READS MONTHS
			MOV     ADD_LOW,#05h
			LCALL   READ_BYTE
			MOV 	MONTH,DAVAVA
			LCALL	I2C_STOP
;==================================================READS YEARS
			MOV     ADD_LOW,#06H
			LCALL   READ_BYTE
			MOV 	YEAR,DAVAVA
			LCALL	I2C_STOP
;=====
	RET

;==================================================================================
;=====stop I2C communication

I2C_Stop:
	CLR       SDA
	SETB      SCL
	NOP
	SETB      SDA
	RET

;==================================================================================
;=====ANYTHING BELOW IS JUST PROCEDURES TO GET THE DATA, JUST COPY AND PASTE FROM
;=====HERE DOWN, IT'S EXPLAINED AS WELL, IF YOU INSIST. CHANGE THE PROCEDURE NAMES IF
;=====ANY CONFLICT HAPPENS WHEN YOU WRITE A LONGER PROGRAM
;=====
;*****************************************************
;*            WRITE DAVAVA TO DS1307 1 BYTE	*
;*	INPUT 	: ADD_LOW		*
;*		: DAVAVA			*
;*****************************************************
WRITE_BYTE:            CLR     SDA                   ;start bit
                       CLR     SCL
                       MOV     A,#CONT_BYTE_W        ;send control byte
                       LCALL   LOOP_BYTE
                       SETB    SDA
                       SETB    SCL
                       JB      SDA,WRITE_BYTE        ;loop until busy
                       CLR     SCL
                       MOV     A,ADD_LOW             ;send address low
                       LCALL   LOOP_BYTE
                       SETB    SDA
                       SETB    SCL
                       JB      SDA,WRITE_BYTE        ;loop until busy
                       CLR     SCL
                       MOV     A,DAVAVA                ;send DAVAVA
                       LCALL   LOOP_BYTE
                       SETB    SDA
                       SETB    SCL
                       JB      SDA,WRITE_BYTE        ;loop until busy
                       CLR     SDA
                       CLR     SCL
                       SETB    SCL                   ;stop bit
                       SETB    SDA
                       RET

;******************************************************
;*            READ DAVAVA FROM DS1307 1 BYTE	*
;* INPUT  : ADD_HIGH			*
;*        : ADD_LOW				*
;* OUTPUT : DAVAVA			*
;******************************************************
READ_BYTE:             CLR     SDA                   ;start bit
                       CLR     SCL
                       MOV     A,#CONT_BYTE_W        ;send control byte
                       LCALL   LOOP_BYTE
                       SETB    SDA
                       SETB    SCL
                       JB      SDA,READ_BYTE         ;loop until busy
                       CLR     SCL
                       MOV     A,ADD_LOW             ;send address low
                       LCALL   LOOP_BYTE
                       SETB    SDA
                       SETB    SCL
                       JB      SDA,READ_BYTE         ;loop until busy
                       CLR     SCL

                       SETB    SCL
                       SETB    SDA
                       CLR     SDA                   ;start bit
                       CLR     SCL
                       MOV     A,#CONT_BYTE_R        ;send control byte
                       LCALL   LOOP_BYTE
                       SETB    SDA
                       SETB    SCL
                       JB      SDA,READ_BYTE         ;loop until busy
                       CLR     SCL
                       LCALL   LOOP_READ
                       SETB    SDA
                       SETB    SCL
                       CLR     SCL

                       SETB    SCL                   ;stop bit
                       SETB    SDA
                       RET

;****************************************************
;*                      WRITE                       *
;* INPUT: ACC                                       *
;****************************************************
LOOP_BYTE:             PUSH    02H
                       MOV     R2,#08H
LOOP_SEND:             RLC     A
                       MOV     SDA,C
                       SETB    SCL
                       CLR     SCL
                       DJNZ    R2,LOOP_SEND
                       POP     02H
                       RET

;*****************************************************
;*                       READ                        *
;* OUTPUT: ACC                                       *
;*****************************************************
LOOP_READ:             PUSH   02H
                       MOV    R2,#08H
LOOP_READ1:            SETB   SCL
                       MOV    C,SDA
                       CLR    SCL
                       RLC    A
                       DJNZ   R2,LOOP_READ1
                       MOV    DAVAVA,A
                       POP    02H
                       RET

;*****************************************************
;*                       DELAYS                      *
;*		                                     *
;*****************************************************
DELAY4M:               PUSH   DPH
                       PUSH   DPL
                       MOV    DPTR,#0000H
DEL4:                  INC    DPTR
                       MOV    A,DPL
                       ORL    A,DPH
                       JNZ    DEL4
                       POP    DPL
                       POP    DPH
                       RET

END
