Hola todos,
Tengo problema de hacer la comunicacion entre ADuC831 y DS1307 usando I2C.
Encontre un fuente ejemplo, lo reubique para mis necesidades, pero no escriba en el RTC, se leen solo zeros.
Estoy usando Aspire - Version 1.5  IDE software ( write, edit, debug, compile ) en entorno
MetaLink 8051 Cross-Assembler.
Aca les doy codigo fuente, me gustaria si me digan donde estoy cometiendo el error.
Les agradezco de antemano su colaboracion.
..........................................
; Program DS1307.ASM
;
; This program responds to commands received over the serial
; port to set the date/time as well as RAM data on the DS1307
; using a ADuC831 as a controller
;
$MOD831                         ;use ADuC831 predefined symbols
;
; definitions
CR              EQU     0DH
LF              EQU     0AH
; MCON            EQU     0C6H ; mahnati za proba
; TA              EQU     0C7H ; mahnati za proba
; TRIG            BIT     P0.2 ; mahnati za proba
DS1307W         EQU     0D0H
DS1307R         EQU     0D1H
FLAGS           DATA    20H
LASTREAD        BIT     FLAGS.0
_12_24          BIT     FLAGS.1
PM_AM           BIT     FLAGS.2
OSC             BIT     FLAGS.3
SQW             BIT     FLAGS.4
ACK             BIT     FLAGS.5
BUS_FAULT       BIT     FLAGS.6
_2W_BUSY        BIT     FLAGS.7
BITCOUNT        DATA    21H
BYTECOUNT       DATA    22H
BYTE            DATA    23H
;____________________________________________________________________
                                ; DEFINE VARIABLES IN INTERNAL RAM
BITCNT          DATA    30h     ; bit counter for I2C routines / 110000 /
SLAVEADD        DATA    31h     ; slave address for I2C routines / 110001 /
INPUT           DATA    32h     ; data recieved from the slave / 110010 /
OUTPUT          DATA    33h     ; data to be transmitted to slave / 110011 /
NOACK           BIT     00h     ; I2C no acknowledge flag
ERR             BIT     00h     ; I2C error flag
;
;____________________________________________________________________
                                                  ; BEGINNING OF CODE
CSEG
ORG 0000h
AJMP START
;
;____________________________________________________________________
                                                           ; INT0 ISR
ORG 0003h
        INC     OUTPUT
        RETI
;
CSEG AT 30H
;*************************************************************
;*** RESET GOES HERE TO START PROGRAM                     ****
;*************************************************************
ORG 0060h
START:
                                ; configure the UART ADuC831
   MOV     SCON,#52h           ; configure UERT for 9600 baud 
    MOV     TMOD,#20h           ; assumihg 11.0592 MHz crystal 
    MOV     TH1,#-3             ;
    SETB    TR1
                                ; configure & enable interrupts
        SETB    EX0             ; enable INT0
        SETB    IT0             ; INT0 edge triggered
        SETB    EA              ; allow all the interrupts
                                ; initialise settings
        MOV     SLAVEADD,#88H   ; clear RW bit / 10001000 /
        MOV     I2CCON,#0A8h    ; sets SDATA & SCLOCK, and / 10101000 /
                                ; selects master mode
        MOV     OUTPUT,#0       ; TX 0 as default
        CLR     NOACK
        CLR     ERR
