buenas amigo aquí de nuevo ahora con otro problema en principio ya logro ver y escribir los datos en el ds1307 pero ahora es como cambiar el formato de 24 horas a 12 horas (yo sé que es con unos de los bit de la dirección que contiene la hora pero no sé cómo controlarlo), por otra parte como controlar la salida SQW/OUT (sé que es con él registro de control pero no me funciona en la práctica solo en el simulador ) de ante manos muchas gracias.
He aquí el programa
#include <RTC_20_11_10.h>
#include <LCD.C>
#include <_ds1307.c>
int1 selec=0,cancel=0;
int menu=0,actual,funcion=0;
byte sec, min, hr, day, mes, ano, dds;
char ds[7][5]={"Dom\0","Lun\0","Mar\0","Mie\0","Jue\0","Vie\0","Sab\0"};
char sdds[5];
//
void mostrar_datos(){
do{
ds1307_get_day_of_week((char*) sdds);
ds1307_get_date(day,mes,ano,dds);
ds1307_get_time(hr,min,sec);
printf(lcd_putc,"\f%s %02d/%02d/%02d\n %02d:%02d:%02d\n",sdds,day,mes,ano,hr,min,sec);
if(input(PIN_C6)==0){delay_ms(150); selec=0; cancel=0; return; }
delay_ms(100);
}while(TRUE);
}
//
void acumulador(){
selec=0; cancel=0;
do{
lcd_gotoxy(12,1);
if(funcion<=5){printf(lcd_putc,":%02d",actual); }
if(funcion==6){printf(lcd_putc,":%s",ds[actual-1]);}
if(input(PIN_C5)==0){delay_ms(150); return; }
if(input(PIN_C7)==0){delay_ms(150); actual++; }
if(input(PIN_D3)==0){delay_ms(150); actual--; }
if(input(PIN_C6)==0){delay_ms(150); selec=0; cancel=0; return; }
if(funcion==1){if(actual==-1){actual=59;} else if(actual==60 ){actual=0;}}
if(funcion==2){if(actual==-1){actual=23;} else if(actual==24 ){actual=0;}}
if(funcion==3){if(actual==0 ){actual=31;} else if(actual==32 ){actual=1;}}
if(funcion==4){if(actual==0 ){actual=12;} else if(actual==13 ){actual=1;}}
if(funcion==5){if(actual==-1){actual=99;} else if(actual==100){actual=0;}}
if(funcion==6){if(actual==0) {actual=7;} else if(actual==8) {actual=1;}}
delay_ms(100);
}while(TRUE);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
ds1307_init(DS1307_ALL_DISABLED);
lcd_init();
lcd_putc("REAL TIME CLOCK\n");
lcd_putc("BY LEOELECTRONIC");
delay_ms(2000);
do{
if(input(PIN_C5)==0){delay_ms(150); selec=1;}
if(input(PIN_C7)==0){delay_ms(150); menu++;}
if(input(PIN_D3)==0){delay_ms(150); menu--;}
if(menu==0){printf(lcd_putc,"\f%cVer Hora\n Modif Seg",126);
if(selec==1){mostrar_datos();}}
if(menu==1){printf(lcd_putc,"\f%cModif Seg\n Modif Min",126);
if(selec==1){funcion=1; ds1307_get_time(hr,min,sec); actual=sec; acumulador(); if(cancel==1){return;} ds1307_set_hora(hr, min, actual); }}
if(menu==2){printf(lcd_putc,"\f%cModif Min\n Modif Hor",126);
if(selec==1){funcion=1; ds1307_get_time(hr,min,sec); actual=min; acumulador(); if(cancel==1){return;} ds1307_set_hora(hr, actual, sec); }}
if(menu==3){printf(lcd_putc,"\f%cModif Hor\n Modif Dia",126);
if(selec==1){funcion=2; ds1307_get_time(hr,min,sec); actual=hr; acumulador(); if(cancel==1){return;} ds1307_set_hora(actual, min, sec); }}
if(menu==4){printf(lcd_putc,"\f%cModif Dia\n Modif Mes",126);
if(selec==1){funcion=3; ds1307_get_date(day,mes,ano,dds); actual=day; acumulador(); if(cancel==1){return;} ds1307_set_fecha(actual, mes, ano, dds); }}
if(menu==5){printf(lcd_putc,"\f%cModif Mes\n Modif A#0",126);
if(selec==1){funcion=4; ds1307_get_date(day,mes,ano,dds); actual=mes; acumulador(); if(cancel==1){return;} ds1307_set_fecha(day, actual, ano, dds); }}
if(menu==6){printf(lcd_putc,"\f%cModif A#o\n Modif Dia Set",126);
if(selec==1){funcion=5; ds1307_get_date(day,mes,ano,dds); actual=ano; acumulador(); if(cancel==1){return;} ds1307_set_fecha(day, mes, actual, dds); }}
if(menu==7){printf(lcd_putc,"\f%cModif Dia Set\n Ver Hora",126);
if(selec==1){funcion=6; ds1307_get_date(day,mes,ano,dds); actual=dds; acumulador(); if(cancel==1){return;} ds1307_set_fecha(day, mes, ano, actual); }}
if(menu==8){menu=0;}
if(menu==-1){menu=7;}
delay_ms(150);
}while(TRUE);
}
////////////////////////////////////////////////////
Y la librería _ds1307.c
#ifndef RTC_SDA
#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3
#endif
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
#define DS1307_ALL_DISABLED 0b00000000 // All disabled
#define DS1307_OUT_ON_DISABLED_HIHG 0b10000000 // Out to Hight on Disable Out
#define DS1307_OUT_1_HZ 0b00010000 // Freq. Out to 1 Hz
#define DS1307_OUT_4_KHZ 0b00010001 // Freq. Out to 4.096 Khz
#define DS1307_OUT_8_KHZ 0b00010010 // Freq. Out to 8.192 Khz
#define DS1307_OUT_32_KHZ 0b00010011 // Freq. Out to 32.768 Khz
#define am 0b00000000
#define pm 0b00100000
#define Start_user_address_nvram 0x08
#define End_user_address_nvram 0x3f
char days_of_week[7][5]={"Dom\0","Lun\0","Mar\0","Mie\0","Jue\0","Vie\0","Sab\0"};
byte ds1307_bin2bcd(byte binary_value);
byte ds1307_bin1bcd(byte binary_value);
byte ds1307_bcd2bin(byte bcd_value);
void ds1307_init(int val){
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
i2c_start();
i2c_write(0xD0);
i2c_write(0x07);
i2c_start();
i2c_write(0xD0);
i2c_write(val);
i2c_stop();
delay_us(3);
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
void ds1307_set_hora(byte hr, byte min, byte sec){
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
sec &= 0x7F;
hr &= 0x3F;
i2c_start();
i2c_write(0xD0);
i2c_write(0x00);
i2c_write(ds1307_bin2bcd(sec));
i2c_write(ds1307_bin2bcd(min));
i2c_write(ds1307_bin2bcd(hr));
i2c_stop();
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
void ds1307_set_fecha(byte day, byte mth, byte year, byte dow){
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
i2c_start();
i2c_write(0xD0);
i2c_write(0x03);
i2c_write(ds1307_bin2bcd(dow));
i2c_write(ds1307_bin2bcd(day));
i2c_write(ds1307_bin2bcd(mth));
i2c_write(ds1307_bin2bcd(year));
i2c_stop();
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
////////////////////////////////////////////////////////////////////
void ds1307_get_date(byte &day, byte &mth, byte &year, byte &dow){
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
i2c_start();
i2c_write(0xD0);
i2c_write(0x03);
i2c_start();
i2c_write(0xD1);
dow = ds1307_bcd2bin(i2c_read() & 0x7f);
day = ds1307_bcd2bin(i2c_read() & 0x3f);
mth = ds1307_bcd2bin(i2c_read() & 0x1f);
year = ds1307_bcd2bin(i2c_read(0));
i2c_stop();
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
void ds1307_get_time(byte &hr, byte &min, byte &sec){
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
i2c_start();
i2c_write(0xD0);
i2c_write(0x00);
i2c_start();
i2c_write(0xD1);
sec = ds1307_bcd2bin(i2c_read() & 0x7f);
min = ds1307_bcd2bin(i2c_read() & 0x7f);
hr = ds1307_bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
char ds1307_read_nvram_byte(char addr){
char retval;
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
i2c_start();
i2c_write(0xD0);
i2c_write(addr);
i2c_start();
i2c_write(0xD1);
retval = i2c_read(0);
i2c_stop();
return(retval);
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
void ds1307_write_nvram_byte(char addr, char value){
#ifndef USE_INTERRUPTS
disable_interrupts(global);
#endif
i2c_start();
i2c_write(0xD0);
i2c_write(addr);
i2c_write(value);
i2c_stop();
#ifndef USE_INTERRUPTS
enable_interrupts(global);
#endif
}
void ds1307_get_day_of_week(char* ptr){
byte lday;
byte lmonth;
byte lyr;
byte ldow;
ds1307_get_date(lday,lmonth,lyr,ldow);
sprintf(ptr,"%s",days_of_week[ldow-1]);
}
///////////////////////////////////////////////////////////////////////////////
byte ds1307_bin2bcd(byte binary_value){
byte temp;
byte retval;
temp = binary_value;
retval = 0;
while(TRUE){
if(temp >= 10){
temp -= 10;
retval += 0x10;
}else{
retval += temp;
break;
}
}
return(retval);
}
byte ds1307_bcd2bin(byte bcd_value){
byte temp;
temp = bcd_value;
temp >>= 1;
temp &= 0x78;
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
///////////////////////////////////////////////////////////////////////////////