#include	<18F2550.h>
#include	<STRING.h>


#fuses	HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN,CPUDIV1
#use     	delay   (clock=4000000)

#include 	<_ds1307.h>
#include 	<DS1621.h>
#include	<flex_lcd.h>

short	seg_si;
int		sec;
int		min;
int	 	hrs;
int		day;
int		month;
int	 	yr;
int		Pmenu;
int		minI;
int	 	hrsI;
int		dayI;
int		monthI;
int	 	yrI;
int		con_tim;
float	Tempe;
char		dow;
char 	sdow[11];

#define	Tmenu	PIN_A0
#define	Tmas		PIN_A1
#define	Tmenos	PIN_A2

#INT_TIMER0
void		timer0()
{	
	SET_TIMER0(0x87);
	con_tim++;
	if	(con_tim>=254)
		{
			con_tim=0x00;
			seg_si=1;
		}
}
void lee_time(void)
{
	ds1307_get_day_of_week((char*) sdow);
   	ds1307_get_date(day,month,yr,dow);
	ds1307_get_time(hrs,min,sec);
   	lcd_putc("\f");
   	printf(lcd_putc,"\%02d/\%02d/\%02d ",day,month,yr);
   	lcd_gotoxy(1,2);
   	printf(lcd_putc,"\%02d:\%02d:\%02d", hrs,min,sec);
}
void	main		(void)
{
	SETUP_TIMER_0(RTCC_DIV_32|RTCC_INTERNAL|RTCC_8_BIT);
	SET_TIMER0(0x87);
	enable_interrupts(global);
	enable_interrupts(INT_TIMER0);
	setup_timer_1(T1_DISABLED);
	setup_timer_2(T2_DISABLED,0,1);
	setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
	setup_adc_ports(NO_ANALOGS|VSS_VDD);
	setup_adc(ADC_OFF);
	setup_spi(FALSE);
	setup_comparator(NC_NC_NC_NC);
	setup_vref(FALSE);
	port_b_pullups(FALSE);
	setup_wdt(WDT_OFF);
	setup_oscillator(False);
	set_tris_A(11111111);	    
	
	lcd_init();	
	lcd_gotoxy(1,1);
	lcd_putc("Esperar");
	delay_ms(2000);	
	lee_time();
   	
   	while	(true)
	{
		if	(seg_si==1)
			{
				seg_si=0;
				if	(Pmenu==0)
					{
						ds1307_get_time(hrs,min,sec);
   						lcd_gotoxy(1,2);
   						printf(lcd_putc,"\%02d:\%02d:\%02d",hrs,min,sec);
   						lcd_gotoxy(12,2);
  						tempe = read_low_temp();
      					tempe=((tempe-32)/(18*0.1))/1.5;
     					printf(lcd_putc,"%fC",tempe);
 					}
   			}		
		if	(input(Tmenu))
   			{
	   			while	(input(Tmenu))
	   				{
	   				}
   				delay_ms(200);
   				if	(Pmenu==0)
   					{
   						Pmenu=1;
   						lcd_putc("\f");
   						lcd_gotoxy(1,1);
   						lcd_putc("Minuto");
   						ds1307_get_time(hrs,min,sec);
   						minI=min;
   						lcd_gotoxy(1,2);
   						printf(lcd_putc,"%02d",minI);
   						goto	fin;   					
   					}
   				if	(Pmenu==1)
   					{
   						Pmenu=2;
   						lcd_putc("\f");
   						lcd_gotoxy(1,1);
   						lcd_putc("Hora");
   						ds1307_get_time(hrs,min,sec);
   						hrsI=hrs;
   						lcd_gotoxy(1,2);
   						printf(lcd_putc,"%02d",hrsI);
   						goto	fin;   					
   					}
   				if	(Pmenu==2)
   					{
   						Pmenu=3;
   						lcd_putc("\f");
   						lcd_gotoxy(1,1);
   						lcd_putc("Dia");
   						ds1307_get_time(hrs,min,sec);
   						dayI=day;
   						lcd_gotoxy(1,2);
   						printf(lcd_putc,"%02d",dayI);
   						goto	fin;   					
   					}
   				if	(Pmenu==3)
   					{
   						Pmenu=4;
   						lcd_putc("\f");
   						lcd_gotoxy(1,1);
   						lcd_putc("Mes");
   						ds1307_get_time(hrs,min,sec);
   						monthI=month;
   						lcd_gotoxy(1,2);
   						printf(lcd_putc,"%02d",monthI);
   						goto	fin;   					
   					}
   				if	(Pmenu==4)
   					{
   						Pmenu=5;
   						lcd_putc("\f");
   						lcd_gotoxy(1,1);
   						lcd_putc("Ano");
   						ds1307_get_time(hrs,min,sec);
   						yrI=yr;
   						lcd_gotoxy(1,2);
   						printf(lcd_putc,"%02d",yrI);
   						goto	fin;   					
   					}  					
   				if (Pmenu==5)
   					{
	   					Pmenu=0; 
   						lee_time();
   					}
   				fin:
   					{
   					}
   			}		
   		if	(input(Tmas))
   			{
	   			while	(input(Tmas))
	   				{
	   				}
   				delay_ms(200);
   				if	(Pmenu==1)
   					{
   						if	(minI!=59)
   							{
   								minI++;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",minI);   								
   								ds1307_set_date_time(day,month,yr,dow,hrs,minI,sec);
   							}	
   						if	(minI==59)
   							{
   								minI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",minI);
   								ds1307_set_date_time(day,month,yr,dow,hrs,minI,sec);
   							}
   					}
   				if	(Pmenu==2)
   					{
   						if	(hrsI!=23)
   							{
   								hrsI++;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",hrsI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrsI,min,sec);
   							}	
   						if	(hrsI==23)
   							{
   								hrsI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",hrsI);
   								ds1307_set_date_time(day,month,yr,dow,hrsI,min,sec);
   							}
   					}
   				if	(Pmenu==3)
   					{
   						if	(dayI!=31)
   							{
   								dayI++;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",dayI);
   								ds1307_set_date_time(dayI,month,yr,dow,hrs,min,sec);
   							}	
   						if	(dayI==31)
   							{
   								dayI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",dayI);
   								ds1307_set_date_time(dayI,month,yr,dow,hrs,min,sec);
   							}
   					}
   				if	(Pmenu==4)
   					{
   						if	(monthI!=12)
   							{
   								monthI++;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",monthI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrs,min,sec);
   							}	
   						if	(monthI==12)
   							{
   								monthI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",monthI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrs,min,sec);
   							}
   					}
   				if	(Pmenu==5)
   					{
   						if	(yrI!=99)
   							{
   								yrI++;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",yrI);
   								ds1307_set_date_time(day,month,yrI,dow,hrs,min,sec);
   							}	
   						if	(yrI==99)
   							{
   								yrI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",yrI);
   								ds1307_set_date_time(day,month,yrI,dow,hrs,min,sec);
   							}
   					}
   			}
   		if	(input(Tmenos))
   			{
	   			while	(input(Tmenos))
	   				{
	   				}
   				delay_ms(200);
   				if	(Pmenu==1)
   					{
   						if	(minI!=0)
   							{
   								minI--;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",minI);
   								ds1307_set_date_time(day,month,yr,dow,hrs,minI,sec);
   							}	
   						if	(minI==0)
   							{
   								minI=59;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",minI);
   								ds1307_set_date_time(day,month,yr,dow,hrs,minI,sec);
   							}
   					}
   				if	(Pmenu==2)
   					{
   						if	(hrsI!=0)
   							{
   								hrsI--;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",hrsI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrsI,min,sec);
   							}	
   						if	(hrsI==0)
   							{
   								hrsI=23;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",hrsI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrsI,min,sec);
   							}
   					}
   				if	(Pmenu==3)
   					{
   						if	(dayI!=0)
   							{
   								dayI--;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",dayI);
   								ds1307_set_date_time(dayI,month,yr,dow,hrs,min,sec);
   							}	
   						if	(dayI==0)
   							{
   								dayI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",dayI);
   								ds1307_set_date_time(dayI,month,yr,dow,hrs,min,sec);
   							}
   					}
   				if	(Pmenu==4)
   					{
   						if	(monthI!=0)
   							{
   								monthI--;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",monthI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrs,min,sec);
   							}	
   						if	(monthI==0)
   							{
   								monthI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",monthI);
   								ds1307_set_date_time(day,monthI,yr,dow,hrs,min,sec);
   							}
   					}
   				if	(Pmenu==5)
   					{
   						if	(yrI!=0)
   							{
   								yrI--;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",yrI);
   								ds1307_set_date_time(day,month,yrI,dow,hrs,min,sec);
   							}	
   						if	(yrI==0)
   							{
   								yrI=0;
   								lcd_gotoxy(1,2);
   								printf(lcd_putc,"%02d",yrI);
   								ds1307_set_date_time(day,month,yrI,dow,hrs,min,sec);
   							}
   					}
   			}    	
   	}	
}
