Hola es mi primer mensaje en este foro y estoy desesperado, después de indagar hice un programa con el DS1302 pero necesitaba una salida de 1Hz para otro circuito con lo que simulé también el DS1307 y lo que hice fue cambiar las instrucciones y aplicar las de la librería del DS1307.
El programa saca la fecha y hora y al principio se configura, cuando se pone ok se visualiza la hora configurada, el problema es que con el ds1302 me va perfecto, pero con el ds1307 el proteus se me vuelve loco. He utilizado la libreria flex_lcd y todo lo demás es normal Adjunto link de los programas y simulaciones en el proteus. DAVID 1 será DS1302 ok Y DAVID 2 será DS1307 que necesito que vaya bien y no va. De todas formas pego tb el código y a ver si logran decirme por qué no me va. Como ven comento las líneas del ds1302 para que vean donde pongo las del DS1307, ok? los pines del ds1307 están puestos en su librería, lo inicializo y pongo las instrucciones pertinentes que verán a continuación, no hagan caso de algunos comentarios que están incorrectos, sólo fijense en el código que además tiene instrucciones que están relacionadas con otro circuito pero ahi no me falla:
DS1302 QUE VA OK
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR'05
// 09/Septiembre/05
// vszener@gmail.com
// Programa: Reloj-Calendario DS1302
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) la fecha y hora obtenida mediante la
// lectura del DS1302. Pudiendose modificar mediante los botones Conf/Ok y up.
// Se utiliza variables globales:
// ·day-> dia ds1302
// ·mth -> mes ds1302
// ·year -> año ds1302
// ·hour -> hora ds1302
// ·min -> minutos ds1302
// ·sec-> segundos ds1302
// ·menu -> variable que muestra opcion del menu configurar
// ·flag -> variable que cuenta hasta 130ms aprox.
// ·var -> ajuste fino para que desborde cada 130ms aprox.
// Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos
// visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto
// utilizamos una variable llamada flag que sera la encargada de dicha tarea.
// Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el
// encargado de ir moviendose mediante las opciones del menu:hora,minutos,....
// y el boton 'Conf/Ok' el encargado de configurar el reloj(cuando estemos en modo ver
// hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando
// estemos en formato de configurar fecha y hora).
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// Conexiones: A0 -> RST DS1302
// A1 -> SCLK DS1302
// A2 -> I/O DS1302
// A3 -> Boton 'up'
// A5 -> Boton 'Conf/Ok'
// B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
// B3 -> Zumbador(beep)
//////////////////////////////////////////////////////////////////////////////////
#include <16F877A.h> /// libreria para el manejo del pic16f877a
#use delay(clock=4000000) /// declara la frecuencia del cristal, era de 8 Mhz
#include <string.h> //PARA USAR LOS STRING (TEXTOS)
#include <stdlib.h>
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT //comandos para el programador
#use standard_io(a)
#use standard_io(b)
#use standard_io(c)
#use standard_io(d)
#use standard_io(e)
#define use_portb_lcd TRUE //utilizar el port b para lcd
#define RTC_SCLK PIN_C3 //definimos pin's...
#define RTC_IO PIN_C5
#define RTC_RST PIN_C4 //...de conexion de la rtc ds1302
#include <ds1302.c> //libreria de rtc ds1302
//#include <ds1307.c>
#include <flex_lcd.c> //libreria de lcd
///VARIABLES GLOBALES
byte day=1,mth=1,year=9,dow,hour=0,min=0,sec=0; //variabes para ds1302-ds1307
byte menu=0,flag=0,var=2; //variables para menu configurar
//variables GLOBALES para los textos
char mestxt[3]; //le cambio el nombre porque existe una función con el mismo nombre
//char am_pm[2]; //la quito porque el pow no se utiliza
///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void dia_sem(void);
void mes(void);
void anio(void);
void beep(void);
void convierte_mes(void);
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 130ms aprox?
var--; //SI -> decremento var...
if(var==0)
var=2; //...ajuste fino de 130ms aprox
flag=0; //reset flag para contar 130ms aprox
//ds1307_get_date(day,mth,year,dow); //coge dia,mes,año ///
//ds1307_get_time(hour,min,sec); //coge hora,minuto,segundo
rtc_get_date(day,mth,year,dow);
rtc_get_time(hour,min,sec);
convierte_mes();
printf(lcd_putc,"\f%2d %s %2d\nHora: %2d:%2d:%2d",day,mestxt,year,hour,min,sec); //lcd
}
set_timer0(0); //reset TMR0
flag++; //incremento variable flag
}
///PROGRAMA
void main(void){
set_tris_a (0x28) ;
set_tris_d (0x00) ;
//set_tris_b (0xff) ;
//set_tris_c (0x04) ;
//set_tris_e (0x01) ;
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_D2);
output_low(PIN_D3);
output_low(PIN_D4);
output_low(PIN_D5);
output_low(PIN_D6);
output_low(PIN_D7);
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(0); //carga TMR0
lcd_init(); //inicializa lcd
rtc_init(); //inicializa rtc
//ds1307_init(); //inicializa el ds1307
lcd_putc("Reloj en BCD\nI.E.S.CABANYAL"); //presentacion...
delay_ms(1500);
lcd_gotoxy(1,1);
lcd_putc("\fToni Gellida\nD.P.E.2");
delay_ms(2000); //...inicial
configurar(); //ve a menu configurar
enable_interrupts(GLOBAL); //activadas interrupciones
while(1){ //bucle...
if(input(PIN_A5)==0){ //Si se pulsa Conf....
while(!input(PIN_A5)){} //elimina rebotes
beep();
configurar();
} //ve a menu configurar
} //...infinito
}
///FUNCION CONFIGURAR
void configurar(void){
disable_interrupts(GLOBAL); //desactivadas interrupciones
output_high(PIN_A0); //CONFIGURAR CONTADORES
do{
switch(menu){
case 0: lcd_putc("\fConfigurar\nhoras?"); //horas
output_high(PIN_D0); //CONTADOR HORAS
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
horas();
menu=1; //apunta siguiente opcion
}
break;
case 1: lcd_putc("\fConfigurar\nminutos?"); //minutos
output_low(PIN_D0); //CONTADOR HORAS FUERA
output_high(PIN_D2); //CONTADOR MINUTOS
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
minutos();
menu=2; //apunta siguiente opcion
}
break;
case 2: lcd_putc("\fConfigurar\ndia semana?"); //dia semana/no inc lcd
output_low(PIN_D2); //CONTADOR MINUTOS FUERA
output_high(PIN_D4); //CONTADOR DIA SEM
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
dia_sem();
menu=3; //apunta siguiente opcion
}
break;
case 4: lcd_putc("\fConfigurar\ndia?"); //dias
output_low(PIN_D4); //CONTADOR DIA SEM FUERA
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
dia();
menu=5; //apunta siguiente opcion
}
break;
case 3: lcd_putc("\fConfigurar\nmes?"); //mes
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
mes();
menu=4; //apunta siguiente opcion
}
break;
case 5: lcd_putc("\fConfigurar\nanio?"); //años
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
anio();
menu=6; //apunta siguiente opcion
}
break;
case 6: lcd_putc("\fSalir\nconfigurar?"); //salir configuracion
if(!input(PIN_A5)){
menu=7;
beep();
output_low(PIN_A0); //CONTADORES EN FUNCIONAMIENTO
lcd_putc("\fHora\nConfigurada"); //salir configuracion
delay_ms(2500);
}
}
if(!input(PIN_A3)){ //controla el boton up...
while(!input(PIN_A3)){}
menu++;
if(menu>6)
menu=0;
} //...para mostrar menu por lcd
delay_ms(130); //retardo para ver lcd
}while(menu<7);
menu=0; //actualiza indices menu
//ds1307_set_date_time(day,mth,year,dow,hour,min,sec);//nueva hora,minuto,...
rtc_set_datetime(day,mth,year,dow,hour,min);
enable_interrupts(GLOBAL); //activadas interrupciones
set_timer0(0); //carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){
printf(lcd_putc,"\fConf.Horas:\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
hour++; //SI -> incremento hour
output_high(PIN_D1); //CONTADOR UP HORAS
delay_ms(500);
output_low(PIN_D1); //CONTADOR UP HORAS BAJA
if(hour>23) hour=0;
printf(lcd_putc,"\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd hour
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MINUTOS
void minutos(void){
printf(lcd_putc,"\fConf.Minutos:\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
min++; //SI -> incremento min
output_high(PIN_D3); //CONTADOR UP HORAS
delay_ms(500);
output_low(PIN_D3); //CONTADOR UP HORAS BAJA
if (min>59) min =0;
printf(lcd_putc,"\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd min
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA DIA SEMANA
void dia_sem(void){
printf(lcd_putc,"\fConf.Dia\nsemana"); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
output_high(PIN_D5); //CONTADOR UP DIA SEM
delay_ms(500);
output_low(PIN_D5); //CONTADOR UP DIA SEM BAJA
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA DIAS
void dia(void){
convierte_mes();
printf(lcd_putc,"\fConf.Dias:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
day++; //SI -> incremento day
if(((mth==1)||(mth==3)||(mth==5)||(mth==7)||(mth==8)||(mth==10)||(mth==12))&&(day>31)) day=1;
if((mth==2)&&(day>28)) day=1; //fallaría en los años bisiestos
if((mth==4)||(mth==6)||(mth==9)||(mth==11)&&(day>30)) day=1;
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Dias:\n%2d %s %2d",day,mestxt,year); //muestra por lcd day
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MES
void mes(void){
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Mes:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
mth++; //SI -> incremento mth
if(mth>12) mth=1;
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Mes:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
convierte_mes();
printf(lcd_putc,"\fConf.Anio:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
year++; //SI -> incremento mth
if(year>99) year=0; //años hasta el 2099, si no me equivoco
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Anio:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION BEEP
void beep(void){
output_high(PIN_B3); //activa zumbador
delay_ms(50);
output_low(PIN_B3); //desactiva zumbador
}
//CONVERSION DE LOS MESES A TEXTO
void convierte_mes(void)//todo con variables globales
{
switch(mth)
{
case 1: strcpy(mestxt,"ene");
break;
case 2: strcpy(mestxt,"feb");
break;
case 3: strcpy(mestxt,"mar");
break;
case 4: strcpy(mestxt,"abr");
break;
case 5: strcpy(mestxt,"may");
break;
case 6: strcpy(mestxt,"jun");
break;
case 7: strcpy(mestxt,"jul");
break;
case 8: strcpy(mestxt,"ago");
break;
case 9: strcpy(mestxt,"sep");
break;
case 10: strcpy(mestxt,"oct");
break;
case 11: strcpy(mestxt,"nov");
break;
case 12: strcpy(mestxt,"dic");
break;
default: strcpy(mestxt,"otr");
}
}
DS1307 QUE NO VA Y NECESITO QUE ME DIGAN POR QUE
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR'05
// 09/Septiembre/05
// vszener@gmail.com
// Programa: Reloj-Calendario DS1302
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) la fecha y hora obtenida mediante la
// lectura del DS1302. Pudiendose modificar mediante los botones Conf/Ok y up.
// Se utiliza variables globales:
// ·day-> dia ds1302
// ·mth -> mes ds1302
// ·year -> año ds1302
// ·hour -> hora ds1302
// ·min -> minutos ds1302
// ·sec-> segundos ds1302
// ·menu -> variable que muestra opcion del menu configurar
// ·flag -> variable que cuenta hasta 130ms aprox.
// ·var -> ajuste fino para que desborde cada 130ms aprox.
// Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos
// visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto
// utilizamos una variable llamada flag que sera la encargada de dicha tarea.
// Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el
// encargado de ir moviendose mediante las opciones del menu:hora,minutos,....
// y el boton 'Conf/Ok' el encargado de configurar el reloj(cuando estemos en modo ver
// hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando
// estemos en formato de configurar fecha y hora).
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// Conexiones: A0 -> RST DS1302
// A1 -> SCLK DS1302
// A2 -> I/O DS1302
// A3 -> Boton 'up'
// A5 -> Boton 'Conf/Ok'
// B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
// B3 -> Zumbador(beep)
//////////////////////////////////////////////////////////////////////////////////
#include <16F877A.h> /// libreria para el manejo del pic16f877a
#use delay(clock=8000000) /// declara la frecuencia del cristal, era de 8 Mhz
#include <string.h> //PARA USAR LOS STRING (TEXTOS)
#include <stdlib.h>
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT //comandos para el programador
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)
#define use_portb_lcd TRUE //utilizar el port b para lcd
//#define RTC_SCLK PIN_C3 //definimos pin's...
//#define RTC_IO PIN_C5
//#define RTC_RST PIN_C4 //...de conexion de la rtc ds1302
//#include <ds1302.c> //libreria de rtc ds1302
#include <ds1307.c>
#include <flex_lcd.c> //libreria de lcd
///VARIABLES GLOBALES
byte day=1,mth=1,year=9,dow,hour=0,min=0,sec=0; //variabes para ds1302-ds1307
byte menu=0,flag=0,var=2; //variables para menu configurar
//variables GLOBALES para los textos
char mestxt[3]; //le cambio el nombre porque existe una función con el mismo nombre
//char am_pm[2]; //la quito porque el pow no se utiliza
///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void dia_sem(void);
void mes(void);
void anio(void);
void beep(void);
void convierte_mes(void);
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 130ms aprox?
var--; //SI -> decremento var...
if(var==0)
var=2; //...ajuste fino de 130ms aprox
flag=0; //reset flag para contar 130ms aprox
ds1307_get_date(day,mth,year,dow); //coge dia,mes,año ///
ds1307_get_time(hour,min,sec); //coge hora,minuto,segundo
//rtc_get_date(day,mth,year,dow);
//rtc_get_time(hour,min,sec);
convierte_mes();
printf(lcd_putc,"\f%2d %s %2d\nHora: %2d:%2d:%2d",day,mestxt,year,hour,min,sec); //lcd
}
set_timer0(0); //reset TMR0
flag++; //incremento variable flag
}
///PROGRAMA
void main(void){
set_tris_A (0x28) ;
set_tris_D (0x00) ;
set_tris_B (0x00) ;
set_tris_C (0x04) ;
set_tris_E (0x01) ;
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_D2);
output_low(PIN_D3);
output_low(PIN_D4);
output_low(PIN_D5);
output_low(PIN_D6);
output_low(PIN_D7);
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(0); //carga TMR0
lcd_init(); //inicializa lcd
//rtc_init(); //inicializa rtc
ds1307_init(); //inicializa el ds1307
lcd_putc("Reloj en BCD\nI.E.S.CABANYAL"); //presentacion...
delay_ms(1500);
lcd_gotoxy(1,1);
lcd_putc("\fToni Gellida\nD.P.E.2");
delay_ms(2000); //...inicial
configurar(); //ve a menu configurar
enable_interrupts(GLOBAL); //activadas interrupciones
while(1){ //bucle...
if(input(PIN_A5)==0){ //Si se pulsa Conf....
while(!input(PIN_A5)){} //elimina rebotes
beep();
configurar();
} //ve a menu configurar
} //...infinito
}
///FUNCION CONFIGURAR
void configurar(void){
disable_interrupts(GLOBAL); //desactivadas interrupciones
output_high(PIN_A0); //CONFIGURAR CONTADORES
do{
switch(menu){
case 0: lcd_putc("\fConfigurar\nhoras?"); //horas
output_high(PIN_D0); //CONTADOR HORAS
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
horas();
menu=1; //apunta siguiente opcion
}
break;
case 1: lcd_putc("\fConfigurar\nminutos?"); //minutos
output_low(PIN_D0); //CONTADOR HORAS FUERA
output_high(PIN_D2); //CONTADOR MINUTOS
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
minutos();
menu=2; //apunta siguiente opcion
}
break;
case 2: lcd_putc("\fConfigurar\ndia semana?"); //dia semana/no inc lcd
output_low(PIN_D2); //CONTADOR MINUTOS FUERA
output_high(PIN_D4); //CONTADOR DIA SEM
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
dia_sem();
menu=3; //apunta siguiente opcion
}
break;
case 4: lcd_putc("\fConfigurar\ndia?"); //dias
output_low(PIN_D4); //CONTADOR DIA SEM FUERA
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
dia();
menu=5; //apunta siguiente opcion
}
break;
case 3: lcd_putc("\fConfigurar\nmes?"); //mes
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
mes();
menu=4; //apunta siguiente opcion
}
break;
case 5: lcd_putc("\fConfigurar\nanio?"); //años
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
anio();
menu=6; //apunta siguiente opcion
}
break;
case 6: lcd_putc("\fSalir\nconfigurar?"); //salir configuracion
if(!input(PIN_A5)){
menu=7;
beep();
output_low(PIN_A0); //CONTADORES EN FUNCIONAMIENTO
lcd_putc("\fHora\nConfigurada"); //salir configuracion
delay_ms(2500);
}
}
if(!input(PIN_A3)){ //controla el boton up...
while(!input(PIN_A3)){}
menu++;
if(menu>6)
menu=0;
} //...para mostrar menu por lcd
delay_ms(130); //retardo para ver lcd
}while(menu<7);
menu=0; //actualiza indices menu
ds1307_set_date_time(day,mth,year,dow,hour,min,sec);//nueva hora,minuto,...
//rtc_set_datetime(day,mth,year,dow,hour,min);
enable_interrupts(GLOBAL); //activadas interrupciones
set_timer0(0); //carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){
printf(lcd_putc,"\fConf.Horas:\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
hour++; //SI -> incremento hour
output_high(PIN_D1); //CONTADOR UP HORAS
delay_ms(500);
output_low(PIN_D1); //CONTADOR UP HORAS BAJA
if(hour>23) hour=0;
printf(lcd_putc,"\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd hour
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MINUTOS
void minutos(void){
printf(lcd_putc,"\fConf.Minutos:\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
min++; //SI -> incremento min
output_high(PIN_D3); //CONTADOR UP HORAS
delay_ms(500);
output_low(PIN_D3); //CONTADOR UP HORAS BAJA
if (min>59) min =0;
printf(lcd_putc,"\nHora: %2d:%2d:%2d",hour,min,sec); //muestra por lcd min
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA DIA SEMANA
void dia_sem(void){
printf(lcd_putc,"\fConf.Dia\nsemana"); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
output_high(PIN_D5); //CONTADOR UP DIA SEM
delay_ms(500);
output_low(PIN_D5); //CONTADOR UP DIA SEM BAJA
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA DIAS
void dia(void){
convierte_mes();
printf(lcd_putc,"\fConf.Dias:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
day++; //SI -> incremento day
if(((mth==1)||(mth==3)||(mth==5)||(mth==7)||(mth==8)||(mth==10)||(mth==12))&&(day>31)) day=1;
if((mth==2)&&(day>28)) day=1; //fallaría en los años bisiestos
if((mth==4)||(mth==6)||(mth==9)||(mth==11)&&(day>30)) day=1;
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Dias:\n%2d %s %2d",day,mestxt,year); //muestra por lcd day
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MES
void mes(void){
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Mes:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
mth++; //SI -> incremento mth
if(mth>12) mth=1;
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Mes:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
convierte_mes();
printf(lcd_putc,"\fConf.Anio:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
year++; //SI -> incremento mth
if(year>99) year=0; //años hasta el 2099, si no me equivoco
convierte_mes(); //devuelve el resultado en mestxt
printf(lcd_putc,"\fConf.Anio:\n%2d %s %2d",day,mestxt,year); //muestra por lcd
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION BEEP
void beep(void){
output_high(PIN_B3); //activa zumbador
delay_ms(50);
output_low(PIN_B3); //desactiva zumbador
}
//CONVERSION DE LOS MESES A TEXTO
void convierte_mes(void)//todo con variables globales
{
switch(mth)
{
case 1: strcpy(mestxt,"ene");
break;
case 2: strcpy(mestxt,"feb");
break;
case 3: strcpy(mestxt,"mar");
break;
case 4: strcpy(mestxt,"abr");
break;
case 5: strcpy(mestxt,"may");
break;
case 6: strcpy(mestxt,"jun");
break;
case 7: strcpy(mestxt,"jul");
break;
case 8: strcpy(mestxt,"ago");
break;
case 9: strcpy(mestxt,"sep");
break;
case 10: strcpy(mestxt,"oct");
break;
case 11: strcpy(mestxt,"nov");
break;
case 12: strcpy(mestxt,"dic");
break;
default: strcpy(mestxt,"otr");
}
}
De todas formas todo está aquí:
http://www.megaupload.com/?d=B0WZKY8XMuchísimas grácias por su atención, no recurriría a ustedes si no hubiera recurrido a todo lo que se para sanarlo, mi sospecha es que el proteus se ralla