Hi guys

Found this example on the site but could not find how the tris bits are set for for the data direction from out to in the code , is it required , if not how did the data pin change direction for the read ( shiftin)

cheers

sheldon

Code:
' An example routines to use the DS1302 timer chip
' based on code provided by Omer Yildiz, Copyright (c) 2006 [2005] 
' http://www.picbasic.co.uk/forum/showthread.php?t=423
' This code uses a supercap at VCC1 to provide power when VCC2 is interupted
' Set initial time manually in clockinit
' Then reprogramme with convertTime and setClock commented out 

DEFINE LOADER_USED 1    'enable bootloader
DEFINE osc 20

'defines for debug
INCLUDE "modedefs.bas"

'set-up debug serial
DEFINE DEBUG_REG PORTB      ' Set Debug pin port
DEFINE DEBUG_BIT 6          ' Set Debug pin bit
DEFINE DEBUG_BAUD 9600      ' Set Debug baud rate
DEFINE DEBUG_MODE 1         ' Set Debug mode: 0 = true, 1 = inverted

LED             VAR PORTC.5

'clock pin definitions--------------------------------------------
timer_clk     var portb.3 ' DS1302 Clock Pin
timer_dq      var portb.2 ' DS1302 Data Pin
timer_rst     var portb.1 ' DS1302 Reset Pin

'decimal variables for setting up time---------------
second  var byte
minute  var byte
hour    var byte
day     var byte
month   var byte
year    var byte

'hex variables for actual time display--------------
secondx     Var byte
minutex     var byte
hourx       var byte
dayx        var byte
monthx      var byte
yearx       var byte
RTC         var byte

'Write Commands For DS1302 --------------------------
writectrl       con $8E ' Control byte
writechrg       CON $91 ' Write trickle charge
tricklereg      CON $A0 ' Enable trickle charge for supercap
writeram        con $80 ' Write to RAM
writeprotect    con $00 ' Write-protect DS1302
writesec        con $80 ' Write seconds
writemin        con $82 ' Write minutes
writehour       con $84 ' Write hour
writedate       con $86 ' Write date
writemonth      con $88 ' Write month
writeyear       con $8C ' Write year

'Read Commands For DS1302 -------------------------
readsec         con $81 ' Read seconds from DS1302
readmin         con $83 ' Read minutes from DS1302
readhour        con $85 ' Read hours from DS1302
readdate        con $87 ' Read date from DS1302
readyear        con $8D ' Read year from DS1302
readmonth       con $89 ' Read month from DS1302

'Time Variables ------------------------------
mem         var byte ' Temporary data holder
outbyte     var byte ' Second byte to ds1302
reg_adr     var byte ' First byte to DS1302
decx        var byte ' A swap variable


HIGH LED
PAUSE 1000
LOW LED


'Initial Settings For Ports ------------------------
clockInit:
    
    DEBUG "DS1302 timer with trickle charge",10,13
    
    ' set intial time and date here
    second = 20
    minute = 14
    hour = 12
    day = 10
    month = 9
    year = 7

    low timer_rst ' Set reset pin low
    low timer_clk ' Set clock pin low
    
    ' This enables the trickle charger
    GOSUB setTrickleCharge
    
    ' These two should be commented out after initialising the PIC
    ' with the time date above
    'GOSUB convertTime
    'GOSUB setClock
 
 GOTO loop


'Read time at 5 secind intervals-------------------------
loop:
        call readclk            ' go read DS1302
        pause 5000
goto loop


'Time Commands Subroutines --------------------------
readclk:

        reg_adr = readsec   'Read seconds
        gosub timerRead
        second = mem
        
        reg_adr = readmin   'Read minutes
        gosub timerRead
        minutex = mem
        
        reg_adr = readhour  'Read Hours
        gosub timerRead
        hourx = mem
        
        reg_adr = readyear  'Read Year
        gosub timerRead
        yearx = mem
        
        reg_adr = readdate  'Read Date
        gosub timerRead
        dayx = mem
        
        reg_adr = readmonth 'Read Month
        gosub timerRead
        monthx = mem
        
        DEBUG HEX hourx,":",HEX minutex,":",HEX second," ",HEX dayx,"/",HEX monthx,"/",HEX yearx,10,13

return

setTrickleCharge:

        reg_adr = writectrl         ' Set to control byte 
        outbyte = writeprotect      ' Set turn off protection
        gosub timerWrite            ' Send both bytes
        
        reg_adr = writechrg
        outbyte = tricklereg
        gosub timerWrite
        
        reg_adr = writectrl
        outbyte = writeprotect
        gosub timerWrite
RETURN

   
setClock:
        reg_adr = writectrl         ' Set to control byte 
        outbyte = writeprotect      ' Set turn off protection
        gosub timerWrite            ' Send both bytes
        
        reg_adr = writesec          ' Set to write seconds register
        outbyte = secondx           ' Set to write 00 to seconds register in HEX format
        gosub timerWrite
        
        reg_adr = writemin
        outbyte = minutex            'Our minutex and others with x (except for monthx) are now in HEX format.
        gosub timerWrite
        
        reg_adr = writehour
        outbyte = hourx
        gosub timerWrite
        
        reg_adr = writedate
        outbyte = dayx
        gosub timerWrite
        
        reg_adr = writemonth
        outbyte = monthx
        gosub timerWrite
        
        reg_adr = writeyear
        outbyte = yearx
        gosub timerWrite
        
        reg_adr = writectrl
        outbyte = writeprotect
        gosub timerWrite
RETURN

timerRead:
        mem = reg_adr                           ' Set mem variable to reg_adr contents
        high timer_rst                          ' Activate the DS1302
        shiftout timer_dq,timer_clk,0, [mem]    ' Send control byte
        shiftin timer_dq,timer_clk,1, [mem]     ' Retrieve data in from the DS1302
        low timer_rst                           ' Deactivate DS1302
return 

timerWrite:
        mem = reg_adr                           ' Set mem variable to reg_adr contents
        high timer_rst                          ' Activate the DS1302
        shiftout timer_dq,timer_clk,0, [mem]    ' Send control byte
        mem = outbyte                           ' Set mem variable to outbyte contents
        shiftout timer_dq,timer_clk,0, [mem]    ' Send data stored in mem variable to DS1302
        low timer_rst                           ' Deactivate DS1302
return


'Convert initial set up times to hex---------------------------------
    
convertTime:

        pause 100
        call chkLeap
        pause 20
        decx=year          
        gosub convertion
        yearx=rtc
       
        pause 100
        decx=month
        gosub convertion
        monthx=rtc
        
        pause 100
        decx=day
        gosub convertion
        dayx=rtc            
        
        pause 100
        decx=hour
        gosub convertion
        hourx=rtc
        
        pause 100
        decx=minute
        gosub convertion
        minutex=rtc            
        
        pause 100
        decx=second
        gosub convertion
        secondx=rtc
                    
RETURN
             

'Convert DEC to HEX
convertion:

	RTC=decx DIG 1
	RTC=RTC<<4
	RTC=RTC+decx DIG 0

return


'Check for leap year
chkLeap:  

    if year=8 or year=12 or year=16	or year=20 Then 
        write 2,29              'Years with Feb=29 days (for 50 yrs.)
        pause 20
    else
        write 2, 28   
        pause 20
    endif
  
return


END