This is what I use. I cut-and-pasted from some other code, so everything might not be here, but this should give you a good idea.




Code:
       RTC                  =  %11010000 ' RTC device address (byte addressing); should not be a constant
        ScReg               CON  $00   ' seconds address (00 - 59)  MSBit of SecReg must be set to a 0 to enable RTC
        MnReg               CON  $01   ' minutes address (00 - 59)
        HrReg               CON  $02   ' hours address (01 - 12) or (00 - 23)
        DaReg               CON  $03   ' day address (1 - 7)
        DtReg               CON  $04   ' date address (01 - 28/29, 30, 31)
        MoReg               CON  $05   ' month address (01 - 12)
        YrReg               CON  $06   ' year address (00 - 99)
        ContReg             CON  $07   ' control register
        RAMstart            CON  $08
        RTCflag             CON  0     ' RTC flag (location 0 of internal EEPROM)
        ClockControlByte    CON  %00010000 ' sets the SQW/OUT to 1Hz pulse, logic level low
        
        
        ' Clock Variables        
       

        Sc              VAR BYTE
        Mn              VAR BYTE
        Hr              VAR BYTE
        Da              VAR BYTE
        Dt              VAR BYTE
        Mo              vAR BYTE
        YR              var BYTE


;------------------------------------------------------------


DoClock:
          HSEROUT [13,10,"To SET clock, enter 'S', to READ clock, enter 'R'",13,10]
           HSERIN [Dummy]
         
           
           IF Dummy = "S" OR Dummy = "s" THEN
         
              HSEROUT ["Enter Time - all inputs require two digits, no editing is possible",13,10]
              
              HSEROUT [13,10,"Hours   "]
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[1] = Dummy
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[2] = Dummy
                         
              HSEROUT [13,10,"Minutes "]
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[3] = Dummy
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[4] = Dummy 
               
              HSEROUT [13,10,"Date    "]
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[9] = Dummy
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[10] = Dummy 
              
              HSEROUT [13,10,"Month   "]
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[7] = Dummy
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[8] = Dummy
              
              HSEROUT [13,10,"Year    "]
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[11] = Dummy
              HSERIN  [Dummy]
              HSEROUT [Dummy]
              TimBuff[12] = Dummy
              GOSUB SETTime
           ENDIF
              
           IF Dummy = "R" or Dummy = "r" THEN 
              GOSUB ShowTime
              
              HSEROUT [TimBuff[1],TimBuff[2],":",TimBuff[3],TimBuff[4],":00,",TimBuff[7],TimBuff[8],"/",TimBuff[9],TimBuff[10],"/",TimBuff[11],TimBuff[12],13,10]
              
              PAUSE 10000
              
           ENDIF              
          
           RETURN
            
            
          
HexASCII2BCD:
           BCD = (Number1 - 48)<<4 + (Number2 - 48)
           RETURN
      
BCD2HexASCII:
           Number1 = (BCD >> 4) + 48
           Number2 = (BCD & %00001111) + 48
           RETURN  
           
          
                            

SetTime:
     
      Number1 = TimBuff[5]
      Number2 = TimBuff[6]
      
      Gosub HexAscii2BCD
      
      Sc = BCD
      
      Number1 = TimBuff[3]
      Number2 = TimBuff[4]   

      
      Gosub HexAscii2BCD
                                  
      Mn = BCD
      
      Number1 = TimBuff[1]
      Number2 = TimBuff[2]
      
      Gosub HexAscii2BCD
      
      Hr = BCD
      
      Number1 = TimBuff[7]
      Number2 = TimBuff[8]
      
      Gosub HexAscii2BCD
      
      Mo = BCD
      
      Number1 = TimBuff[9]
      Number2 = TimBuff[10]
      
      Gosub HexAscii2BCD
     
      Da = 0                            ' We don't care what day of the week it is
      Dt = BCD
      
      Number1 = TimBuff[11]
      Number2 = TimBuff[12]
      
      Gosub HexAscii2BCD
     
      YR = BCD
      
      Cntrl = 0                         ' Must be zero to make clk run - NOT same as control reg!
      Gosub ClockWrite
      GOSUB ClockControl
      Spare1 = 55                       ' Doesn't have to be BCD
      GOSUB ClockRamWrite
      RETURN


ShowTime:
     
      Gosub ClockRead
      BCD = sc
      GOSUB BCD2HexAscii
      
      TimBuff[5] = Number1
      TimBuff[6] = Number2
      
      BCD = mn
      GOSUB BCD2HexAscii
      TimBuff[3] = Number1
      TimBuff[4] = Number2
      
      BCD = hr
      GOSUB BCD2HexAscii
      TimBuff[1] = Number1
      TimBuff[2] = Number2
      
      BCD = mo
      GOSUB BCD2HexAscii
      TimBuff[7] = Number1
      TimBuff[8] = Number2
      
      BCD = dt
      GOSUB BCD2HexAscii
      TimBuff[9] = Number1
      TimBuff[10] = Number2
      
      BCD = yr
      GOSUB BCD2HexAscii
      TimBuff[11] = Number1
      TimBuff[12] = Number2
      
      RETURN

       
ClockWrite:
      I2CWrite SDA1,SCL1,RTC,ScReg,[sc,mn,hr,da,dt,mo,yr,Cntrl]
      Return 
           
ClockControl:
      I2CWRITE SDA1,SCL1,RTC,ContReg,[ClockControlByte]
      RETURN          
           
ClockRAMRead:
      I2CRead SDA1,SCL1,RTC,RAMstart,[Spare1,Spare2,Spare3,Spare4,Spare5,Spare6]                                    
      RETURN
      
ClockRAMWrite:
      I2CWRITE SDA1,SCL1,RTC,RAMstart,[Spare1,Spare2,Spare3,Spare4,Spare5,Spare6]
      RETURN          

ClockRead:   
      I2CRead SDA1,SCL1,RTC,ScReg,[sc,mn,hr,da,dt,mo,yr]
      RETURN