;-----------------------------------------------------------------------
; THIS IS THE MASTER CONTROLLER LOOP
;-----------------------------------------------------------------------
MASTER_CONTROLLER:
MOV BYTECOUNT,#10H      
FORM_FEED: MOV A,#LF            ; CLEAR SCREEN FOR MAIN MENU
LCALL WRITE_DATA
DJNZ BYTECOUNT,FORM_FEED
MOV DPTR, #TEXT0                ; PUT MAIN MENU ON SCREEN
LCALL WRITE_TEXT
MOV DPTR,#TEXT3
LCALL WRITE_TEXT
LCALL READ_DATA
CLR ACC.5                       ; CONVERT ACC TO UPPER CASE
CJNE A,#'A',NOTA                
LCALL SET_CLOCKM                ; CALL SET CLOCK FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTA:   CJNE A,#'B',NOTB 
LCALL SET_RAM                   ; CALL SET RAM FUNCTION AND
LCALL READ_RAM                  ; CALL READ RAM FUNCTION 
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTB:   CJNE A,#'C',NOTC 
LCALL READ_CLOCK                ; CALL READ CLOCK FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTC:   CJNE A,#'D',NOTD
LCALL READ_RAM                  ; CALL READ RAM FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTD:   CJNE A,#'E',NOTE 
CLR OSC                         ; CLR OSC FLAG - ON
LCALL OSC_CONTROL               ; CALL OSC CONTROL FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTE:   CJNE A,#'F',NOTF
SETB OSC                        ; SET OSC FLAG - OFF
LCALL OSC_CONTROL               ; CALL OSC CONTROL FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTF:   CJNE A,#'G',NOTG
CLR SQW                         ; CLR SQW FLAG - ON
LCALL SQW_CONTROL_1HZ           ; CALL SWQ CONTROL FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTG:   CJNE A,#'H',NOTH
CLR SQW                         ; CLR SQW FLAG - ON
LCALL SQW_CONTROL_4KHZ          ; CALL SWQ CONTROL FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTH:   CJNE A,#'I',NOTI
CLR SQW                         ; CLR SQW FLAG - ON
LCALL SQW_CONTROL_8KHZ          ; CALL SWQ CONTROL FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTI:   CJNE A,#'J',NOTJ
CLR SQW                         ; CLR SQW FLAG - ON
LCALL SQW_CONTROL_32KHZ         ; CALL SWQ CONTROL FUNCTION
JMP MASTER_CONTROLLER           ; RETURN TO MAIN MENU
NOTJ:   CJNE A,#'K',NOTK
SETB SQW                        ; SET SQW FLAG - OFF
LCALL SQW_CONTROL_1HZ           ; CALL SWQ CONTROL FUNCTION
JMP MASTER_CONTROLLER
NOTK: CJNE A,#'L',NOTL
LCALL SET_RAM_UNQ
LCALL READ_RAM
NOTL:   JMP MASTER_CONTROLLER   ; RETURN TO MAIN MENU
;-----------------------------------------------------------------------
; THIS SUB SENDS THE START CONDITION
;-----------------------------------------------------------------------
SEND_START:                     ; Sends the start bit to initiate an I2C 
                                ; communication
SETB    MDE                     ; enable SDATA pin as an output
        CLR     NOACK
        CLR     MDO             ; low O/P on SDATA
        CLR     MCO             ; start bit
        RET
;
;-----------------------------------------------------------------------
; THIS SUB SENDS THE STOP CONDITION
;-----------------------------------------------------------------------
SEND_STOP:                      ; Sends the stop bit to end an I2C 
                                ; transmission
SETB    MDE                     ; to enable SDATA pin as an output
        CLR     MDO             ; get SDATA ready for stop
        SETB    MCO             ; set clock for stop
        SETB    MDO             ; this is the stop bit
        RET
;
;-----------------------------------------------------------------------
; THIS SUB SENDS ONE BYTE OF DATA TO THE DS1307
;-----------------------------------------------------------------------
SEND_BYTE:                      ; Send 8-bits in ACC to the slave
MOV     BITCNT,#8               ; 8 bits in a byte
        SETB    MDE             ; to enable SDATA pin as an output
        CLR     MCO             ; make sure that the clock line is low        
SENDBIT:
        RLC     A               ; put data bit to be sent into carry
        MOV     MDO,C           ; put data bit on SDATA line
        SETB    MCO             ; clock to send bit
        CLR     MCO             ; clear clock
        DJNZ    BITCNT,SENDBIT  ; jump back and send all eight bits
        CLR     MDE             ; release data line for acknowledge
        SETB    MCO             ; send clock for acknowledge
        JNB     MDI,NEXT        ; this is a check for acknowledge
        SETB    NOACK           ; no acknowledge, set flag        
NEXT:   CLR     MCO             ; clear clock
        RET
;
;-----------------------------------------------------------------------
; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307
;-----------------------------------------------------------------------
READ_BYTE:                      ; receives one byte of data from an I2C 
                                ; slave device. Returns it in A
