#include <16f877a.h>
#device *=16
#device adc=8
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20M)
//#include "lcd.c"
#include<onewire.c>
#include<lcdmio.c>
#include<ds18b20.c>
#use standard_io (D)
#use fast_io (c)
#use fast_io (b)
#use i2c(MASTER, SDA=PIN_c4, SCL=PIN_c3,slow)
//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07
#define RB0 PIN_B0
#define RA4 PIN_A4
//DS1307
//Vbat a tierra
//// Declarando variables////////
int16 retardo; //Cada cuando actualiza lectura en LCD
//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;
void sethora()
{
//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
//i2c_write(day);
//i2c_write(date);
//i2c_write(month);
//i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha
}
void setfecha()
{
//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_date); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
//i2c_write(seconds);
//i2c_write(minutes);
//i2c_write(hours);
//i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha
}
void cheqhr()
{
if(hours==0x0a)hours=0x10;
if(hours==0x1a)hours=0x20;
if(hours==0x24)hours=0x00;
}
void cheqmin()
{
if(minutes==0x0a)minutes=0x10;
if(minutes==0x1a)minutes=0x20;
if(minutes==0x2a)minutes=0x30;
if(minutes==0x3a)minutes=0x40;
if(minutes==0x4a)minutes=0x50;
if(minutes==0x5a)minutes=0x00;
}
void cheqday()
{
if(date==0x0a)date=0x10;
if(date==0x1a)date=0x20;
if(date==0x2a)date=0x30;
if(date==0x32)date=0x01;
}
void cheqmon()
{
if(month==0x0a)month=0x10;
if(month==0x13)month=0x01;
}
void cheqyear()
{
if(year==0x1a)year=0x20;
if(year==0x21)year=0x10;
}
void main(void)
{
float temperature;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);
set_tris_A(0b00010001);
set_tris_B(0b00000001);
////Inicializando valores/////
retardo=50; //ms a tardar entre lectura y lectura
//var1=0;
/*
//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x00;
hours = 0x12; //modo 24 hrs
day = 0x01; //1 es domingo
date = 0x01;
month = 0x01;
year = 0x10;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada
*/
//Rutina LCD
lcd_init(); //Inicia LCD
lcd_putc("\f"); //Limpia LCD
lcd_putc("FACULTAD DE\n"); //rtc
lcd_putc("INGENIERIA");
delay_ms(1000);
lcd_putc("\f"); //Limpia LCD
lcd_putc("INGENIERIA\n"); //rtc
lcd_putc("MECATRONICA");
delay_ms(1000);
lcd_putc("\f"); //Limpia LCD
lcd_putc("INSTRUMENTACION\n"); //rtc
lcd_putc("Y CONTROL");
delay_ms(1000);
lcd_putc("\f"); //Limpia LCD
lcd_putc("PROYECTO\n"); //rtc
lcd_putc("FINAL");
delay_ms(1000);
lcd_putc("\f"); //Limpia LCD
lcd_putc("LUIS ENRIQUE\n"); //rtc
lcd_putc("CABRERA");
delay_ms(1500);
lcd_putc("\f"); //Limpia LCD
lcd_putc("JUAN JOSE\n"); //rtc
lcd_putc("BAZ");
delay_ms(1500);
lcd_putc("\f"); //Limpia LCD
lcd_putc("JUAN ELIAS\n"); //rtc
lcd_putc("CUEVAS");
delay_ms(1500);
/////////////saludo
lcd_putc("\f"); //Limpia LCD
lcd_putc("Bienvenido\n");
lcd_putc("pres-->RA4");
saludo:
if (input(RA4)==0)
{
saludoI:
if (input(RA4)==1)goto textmenu1;
goto saludoI;
}
goto saludo;
textmenu1:
lcd_putc("\f"); //Limpia LCD
lcd_putc("1. Reloj\n");
lcd_putc("RBO->in RA4->sig");
menu1:
if (input(RB0)==0)
{
menu1I:
if (input(RB0)==1)goto texthora;
goto menu1I;
}
if (input(RA4)==0)
{
menu1I2:
if (input(RA4)==1)goto textmenu2;
goto menu1I2;
}
goto menu1;
textmenu2:
lcd_putc("\f"); //Limpia LCD
lcd_putc("2. Fecha\n");
lcd_putc("RBO->in RA4->sig");
menu2:
if (input(RB0)==0)
{
menu2I:
if (input(RB0)==1)goto textfecha;
goto menu2I;
}
if (input(RA4)==0)
{
menu2I2:
if (input(RA4)==1)goto textmenu3;
goto menu2I2;
}
goto menu2;
textmenu3:
lcd_putc("\f"); //Limpia LCD
lcd_putc("3. Temperatura\n");
lcd_putc("RBO->in RA4->sig");
menu3:
if (input(RB0)==0)
{
menu3I:
if (input(RB0)==1)goto texttemp;
goto menu3I;
}
if (input(RA4)==0)
{
menu3I2:
if (input(RA4)==1)goto textmenu1;
goto menu3I2;
}
goto menu3;
texthora:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>out RA4>conf");
hora:
if (input(RB0)==0)
{
horaI:
if (input(RB0)==1)goto textmenu1;
goto horaI;
}
if (input(RA4)==0)
{
horaI2:
if (input(RA4)==1)goto textconfhr;
goto horaI2;
}
delay_ms(retardo); //Usuario lee
//Obtiene datos de DS1307
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
i2c_stop();
i2c_start();
i2c_write(0xd1); //Lee DS1307
seconds = i2c_read();
minutes = i2c_read();
hours = i2c_read();
day = i2c_read();
date = i2c_read();
month = i2c_read();
year = i2c_read(0); //no ack
i2c_stop();
//Representa datos en la LCD
//printf(lcd_putc,"\f%2x-%2x-20%2x\n",date,month,year); //dd-mm-year
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
goto hora;
textfecha:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>out RA4>conf");
fecha:
if (input(RB0)==0)
{
fechaI:
if (input(RB0)==1)goto textmenu2;
goto fechaI;
}
if (input(RA4)==0)
{
fechaI2:
if (input(RA4)==1)goto textconfday;
goto fechaI2;
}
delay_ms(retardo); //Usuario lee
//Obtiene datos de DS1307
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
i2c_stop();
i2c_start();
i2c_write(0xd1); //Lee DS1307
seconds = i2c_read();
minutes = i2c_read();
hours = i2c_read();
day = i2c_read();
date = i2c_read();
month = i2c_read();
year = i2c_read(0); //no ack
i2c_stop();
//Representa datos en la LCD
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x-%2x-20%2x",date,month,year); //dd-mm-year
//printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
goto fecha;
texttemp:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>out");
temp:
if (input(RB0)==0)
{
tempI:
if (input(RB0)==1)goto textmenu3;
goto tempI;
}
temperature = ds1820_read();
lcd_gotoxy(1,1);
printf(lcd_putc,"TEMP: %3.1f ", temperature);
lcd_putc(223);
lcd_putc("C ");
/* lcd_gotoxy(1,2);
if(temperature >= 29.0)
printf(lcd_putc,"Hot! ");
else if( temperature >= 20 && temperature < 29.0)
printf(lcd_putc,"Comfort!");
else
printf(lcd_putc,"Cold! "); */
goto temp;
/////////////////////////////////////////////////////////////////////////////7
textconfhr:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>hrs+ RA4>sig");
confhr:
cheqhr();
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x-%2x-%2x",hours,minutes,seconds);
if (input(RB0)==0)
{
confhrI:
if (input(RB0)==1)
{
hours++;
goto confhr;
}
goto confhrI;
}
if (input(RA4)==0)
{
confhrI2:
if (input(RA4)==1)goto textconfmin;
goto confhrI2;
}
goto confhr;
textconfmin:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>min+ RA4>out");
confmin:
cheqmin();
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x-%2x-%2x",hours,minutes,seconds);
if (input(RB0)==0)
{
confminI:
if (input(RB0)==1)
{
minutes++;
goto confmin;
}
goto confminI;
}
if (input(RA4)==0)
{
confminI2:
if (input(RA4)==1)
{
sethora();
goto texthora;
}
goto confminI2;
}
goto confmin;
textconfday:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>day+ RA4>sig");
confday:
cheqday();
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x-%2x-20%2x",date,month,year);
if (input(RB0)==0)
{
confdayI:
if (input(RB0)==1)
{
date++;
goto confday;
}
goto confdayI;
}
if (input(RA4)==0)
{
confdayI2:
if (input(RA4)==1)goto textconfmon;
goto confdayI2;
}
goto confday;
textconfmon:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>mon+ RA4>sig");
confmon:
cheqmon();
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x-%2x-20%2x",date,month,year);
if (input(RB0)==0)
{
confmonI:
if (input(RB0)==1)
{
month++;
goto confmon;
}
goto confmonI;
}
if (input(RA4)==0)
{
confmonI2:
if (input(RA4)==1)goto textconfyear;
goto confmonI2;
}
goto confmon;
textconfyear:
lcd_putc("\f"); //Limpia LCD
lcd_putc("\n");
lcd_putc("RBO>año+ RA4>out");
confyear:
cheqyear();
lcd_gotoxy(1,1);
printf(lcd_putc,"%2x-%2x-20%2x",date,month,year);
if (input(RB0)==0)
{
confyearI:
if (input(RB0)==1)
{
year++;
goto confyear;
}
goto confyearI;
}
if (input(RA4)==0)
{
confyearI2:
if (input(RA4)==1)
{
setfecha();
goto textfecha;
}
goto confyearI2;
}
goto confyear;
}