void escribir_ds1307(unsigned int8 direccion, unsigned int8 val);
void leer_ds1307(void);
unsigned int8 bin2bcd(unsigned int8 valor_binario);
unsigned int8 bcd2bin(unsigned int8 valor_bcd);
#define escribir_ds1307_cmd   0xd0
#define leer_ds1307_cmd       0xd1
#define segundos              0
#define minutos               1
#define horas                 2
#define dia_semana            3
#define dias                  4
#define meses                 5
#define anios                 6
#define registro_de_control      7
#define DS1307_DATE_TIME_BYTE_COUNT 7
#define DS1307_NVRAM_START_ADDR     8
#define DS1307_CONTROL_REG_INIT_VALUE  0x80

unsigned int8 registros_ds1307[registro_de_control];
void escribir_ds1307(unsigned int8 direccion,unsigned int8 val)
{
   disable_interrupts(GLOBAL);
   val=bin2bcd(val);
   i2c_start();
   i2c_write(escribir_ds1307_cmd);
   i2c_write(val);
   i2c_stop();
   enable_interrupts(GLOBAL);
}
void leer_ds1307(void)
{
   unsigned int8 i;
   i2c_start();
   i2c_write(escribir_ds1307_cmd);
   i2c_write(segundos);
   i2c_start();
   i2c_write(leer_ds1307_cmd);
   registros_ds1307[segundos]=i2c_read()& 0x07f;
   registros_ds1307[minutos]=i2c_read()& 0x07f;
   registros_ds1307[horas]=i2c_read()& 0x03f;
   registros_ds1307[dia_semana]=i2c_read()& 0x07;
   registros_ds1307[dias]=i2c_read()& 0x03f;
   registros_ds1307[meses]=i2c_read()& 0x01f;
   registros_ds1307[anios]=i2c_read(0);
   i2c_stop();
   for(i=0;i<7;i++)
   {
      registros_ds1307[i]=bcd2bin(registros_ds1307[i]);
   }
}
unsigned int8 bin2bcd(unsigned int8 valor_binario)
{
   unsigned int8 temp;
   unsigned int8 retval;
   temp=valor_binario;
   retval=0;
   while(1)
   {
      if(temp>=10)
      {
        temp-=10;
        retval+=10;
      }
      else
      {
        retval+=temp;
        break;
      }
   }
   return(retval);
}
unsigned int8 bcd2bin(unsigned int8 valor_bcd)
{
  unsigned int8 valor_bin;
  valor_bin=valor_bcd;
  valor_bin>>=1;
  valor_bin &= 0x78;
  return(valor_bin+(valor_bin>>2)+(valor_bcd & 0x0f));
}