MOV     BITCNT,#8               ; Set bit count.
        CLR     MDE             ; to enable SDATA pin as an input
        CLR     MCO             ; make sure the clock line is low        
RCVBIT:
        SETB    MCO             ; clock to recieve bit
        CLR     MCO             ; clear clock
        MOV     C,MDI           ; read data bit into carry.
        RLC     A               ; Rotate bit into result byte.
        DJNZ    BITCNT,RCVBIT   ; Repeat until all bits received.
                                ; recieved byte is in the accumulator
        SETB    MDE             ; Data pin =Output for NACK
        SETB    MDO             ; Send NACK (always send NACK for
                                ; last byte in transmission)
        SETB    MCO             ; Send NACK clock.
        CLR     MCO
        RET
;
;----------------------------------------------------------------------- ;
; THIS SUB SETS THE CLOCK LINE HIGH / izkliuchena sub za rezultat /
;-----------------------------------------------------------------------
;SCL_HIGH:
;SETB SCL                       ; SET SCL HIGH
;JNB SCL,$                      ; LOOP UNTIL STRONG 1 ON SCL
;RET
;----------------------------------------------------------------------- ;
; THIS SUB DELAY THE BUS
;-----------------------------------------------------------------------
                                                              ; DELAY
; DELAY ROUTINE FOR THE ADuC812/ADuC816/ADuC824
DELAY:                          ; Delays by 100ms * A
; ADuC812 100ms based on 11.0592MHz Core Clock
; ADuC824 100ms based on 1.573MHz Core Clock
       MOV     R2,A             ; Acc holds delay variable       
DLY0:  MOV     R3,#200          ; Set up delay loop0
DLY1:  MOV     R4,#229          ; Set up delay loop1
       DJNZ   R4,$              ; Dec R4 & Jump here until R4 is 0
                                ; wait here for 131*15.3us=2ms
       DJNZ   R3,DLY1           ; Dec R3 & Jump DLY1 until R3 is 0
                                ; Wait for 50*2ms
       DJNZ   R2,DLY0           ; Dec R2 & Jump DLY0 until R2 is 0
                                ; wait for ACC*100ms
       RET                      ; Return from subroutine
