///////////////////// PROGRAMA QUE UTILZA EL I.C. DS1307 PARA GENERAR LA //////////////////////////
//////////HORA EN TIEMPO REAL A TRAVES DE UNA LCD DE 2 POR 16 CARACTERES POR MEDIO DE UN PIC/////
#include /// libreria para el manejo del pic16f873a
#use delay(clock=8000000) /// declara la frecuencia del cristal a 8 MHZ
#fuses HS,NOWDT,noPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include
#include //libreria para la lcd de 2×16,(la de 4×16 es la libreria llamada lcd.c)
#use fast_io(A)
#use fast_io(B)
#byte portc = 7 /// se definen direcciones de memoria
#byte porta = 5
#byte portb = 6
// variables utilizadas en el programa…
int sec;
int min;
int hrs;
int day;
int month;
int yr;
int dow;
int datosec=1;
int datomin;
int datohrs;
int datoday=1;
int datomonth=1;
int datoyr=14;
int datodow=0;
int horap;
int horap1;
void funcion_controldow(void){ //FUNCION CONTROL DIA DE LA SEMANA
if(dow>7){
dow=1;}
}
void funcion_fecha4(void){ //FUNCION DIA DE LA SEMANA
volver7:
if((bit_test(porta,5)==0)&&(bit_test(porta,0)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el dia de la semana d/s.reloj detenido
dow++;
funcion_controldow();
delay_ms(100);
switch (dow){
case 1:
lcd_gotoxy(1,1);
printf(lcd_putc,"LUN.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
case 2:
lcd_gotoxy(1,1);
printf(lcd_putc,"MAR.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
case 3:
lcd_gotoxy(1,1);
printf(lcd_putc,"MIE.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
case 4:
lcd_gotoxy(1,1);
printf(lcd_putc,"JUE.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
case 5:
lcd_gotoxy(1,1);
printf(lcd_putc,"VIE.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
case 6:
lcd_gotoxy(1,1);
printf(lcd_putc,"SAB.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
case 7:
lcd_gotoxy(1,1);
printf(lcd_putc,"DOM.");
lcd_gotoxy(1,2);
printf(lcd_putc,"D/S+ ");
delay_ms(700);
break;
default:break;
}
goto volver7;
}
}
void funcion_alarma(void){ //FUNCION ALARMA DE LA HORA EN PUNTO
if((min==0)&&(sec==0)){
lcd_putc( "f" );
lcd_gotoxy(1,1);
printf(lcd_putc," Hora * Exacta " ); ///se despliegan los datos en pantalla y suena la alarma de aprox.1seg.
lcd_gotoxy(1,2);
printf(lcd_putc," Systeltronik@. ");
output_high(pin_b3);
}
else
output_low(pin_b3);}
void funcion_control1(void){//control para la fecha
if(day>31){
day=1;}
if(month>12){
month=1;}
if(yr>49){
yr=12;}
}
void funcion_fecha1(void){ //FUNCION FECHA
volver3:
if((bit_test(porta,0)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar la fecha.dia.reloj detenido
day++;
funcion_control1();
lcd_gotoxy(6,1);
printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);
lcd_gotoxy(1,2);
printf(lcd_putc,"Dia+ ");
delay_ms(450);
goto volver3;
}
}
void funcion_fecha2(void){
volver4:
if((bit_test(porta,1)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Mes.reloj detenido
month++;
funcion_control1();
lcd_gotoxy(6,1);
printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);
lcd_gotoxy(1,2);
printf(lcd_putc,"Mes+ ");
delay_ms(450);
goto volver4;
}
}
void funcion_fecha3(void){
volver5:
if((bit_test(porta,2)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,0)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Year.reloj detenido
yr++;
funcion_control1();
lcd_gotoxy(6,1);
printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);
lcd_gotoxy(1,2);
printf(lcd_putc,"yrs+ ");
delay_ms(250);
goto volver5;
}
}
void funcion_control(void){
if(hrs>23){
hrs=0;}
if(min>59){
min=0;}
if(sec>59){
sec=0;}
}
void funcion_reloj1(void) { //FUNCION HORA
volver:
if((bit_test(porta,0)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.hora.reloj detenido
hrs++;
funcion_control();
lcd_gotoxy(1,2);
printf(lcd_putc,"Hrs+ %02d:%02d:%02d ",hrs,min,sec);
delay_ms(450);
goto volver;
}
}
void funcion_reloj2(void) {
volver1:
if((bit_test(porta,1)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Minutos.reloj detenido
min++;
funcion_control();
lcd_gotoxy(1,2);
printf(lcd_putc,"Min+ %02d:%02d:%02d ",hrs,min,sec);
delay_ms(450);
goto volver1;
}
}
void funcion_reloj3(void) {
volver2:
if((bit_test(porta,2)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,0)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.segundos.reloj detenido
sec++;
funcion_control();
lcd_gotoxy(1,2);
printf(lcd_putc,"Seg+ %02d:%02d:%02d ",hrs,min,sec);
delay_ms(350);
goto volver2;
}
}
void formato_12h24h(void){ //FUNCION MOSTRAR DATOS EN FORMATO 12H O 24H
if((bit_test(porta,3)==1)&&(bit_test(porta,5)==0)&&(bit_test(porta,4)==1)){//si se cumplen estas condiciones en los swiches se puede alternar exibir la hora en formato 12h o 24h.No se detiene el reloj
if(hrs==0){
datohrs=hrs+12;
lcd_gotoxy(1,2);
printf(lcd_putc,"12h. %02d:%02d:%02d AM ",datohrs,min,sec);
}
else{
if(datohrs>12){
datohrs=datohrs-12;
lcd_gotoxy(1,2);
printf(lcd_putc,"12h. %02d:%02d:%02d PM ",datohrs,min,sec);}
else{
if(hrs<12){
lcd_gotoxy(1,2);
printf(lcd_putc,"12h. %02d:%02d:%02d AM ",hrs,min,sec); }
else{
if(hrs==12){
datohrs=hrs;
lcd_gotoxy(1,2);
printf(lcd_putc,"12h. %02d:%02d:%02d PM ",datohrs,min,sec);}
}
}
}
}
else{
lcd_gotoxy(1,2);
printf(lcd_putc,"24h. %02d:%02d:%02d ",hrs,min,sec); }
}
///////////////////////////////////////////////////////////////////////////////////
////////////////////// PROGRAMA PPAL//////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void main()
{
ds1307_init(); ///INICIO ds1307
ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha DEL DS1307
ds1307_get_time(hrs,min,sec); /// se obtiene la hora DEL DS 1307
datohrs=hrs;
datomin=min;
datosec=sec;
datoday=day;
datomonth=month;
datoyr=yr;
datodow=dow;
set_tris_a(0b11111111);
set_tris_b(0x00);
port_b_pullups(true);
lcd_init(); //INICIO DE LA LCD 2X16
programado:
ds1307_set_date_time(day,month,yr,dow,hrs,min,sec); /// se escribe en el DS1307 el tiempo configurado
while(1)
{
delay_ms(100);
ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha para mostrar
ds1307_get_time(hrs,min,sec); /// se obtiene la hora para mostrar
datohrs=hrs;
datomin=min;
datosec=sec;
formato_12h24h();
switch (dow){ //RUTINA QUE MUESTRA EL DIA DE LA SEMANA de acuerdo al dato dow
case 1:
lcd_gotoxy(1,1);
printf(lcd_putc,"LUN. ");
break;
case 2:
lcd_gotoxy(1,1);
printf(lcd_putc,"MAR. ");
break;
case 3:
lcd_gotoxy(1,1);
printf(lcd_putc,"MIE. ");
break;
case 4:
lcd_gotoxy(1,1);
printf(lcd_putc,"JUE. ");
break;
case 5:
lcd_gotoxy(1,1);
printf(lcd_putc,"VIE. ");
break;
case 6:
lcd_gotoxy(1,1);
printf(lcd_putc,"SAB. ");
break;
case 7:
lcd_gotoxy(1,1);
printf(lcd_putc,"DOM. ");
break;
default:break;
}
lcd_gotoxy(6,1);
printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);// se muestra en pantalla la fecha actualizada
datoday=day;
datomonth=month;
datoyr=yr;
datodow=dow;
funcion_alarma();
if((bit_test(porta,3)==0)&&(bit_test(porta,4)==1)&&(bit_test(porta,5)==1)){ //si se cumplen estas condiciones en los swiches se puede alterar los datos del reloj.se detiene el reloj
horap++;
output_low(pin_c1);
output_high(pin_c0);
delay_ms(100);
switch (horap){
case 1:
funcion_reloj1();
goto programado;
break;
case 2:
funcion_reloj2();
goto programado;
break;
case 3:
funcion_reloj3();
goto programado;
break;
case 4:
horap=0;
break;
default:break;
}
}
else{
if((bit_test(porta,4)==0)&&(bit_test(porta,3)==1)){ //si se cumplen estas condiciones en los swiches se puede alterar los datos de la fecha.se detiene el reloj
horap1++;
output_low(pin_c0);
output_high(pin_c1);
delay_ms(100);
switch (horap1){
case 1:
funcion_fecha1();
goto programado;
break;
case 2:
funcion_fecha2();
goto programado;
break;
case 3:
funcion_fecha3();
goto programado;
break;
case 4:
funcion_fecha4();
goto programado;
break;
case 5:
horap1=0;
break;
default:break;
}
}
}
output_low(pin_c0);// se apaga el led indicador de entrada de datos para el reloj y el reloj corre normal…
output_low(pin_c1);// se apaga el led indicador de entrada de datos para la fecha y el reloj corre normal…
}
}
ESTE ES UNA VISTA DEL PROGRAMA PROBADO EN ISIS PROTEUS:
Autor:
Juan Carlos Lizcano