Hola, te dejo unas rutinas que termine hace poco, espero que te sean utiles:
(compiladas para pic 18fxxx, pasarlo a 16f no es dificil, creo que solo difiere la instruccion rrcnf)
;***********************************************************************************************
;********************************* Lectura y escritura del ds1302 ******************************
;***********************************************************************************************
write macro var1,var2
bsf PORTE,2
call retlcd1
movlw var1
call sbyte
movlw var2
call sbyte
nop
bcf PORTE,2 ;Pin de reset: cambia todos los PORTE,2
endm ; por tu pin conectado a reset
write2 macro var1,var2
bsf PORTE,2
call delay100us ;debes crear una rutina de delay de
movlw var1 ;unos 100 microsegundos
call sbyte
movf var2,W
call sbyte
nop
bcf PORTE,2
endm
;******************************************
config clrf PORTE
clrf LATE
movlw 0x07
movwf ADCON1
movlw 0x00
movwf TRISE
write 0x8e,0x00
nop
nop
nop
write 0x90,0x00
nop
nop
nop
write 0x80,0x00
con1 return
;*****************************************
sbyte movwf bufer ;debes definir este registro:
movlw 0x08 : bufer equ xxxx
movwf reg4 ;IDEM
movlw 0x0
movwf TRISE
ecrit bcf PORTE,1 ;I/O pin
btfsc bufer,0
bsf PORTE,1
call delay100us
bsf PORTE,0 ;clock pin
call delay100us
bcf PORTE,0
rrncf bufer
decfsz reg4
goto ecrit
return
rbyte movlw 0x07
movwf reg4
movlw 0x02
movwf TRISE
rb1 bsf bufer,7
btfss PORTE,1
bcf bufer,7
bsf PORTE,0
call delay100us
bcf PORTE,0
rrncf bufer,F
call delay100us
decfsz reg4
bra rb1
movf bufer,W
return
sburst write2 0x80,SEGUNDOS ;escribe el contenido de los reg.
write2 0x82,MINUTOS ;en el rtc
write2 0x84,HORA
write2 0x86,DIA
write2 0x88,MES
write2 0x8c,YEAR
return
rburst read 0x81
movwf SEGUNDOS ;lee el rtc y vuelca los datos en los reg.
read 0x83 ;recuerda aqui tambien debes definir
movwf MINUTOS ;estos registros
read 0x85
movwf HORA
read 0x87
movwf DIA
read 0x89
movwf MES
read 0x8d
movwf YEAR
return