;
;-----------------------------------------------------------------------
; THIS SUB DELAYS 4 CYCLES
;-----------------------------------------------------------------------
DELAY_4:
NOP                             ; DELAY FOR BUS TIMING
NOP
NOP
NOP
RET
;-----------------------------------------------------------------------
; THIS SUB SETS THE CLOCK (MANUAL)
;-----------------------------------------------------------------------
SET_CLOCKM:
MOV R1,#2EH                     ; SET R1 TO SCRATCHPAD MEMORY FOR DATE/TIME
MOV DPTR, #GODINA               ; GET THE DATE/TIME INFORMATION FROM THE
LCALL WRITE_TEXT                ; USER. WRITE THE DATE/TIME TO SCRATCHPAD
LCALL READ_BCD                  ; MEMORY
MOV @R1,A
DEC R1
MOV DPTR, #MESEC
LCALL WRITE_TEXT
LCALL READ_BCD
MOV @R1,A
DEC R1
MOV DPTR, #DATATA
LCALL WRITE_TEXT
LCALL READ_BCD
MOV @R1,A
DEC R1
MOV DPTR, #DEN
LCALL WRITE_TEXT
LCALL READ_BCD
ANL A, #7
MOV @R1,A
DEC R1
MOV DPTR, #CHAS
LCALL WRITE_TEXT
LCALL READ_BCD
MOV @R1,A
DEC R1
MOV DPTR, #MINUTI
LCALL WRITE_TEXT
LCALL READ_BCD
MOV @R1,A
DEC R1
MOV DPTR, #SEKUNDI
LCALL WRITE_TEXT
LCALL READ_BCD
MOV @R1,A
MOV R1,#28H                      ; 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
SEND_LOOP:
MOV A,@R1                        ; MOVE THE FIRST BYTE OF DATA TO ACC
LCALL SEND_BYTE                  ; SEND DATA ON 2WIRE BUT
INC R1
CJNE R1,#2FH,SEND_LOOP           ; LOOP UNTIL CLOCK DATA SENT TO DS1307
LCALL SEND_STOP                  ; SEND 2WIRE STOP CONDITION
RET
;-----------------------------------------------------------------------
; THIS SUB SETS THE DS1307 USER RAM TO THE VALUE IN 'BYTE'
;-----------------------------------------------------------------------
SET_RAM:
MOV R1,#08H                      ; POINTER TO BEGINNING OF DS1307 USER RAM
MOV DPTR, #TEXT5                 ; MESSAGE TO ENTER DATA BYTE
LCALL WRITE_TEXT                 ;
LCALL READ_BCD                   ; READ BYTE FROM KEYBOARD
MOV BYTE,A                       ; AND STORE IN 'BYTE'
LCALL SEND_START                 ; SEND 2WIRE START CONDITION
MOV A,#DS1307W                   ; LOAD DS1307 WRITE COMMAND
LCALL SEND_BYTE                  ; SEND WRITE COMMAND
MOV A,#08H                       ; SET DS1307 DATA POINTER TO BEGINNING
LCALL SEND_BYTE                  ; OF USER RAM - 08H
SEND_LOOP2:
MOV A,BYTE                       ; WRITE BYTE TO ENTIRE RAM SPACE
LCALL SEND_BYTE                  ; WHICH IS 08H TO 37H
INC R1
CJNE R1,#040H,SEND_LOOP2         ; LOOP UNTIL RAM FILLED
LCALL SEND_STOP                  ; SEND 2WIRE STOP CONTION
RET
;-----------------------------------------------------------------------
; THIS SUB SETS THE DS1307 USER RAM TO THE UNIQUE PATTERN
;-----------------------------------------------------------------------
SET_RAM_UNQ:
MOV R1,#08H                      ; POINTER TO BEGINNING OF DS1307 USER RAM
LCALL SEND_START                 ; SEND 2WIRE START CONDITION
MOV A,#DS1307W                   ; LOAD DS1307 WRITE COMMAND
LCALL SEND_BYTE                  ; SEND WRITE COMMAND
MOV A,#08H                       ; SET DS1307 DATA POINTER TO BEGINNING
LCALL SEND_BYTE                  ; OF USER RAM - 08H
SEND_LOOP3:
LCALL SEND_BYTE                  ; WHICH IS 08H TO 37H
INC R1
INC A
CJNE R1,#040H,SEND_LOOP3         ; LOOP UNTIL RAM FILLED
LCALL SEND_STOP                  ; SEND 2WIRE STOP CONTION
RET
;-----------------------------------------------------------------------
; THIS SUB READS THE DS1307 RAM AND WRITES IT TO THE SCRATCH PAD MEMORY
;-----------------------------------------------------------------------
READ_RAM:
MOV DPTR,#TEXT4                  ; SEND KEY PRESS MSG
LCALL WRITE_TEXT
MOV R1,#30H                      ; START OF RAM REGS IN SCRATCH PAD
MOV BYTECOUNT,#00H               ; COUNTER FOR 56 RAM BYTES
CLR LASTREAD                     ; FLAG TO CHECK FOR LAST READ
LCALL SEND_START                 ; SEND 2WIRE START CONDITION
MOV A,#DS1307W                   ; SEND DS1307 WRITE COMMAND
LCALL SEND_BYTE
MOV A,#08H                       ; SET POINTER TO REG 08H ON
                                 ; DS1307
LCALL SEND_BYTE
LCALL SEND_STOP                  ; SEND STOP CONDITION
LCALL SEND_START                 ; SEND START CONDITION
MOV A,#DS1307R                   ; SEND DS1307 READ COMMAND
LCALL SEND_BYTE
READ_LOOP2:
MOV A,BYTECOUNT                  ; CHECK TO SEE OF DOING LAST READ
CJNE A,#37H,NOT_LAST2  
SETB LASTREAD                    ; IF LAST READ SET LASTREAD FLAG
NOT_LAST2:
LCALL READ_BYTE                  ; READ A BYTE OF DATA
MOV @R1,A                        ; MOVE DATA INTO SCRATCHPAD MEMORY
INC R1                           ; INC POINTERS
INC BYTECOUNT
MOV A,BYTECOUNT
CJNE A,#38H,READ_LOOP2           ; LOOP FOR ENTIRE DS1307 RAM
LCALL SEND_STOP                  ; SEND 2WIRE STOP CONDITION
LCALL DISP_RAM                   ; DISPLAY DATA IN SCRATCHPAD MEMORY
JNB RI,$                         ; WAIT UNTIL A KEY IS PRESSED
CLR RI
RET
;-----------------------------------------------------------------------
; THIS SUB DISPLAYS THE RAM DATA SAVED IN SCRATCHPAD MEMORY
;-----------------------------------------------------------------------
DISP_RAM:
MOV R1,#30H                      ; START OF RAM IN SCRATCHPAD
                                 ; MEMORY
