#include <16F887.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES PUT                      //Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#use delay(int=4000000)
#byte port_A=0x05
#byte port_B=0x06
#byte port_C=0x07 
#byte port_D=0x08
int1 Prog=0;
int8 DHora=0,DMinutos=0,UHora=0,UMinutos=0,Hora,Minutos,segundos,Seleccion=5;
int8 dia=1,Mes=1,Anio=5,dow=1;
#include <ds1307.c>  
#include <flex_lcd.c>
void ActualizaHora()
{
   enable_interrupts(int_ext);
   ds1307_get_time(Hora,Minutos,segundos);
   DHora=hora/10;
   UHora=hora%10;
   DMinutos=minutos/10;
   UMinutos=minutos%10;
   lcd_gotoxy(1,1); 
   printf(lcd_putc,"%d",Dhora);
   printf(lcd_putc,"%d",Uhora);
   lcd_gotoxy(4,1);
   printf(lcd_putc,"%d",Dminutos);
   printf(lcd_putc,"%d",Uminutos);
}
void ActualizarPrograma()
{
   disable_interrupts(int_ext);
   ds1307_set_date_time(dia,Mes,Anio,dow,Hora,Minutos,segundos); 
   lcd_gotoxy(1,1); 
   printf(lcd_putc,"%d",Dhora);
   printf(lcd_putc,"%d",Uhora);
   lcd_gotoxy(4,1);
   printf(lcd_putc,"%d",Dminutos);
   printf(lcd_putc,"%d",Uminutos);
}
#int_TIMER1
void  TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1  
{
if(!(bit_test(port_C,4)))Prog=!Prog;
if(!(bit_test(port_D,2)))
   {
   Seleccion++;
   if(Seleccion==6)Seleccion=1;
   }
if((!(bit_test(port_D,3)))&&(Seleccion==1))
   {  
   DHora++;
   if(DHora=3)DHora=0;
   }
if((!(bit_test(port_D,3)))&&(Seleccion==2))
   {  
   UHora++;
   if(UHora=10)UHora=0;
   }
if((!(bit_test(port_D,3)))&&(Seleccion==3))
   {  
   DMinutos++;
   if(DMinutos=6)DMinutos=0;
   }
if((!(bit_test(port_D,3)))&&(Seleccion==4))
   {  
   UMinutos++;
   if(UMinutos=10)UMinutos=0;
   }
   if(Seleccion==5)
   {
   Hora=DHora*10+UHora;
   Minutos=DMinutos*10+UMinutos;
   }
set_timer1(0x0BDC);//carga del TMR1
}
#int_ext
void int_ext_isr(){
if(Prog==0)ActualizaHora();
else ActualizarPrograma();
    
   }
void PlantillaHora()
{
   lcd_gotoxy(1,1); 
   printf(lcd_putc,"%d",Dhora);
   printf(lcd_putc,"%d",Uhora);  
   printf(lcd_putc,":");
   printf(lcd_putc,"%d",Dminutos);
   printf(lcd_putc,"%d",Uminutos);  
}
void Programar()
{
if(Prog==1)
   {
   lcd_gotoxy(6,1);
   printf(lcd_putc,"  P");
   }
if(Seleccion==1)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"?");
   }
if(Seleccion==2)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc," ?");
   }
if(Seleccion==3)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"   ?");
   }
if(Seleccion==4)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"    ?");
   }
if(Seleccion==5)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"     ");
   }
}
void Normal()
{
if(Prog==0)
   {
   lcd_gotoxy(6,1);
   printf(lcd_putc,"  N");
   }
if(Seleccion==1)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"?");
   }
if(Seleccion==2)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc," ?");
   }
if(Seleccion==3)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"   ?");
   }
if(Seleccion==4)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"    ?");
   }
if(Seleccion==5)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"     ");
   }
}
void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 ); //Para poder generar 200ms
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   set_timer1(0x0BDC);//set_timer(0x0BDC);//carga del TMR1
   enable_interrupts(INT_TIMER1);
   ext_int_edge(l_to_h);
   enable_interrupts(int_ext);
   enable_interrupts(GLOBAL);
   set_tris_a(0xFF); 
   set_tris_b(0x01);
   set_tris_c(0xF0); 
   set_tris_d(0xFF); //
   set_tris_e(0xFF); 
   output_low(PIN_B3);
   delay_ms(500);
   lcd_init();
   ds1307_init();
   ds1307_OUT();
   PlantillaHora();
   while(1){
   if(Prog==1)Programar();else Normal();
   }
}
