Hola a todos, les dejo un programita que lee y escribe muy básicamente la fecha y hora del ds1307.
//Programa que usa protocolo I2C para
//escribir y leer tiempo del DS1307
//saca tiempo en LCD
//migsantiago
// Conexiones de la LCD:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.
#include <16f877a.h>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)
#include "lcd.c"
#use standard_io (D)
#use fast_io (b)
#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)
//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07
//DS1307
//Vbat a tierra
void main(void)
{
int16 retardo; //Cada cuando actualiza lectura en LCD
//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;
retardo=250; //ms a tardar entre lectura y lectura
//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x38;
hours = 0x15; //modo 24 hrs
day = 0x05; //1 es domingo
date = 0x13;
month = 0x01;
year = 0x05;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada
//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha
//Rutina LCD
lcd_init(); //Inicia LCD
lcd_putc("f"); //Limpia LCD
lcd_putc("Real Time Clock
"); //rtc
lcd_putc(" DS1307");
delay_ms(3000);
while(1)
{
delay_ms(retardo); //Usuario lee
//Obtiene datos de DS1307
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
i2c_stop();
i2c_start();
i2c_write(0xd1); //Lee DS1307
seconds = i2c_read();
minutes = i2c_read();
hours = i2c_read();
day = i2c_read();
date = i2c_read();
month = i2c_read();
year = i2c_read(0); //no ack
i2c_stop();
//Representa datos en la LCD
printf(lcd_putc,"f%2x-%2x-20%2x
",date,month,year); //dd-mm-year
printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
}
}