MOV BITCOUNT,#00H
MOV DPTR,#TEXT6                  ;DISPLAY TABLE HEADING
LCALL WRITE_TEXT
DISP_ADDR:
LCALL DISP_LOC                   ; DISPLAY VALUE OF CURRENT RAM LOCATION
DIS_LOOP:
MOV A,@R1                        ; DISPLAY RAM DATA SAVED IN SCRATCHPAD
LCALL WRITE_BCD                  ; CONVERT TO BCD FORMAT AND DISPLAY
INC R1
INC BITCOUNT
MOV A,#20H                       ; SPACE BETWEEN DATA BYTES
LCALL WRITE_DATA
MOV A,BITCOUNT
CJNE A,#08H,DIS_LOOP             ; LINE FEED AFTER 8 BYTES OF DATA
MOV BITCOUNT,#00H 
MOV DPTR,#TEXT3                  ; 'CR,LF'
LCALL WRITE_TEXT
CJNE R1,#68H,DISP_ADDR           ; DISPLAY DATA FOR 56 BYTES OF RAM
RET
;----------------------------------------------------------------------- ;
; THIS SUB WRITES THE RAM LOCATION OF THE DATA
;-----------------------------------------------------------------------
DISP_LOC:
MOV A,R1                         ; DISPLAY THE HEX VALUE FOR THE DATA
ADD A,#-28H                      ; IN THE DS1307 RAM SPACE 
LCALL WRITE_BCD                  ; CONVERTS SCRATCHPAD ADDRESS
MOV A,#20H                       ; INTO DS1307 RAM ADDRESS
LCALL WRITE_DATA
MOV A,#20H 
LCALL WRITE_DATA
MOV A,#20H 
LCALL WRITE_DATA
RET
;-----------------------------------------------------------------------
; THIS SUB READS THE CLOCK AND WRITES IT TO THE SCRATCH PAD MEMORY 
;-----------------------------------------------------------------------
READ_CLOCK:
MOV DPTR,#TEXT4                  ; KEY PRESS MSG
LCALL WRITE_TEXT
READ_AGAIN:
MOV R1,#28H                      ; START OF CLOCK REG IN SCRATCHPAD 
MOV BYTECOUNT,#00H               ; COUNTER UP TO 8 BYTES FOR CLOCK 
CLR LASTREAD                     ; FLAG TO CHECK FOR LAST READ
; 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
READ_LOOP:
MOV A,BYTECOUNT                  ; CHECK TO SEE OF DOING LAST READ
CJNE A,#07H,NOT_LAST 
SETB LASTREAD                    ; SET LASTREAD FLAG
NOT_LAST:
LCALL READ_BYTE                  ; READ A BYTE OF DATA
MOV @R1,A                        ; MOVE DATA IN SCRATCHPAD MEMORY
MOV A,BYTECOUNT                  ; CHECK TO SEE IF READING SECONDS REG
CJNE A,#00H,NOT_FIRST 
CLR OSC                          ; CLR OSC FLAG
MOV A,@R1                        ; MOVE SECONDS REG INTO ACC
JNB ACC.7,NO_OSC                 ; JUMP IF BIT 7 OF IS A 0
SETB OSC                         ; SET OSC FLAG, BIT 7 IS A 1
CLR ACC.7                        ; CLEAR BIT 7 FOR DISPLAY
                                 ; PURPOSES
MOV @R1,A                        ; MOVE DATA BACK TO SCRATCHPAD
NO_OSC:
NOT_FIRST:
INC R1                           ; INC COUNTERS
INC BYTECOUNT
MOV A,BYTECOUNT
CJNE A,#08H,READ_LOOP            ; LOOP FOR ENTIRE CLOCK REGISTERS 
LCALL SEND_STOP                  ; SEND 2WIRE STOP CONDITION
LCALL DISP_CLOCK                 ; DISPLAY DATE/TIME FROM SCRATCHPAD
JNB RI,READ_AGAIN                ; READ AND DISPLAY UNTIL A KEY IS PRESSED
CLR RI
RET
;-----------------------------------------------------------------------
; THIS SUB DISPLAYS THE DATE AND TIME SAVED IN SCRATCHPAD MEMORY
;-----------------------------------------------------------------------
DISP_CLOCK:
MOV DPTR,#TEXT1                  ; DATE:
LCALL WRITE_TEXT
MOV R1,#2DH                      ; MONTH 
MOV A,@R1
LCALL WRITE_BCD
MOV A,#'/'
LCALL WRITE_DATA
MOV R1,#2CH                      ; DATE 
MOV A,@R1
LCALL WRITE_BCD
MOV A,#'/'
LCALL WRITE_DATA
MOV R1,#2EH                      ; YEAR 
MOV A,@R1
LCALL WRITE_BCD
MOV A,#09H                       ; TAB 
LCALL WRITE_DATA
MOV DPTR,#TEXT2                  ; TIME:
LCALL WRITE_TEXT
MOV R1,#2AH                      ; HOURS 
MOV A,@R1
LCALL WRITE_BCD
MOV A,#3AH                       ; COLON 
LCALL WRITE_DATA
MOV R1,#29H                      ; MINUTES 
MOV A,@R1
LCALL WRITE_BCD
MOV A,#3AH                       ; COLON 
LCALL WRITE_DATA
MOV R1,#28H                      ; SECONDS
MOV A,@R1
LCALL WRITE_BCD
RET
;-----------------------------------------------------------------------
; THIS SUB SETS THE OSCILLATOR ACCORDING TO THE OSC BIT
;-----------------------------------------------------------------------
OSC_CONTROL:
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
SETB LASTREAD                    ; SET LAST READ FOR SINGLE READ
LCALL SEND_STOP                  ; SEND STOP CONDITION
LCALL SEND_START                 ; SEND START CONDITION
MOV A,#DS1307R                   ; SEND READ COMMAND TO DS1307
LCALL SEND_BYTE
LCALL READ_BYTE                  ; READ SECONDS REGISTER
CLR ACC.7                        ; TURN OSC ON
JNB OSC,OSC_SET
SETB ACC.7                       ; TURN OSC OFF IF OSC BIT IS SET IN
OSC_SET:                         ; SECONDS REGISTER
PUSH ACC                         ; SAVE SECONDS DATA ON STACK
LCALL SEND_STOP                  ; SEND STOP CONDITION
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
POP ACC                          ; SEND SECONDS REGISTER TO CONTROL
LCALL SEND_BYTE                  ; OSCILLATOR ON DS1307
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------
; THIS SUB CONTROLS THE SQW OUTPUT 1HZ
;-----------------------------------------------------------------------
SQW_CONTROL_1HZ:
LCALL SEND_START                 ; SEND START CONDITION
MOV A,#DS1307W                   ; SET POINTER TO REG 07H ON DS1307
LCALL SEND_BYTE
MOV A,#07H 
LCALL SEND_BYTE
MOV A,#90H                       ; SQW/OUT ON AT 1HZ 
JNB SQW,SQW_SET                  ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H                       ; TURN SQW/OUT OFF - OFF HIGH
SQW_SET:
LCALL SEND_BYTE
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------
; THIS SUB CONTROLS THE SQW OUTPUT 4KHZ
;-----------------------------------------------------------------------
SQW_CONTROL_4KHZ:
LCALL SEND_START                 ; SEND START CONDITION
MOV A,#DS1307W                   ; SET POINTER TO REG 07H ON DS1307
LCALL SEND_BYTE
MOV A,#07H 
LCALL SEND_BYTE
MOV A,#91H                       ; SQW/OUT ON AT 1HZ 
JNB SQW,SQW_SET1                 ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H                       ; TURN SQW/OUT OFF - OFF HIGH 
SQW_SET1:
LCALL SEND_BYTE
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------
; THIS SUB CONTROLS THE SQW OUTPUT 8KHZ
;-----------------------------------------------------------------------
SQW_CONTROL_8KHZ:
LCALL SEND_START                 ; SEND START CONDITION
MOV A,#DS1307W                   ; SET POINTER TO REG 07H ON DS1307
LCALL SEND_BYTE
MOV A,#07H 
LCALL SEND_BYTE
MOV A,#92H                       ; SQW/OUT ON AT 1HZ 
JNB SQW,SQW_SET2                 ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H                       ; TURN SQW/OUT OFF - OFF HIGH 
SQW_SET2:
LCALL SEND_BYTE
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------
; THIS SUB CONTROLS THE SQW OUTPUT 32KHZ
;-----------------------------------------------------------------------
SQW_CONTROL_32KHZ:
LCALL SEND_START                 ; SEND START CONDITION
MOV A,#DS1307W                   ; SET POINTER TO REG 07H ON DS1307
LCALL SEND_BYTE
MOV A,#07H 
LCALL SEND_BYTE
MOV A,#93H                       ; SQW/OUT ON AT 1HZ 
JNB SQW,SQW_SET3                 ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H                       ; TURN SQW/OUT OFF - OFF HIGH 
SQW_SET3:
LCALL SEND_BYTE
LCALL SEND_STOP
RET
;-----------------------------------------------------------------------
; THIS SUB IS A SCOPE TRIGGER BIT - izkliucheno za proba
;-----------------------------------------------------------------------
; TRIGGER:
; CLR TRIG
; SETB TRIG
; LCALL DELAY_4
; CLR TRIG
; RET
;-----------------------------------------------------------------------
; THIS SUB READS DATA FROM THE SCREEN AND CONVERTS IT TO BCD FORM
; DATA SHOULD BE HEX DIGITS: 1,2,3...9,A,B,C,D,E,F
;-----------------------------------------------------------------------
READ_BCD:
MOV R0,#0                        ; CLEAR R0
BCD_LOOP:
LCALL READ_DATA                  ; READ BYTE FROM KEYBOARD
CJNE A, #0DH, BCD                ; CHECK FOR CR 
MOV A,R0                         ; MOVE R0 TO ACC AND RETURN
RET
BCD:
ADD A,#-30H                      ; BEGIN TO CONVERT TO ACTUAL VALUE 
JNB ACC.4,DIGIT                  ; JUMP IF NOT A-F
ADD A,#-07H                      ; IF A-F SUBTRACT 7 
DIGIT:
ANL A,#0FH                       ; ENSURE BITS 4-7 ARE CLEARED 
ANL 0,#0FH                       ; ENSURE BITS 4-7 ARE CLEARED 
XCH A,R0                         ; EXCHANGE R0 AND ACC
SWAP A                           ; NIBBLE SWAP ACC
ORL A,R0                         ; INSERT BITS 0-3 OF R0 INTO ACC
MOV R0,A                         ; MOVE ACC INTO R0
SJMP BCD_LOOP                    ; LOOP UNTIL CR ENCOUNTERED
;-----------------------------------------------------------------------
; THIS SUB WRITES THE BYTE TO THE SCREEN
;-----------------------------------------------------------------------
WRITE_BCD:
PUSH ACC                         ; SAVE ACC ON STACK
SWAP A                           ; NIBBLE SWAP ACC
ANL A,#0FH                       ; CLEAR BITS 4-7 OF ACC 
ADD A,#07H                       ; ADD 7 TO ACC TO CONVERT TO ASCII HEX 
JNB ACC.4,LESSNINE               ; CHECK TO SEE IF LESS THAN NINE 0-8
CJNE A,#10H,NOTNINE              ; JUMP IS GREATER THAN NINE A-F 
LESSNINE:
ADD A,#-07H                      ; SUBTRACT 7 FOR 0-9 
NOTNINE:
ADD A,#30H                       ; ADD 30 TO CONVERT TO ASCII EQUIVALENT
LCALL WRITE_DATA                 ; WRITE BYTE TO SCREEN
POP ACC                          ; RECALL ACC FROM STACK
ANL A,#0FH                       ; PERFORM CONVERSION ON OTHER HALF OF BYTE 
ADD A,#07H 
JNB ACC.4,NINE2
CJNE A,#10H,NOTNINE2 
NINE2:
ADD A,#-07H 
NOTNINE2:
ADD A,#30H 
LCALL WRITE_DATA
RET
;-----------------------------------------------------------------------
READ_DATA:
JNB RI,READ_DATA                 ; LOOP WHILE RI BIT IS LOW
CLR RI                           ;    
MOV A,SBUF                       ; GET DATA BYTE FROM SERIAL BUFFER
RET
;-----------------------------------------------------------------------
WRITE_DATA:
JNB TI,WRITE_DATA                ; LOOP WHILE TI BIT IS LOW
CLR TI                           ;
MOV SBUF,A                       ; SEND DATA BYTE TO SERIAL
; BUFFER
RET
;-----------------------------------------------------------------------
WRITE_TEXT:
PUSH ACC                         ; SAVE ACC BYTE ON STACK
WT1:
CLR A                            ; CLEAR ACC
MOVC A,@A+DPTR                   ; MOVE FIRST BYTE OF STRING
                                 ; TO ACC
INC DPTR                         ; INC DATA POINTER
CJNE A,#0,WT2                    ; CHECK FOR STRING
                                 ; TERMINATOR - 0
POP ACC                            ; RESTORE ACC
RET                               ; RETURN WHEN STRING IS SENT
WT2:
LCALL WRITE_DATA ; SEND BYTE OF STRING OVER SERIAL PORT
SJMP WT1
;-----------------------------------------------------------------------
; TEXT STRINGS USED FOR USER INTERFACE OVER SERIAL PORT
;-----------------------------------------------------------------------
GODINA:
DB CR,LF,'GODINA (0 - 99) : ',0
MESEC:
DB CR,LF,'MESEC (1 - 12) : ',0
DATATA:
DB CR,LF,'DATA OT MESECA : ',0
DEN:
DB CR,LF,'DEN OT SEDMICATA : ',0
CHAS:
DB CR,LF,'CHAS (0 - 24) : ',0
MINUTI:
DB CR,LF,'MINUTI (0 - 59) : ',0
SEKUNDI:
DB CR,LF,'SEKUNDI (0 - 59) : ',0
TRIER:
DB CR,LF,'NATISNI NIAKOI BUTON ZA DA ZAPISHESH TEZI DANNI ',CR,LF,0
TEXT0:
DB CR,LF,'******** DALLAS SEMICONDUCTOR ********* '
DB CR,LF,'******** DS1307 TEST PROGRAMM ********* ',CR,LF
DB CR,LF,'*MOLIA IZBERETE OPCIA ZA DA PRODALZITE* '
DB CR,LF,'--------------------------------------- '
DB CR,LF,'A. SET TIME(MANUAL) B. SET RAM '
DB CR,LF,'C. READ DATE/TIME D. READ RAM '
DB CR,LF,'E. OSC ON F. OSC OFF '
DB CR,LF
DB CR,LF,'G. SQW/OUT ON-1HZ H. SQW/OUT ON-4KHZ'
DB CR,LF,'I. SQW/OUT ON-8KHZ J. SQW/OUT ON-32KHZ'
DB CR,LF
DB CR,LF,'K. SQW/OUT OFF'
DB CR,LF,'L. WRITE RAM UNIQUE PATTERN '
DB CR,LF,'ESC. TO QUIT ',0
TEXT1:
DB CR,'DATE: ',0
TEXT2:
DB 'TIME: ',0
TEXT3:
DB CR,LF,0
TEXT4:
DB CR,LF,'natisni niakoi klavish za vrashtane'
DB CR,LF,0
TEXT5:
DB CR,LF,'ENTER THE BYTE VALUE WHICH WILL FILL THE RAM'
DB CR,LF,0
TEXT6:
DB CR,LF,'RAM   RAM'
DB CR,LF,'ADDR  DATA'
DB CR,LF,'-----------------------------'
DB CR,LF,0
;******************************************
;**** END OF PROGRAM ************
;******************************************
END