//*****************************************************************
//Paso No1 (INDICAR QUE TIPO DE MICROCONTROLADOR DE VA A USAR)
#include <16f877A.h>
//*****************************************************************
/*Paso No2 (DEFINIR LOS FUSIBLES DE PROGRAMACION)
LP Low power osc < 200 khz
XT Crystal osc <= 4mhz
HS High speed Osc (> 4mhz)
RC Resistor/Capacitor Osc with CLKOUT
--------------------------------------------------------------------------------
WDT Watch Dog Timer ACTIVADO
NOWDT Watch Dog Timer DESACTIVADO
--------------------------------------------------------------------------------
PUT Power Up Timer ACTIVADO
NOPUT No Power Up Timer DESACTIVADO
--------------------------------------------------------------------------------
PROTECT Codigo de Proteccion de lectura ACTIVADO
NOPROTECT Codigo de Proteccion de lectura DESACTIVADO
--------------------------------------------------------------------------------
DEBUG Modo de depuracion IN-Circuit ACTIVADO
NODEBUG Modo de depuracion IN-Circuit DESACTIVADO
--------------------------------------------------------------------------------
BROWNOUT Reset de bajo voltaje ACTIVADO
NOBROWNOUT Reset de bajo voltaje DESACTIVADO
--------------------------------------------------------------------------------
LVP Programacion de bajo voltaje en B3(PIC16) o B5(PIC18) ACTIVADO
NOLVP Programacion de bajo voltaje en B3(PIC16) o B5(PIC18) DESACTIVADO
--------------------------------------------------------------------------------
CPD Codigo de proteccion para EEPROM ACTIVADO
NOCPD Codigo de proteccion para EEPROM DESACTIVADO
--------------------------------------------------------------------------------
WRT Memoria de programa protegida ACTIVADA
NOWRT Memoria de programa protegida DESACTIVADA
--------------------------------------------------------------------------------
*/
#fuses XT,NOWDT,PUT,NOPROTECT,NODEBUG,BROWNOUT,NOLVP,NOCPD,NOWRT
//*****************************************************************
// Paso No3 (INDICAR CUAL ES LA FRECUENCIA DE TRABAJO)
#use delay(clock=4000000)
//******************************************************************************
// Paso No4 Declarar variables
char seg,min,hor,dia_s,date,mes,ano,control,//Variables para DS1307
unidad=0,decena=0,//Variables para los displays
segundo_0,segundo_1=0,//Para los TIMER
casilla=0,//Posicion de la tabla para la secuencia de leds
analogo=0,//Variable que recive el dato analogo
tiempo,//Variable para llevar conteo de los minutos
T1min,T1max,T2min,T2max,//Variables para controlar temperatura
H1min,H1max,H2min,H2max,//Variables para controlar humedad
grados=0b11011111,//Variable para dibujar el simbolo de grados
cursor=0,cursor2=0;//Variables para saber la funcion de las teclas
int1 pito=0;//Variable para habiitar sonido
//******************************************************************
// Paso No5 Declarar funciones
#include <lcd_serial_A&Z.c>
void correcion(char dato_preg){
if(dato_preg<=99)lcd_putc(" ");
if(dato_preg<=9)lcd_putc(" ");
}
void configuracion(){
printf(lcd_putc,"fPRESIONE QUE VAR
DESEA AJUSTAR "
;
while(input(pin_b0)==0){
//------------------------------------------------------------------------
if(input(pin_b1)==0){cursor=cursor+1;
pito=1;
while(input(pin_b1)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b2)==0){cursor=cursor+2;
pito=1;
while(input(pin_b2)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b3)==0){cursor=cursor+3;
pito=1;
while(input(pin_b3)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b4)==0){cursor=cursor+4;
pito=1;
while(input(pin_b4)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b5)==0){cursor=cursor+5;
pito=1;
while(input(pin_b5)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b6)==0){cursor=cursor+6;
pito=1;
while(input(pin_b6)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b7)==0){cursor=cursor+7;
pito=1;
while(input(pin_b7)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(pito==1){
pito=0;
output_bit(pin_c2,1);
delay_ms(25);
output_bit(pin_c2,0);
delay_ms(100);
}
switch (cursor){
case 1:cursor=0;
break;
case 2:cursor=0;
break;
case 3: printf(lcd_putc,"f TEMPORIZADOR
"
; //TEMPORIZADOR
correcion(tiempo);
printf(lcd_putc,"%umin",tiempo);
cursor=10;
cursor2=3;
break;
case 4: printf(lcd_putc,"fMIN TEMP.1 MAX"
;//TEMPERATURA1
lcd_gotoxy(0,2);
correcion(T1min);
printf(lcd_putc,"%u%cc",T1min,grados);
lcd_gotoxy(11,2);
correcion(T1max);
printf(lcd_putc,"%u%cc",T1max,grados);
cursor=10;
cursor2=4;
break;
case 5: printf(lcd_putc,"fMIN TEMP.2 MAX"
;//TEMPERATURA2
lcd_gotoxy(0,2);
correcion(T2min);
printf(lcd_putc,"%u%cc",T2min,grados);
lcd_gotoxy(11,2);
correcion(T2max);
printf(lcd_putc,"%u%cc",T2max,grados);
cursor=10;
cursor2=5;
break;
case 6: printf(lcd_putc,"fMIN HUME.1 MAX"
;//HUMEDAD1
lcd_gotoxy(0,2);
correcion(H1min);
printf(lcd_putc,"%u%%",H1min);
lcd_gotoxy(11,2);
correcion(H1max);
printf(lcd_putc,"%u%%",H1max);
cursor=10;
cursor2=6;
break;
case 7: printf(lcd_putc,"fMIN HUME.2 MAX"
;//HUMEDAD2
lcd_gotoxy(0,2);
correcion(H2min);
printf(lcd_putc,"%u%%",H2min);
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u%%",H2max);
cursor=10;
cursor2=7;
break;
case 11: //Tecla1 ENTER
break;
case 12: //Tecla1 RETROCEDER
cursor=cursor2-1;
if(cursor<=2)cursor=7;
while(input(pin_b2)==0)delay_cycles(1);
break;
case 13: //Tecla1 AVANZAR
cursor=cursor2+1;
if(cursor>=8)cursor=3;
while(input(pin_b3)==0)delay_cycles(1);
break;
case 14: //Tecla1 DECREMENTAR MINIMO
cursor=10;
switch(cursor2){
case 3: //DECREMENTAR MINIMO temporizador
tiempo=tiempo-1;
lcd_gotoxy(0,2);
correcion(tiempo);
printf(lcd_putc,"%u",tiempo);
write_eeprom (0,tiempo);
break;
case 4: //DECREMENTAR MINIMO Temperatura1
T1min=T1min-1;
if(T1min>=101)T1min=T1max-1;
lcd_gotoxy(0,2);
correcion(T1min);
printf(lcd_putc,"%u",T1min);
write_eeprom (1,T1min);
break;
case 5: //DECREMENTAR MINIMO Temperatura2
T2min=T2min-1;
if(T2min>=101)T2min=T2max-1;
lcd_gotoxy(0,2);
correcion(T2min);
printf(lcd_putc,"%u",T2min);
write_eeprom (3,T2min);
break;
case 6: //DECREMENTAR MINIMO Humedad1
H1min=H1min-1;
if(H1min>=101)H1min=H1max-1;
lcd_gotoxy(0,2);
correcion(H1min);
printf(lcd_putc,"%u",H1min);
write_eeprom (5,H1min);
break;
case 7: //DECREMENTAR MINIMO Humedad2
H2min=H2min-1;
if(H2min>=101)H2min=H2max-1;
lcd_gotoxy(0,2);
correcion(H2min);
printf(lcd_putc,"%u",H2min);
write_eeprom (7,H2min);
break;
}//switch(cursor2)
break;
case 15: //Tecla1 INCREMENTAR MINIMO
cursor=10;
switch(cursor2){
case 3: //INCREMENTAR MINIMO Temporizador
tiempo=tiempo+1;
lcd_gotoxy(0,2);
correcion(tiempo);
printf(lcd_putc,"%umin",tiempo);
write_eeprom (0,tiempo);
break;
case 4: //INCREMENTAR MINIMO Temperatura1
T1min=T1min+1;
if(T1min>=(T1max))T1min=0;
lcd_gotoxy(0,2);
correcion(T1min);
printf(lcd_putc,"%u",T1min);
write_eeprom (1,T1min);
break;
case 5: //INCREMENTAR MINIMO Temperatura2
T2min=T2min+1;
if(T2min>=(T2max))T2min=0;
lcd_gotoxy(0,2);
correcion(T2min);
printf(lcd_putc,"%u",T2min);
write_eeprom (3,T2min);
break;
case 6: //INCREMENTAR MINIMO Humedad1
H1min=H1min+1;
if(H1min>=(H1max))H1min=0;
lcd_gotoxy(0,2);
correcion(H1min);
printf(lcd_putc,"%u",H1min);
write_eeprom (5,H1min);
break;
case 7: //INCREMENTAR MINIMO Humedad2
H2max=H2max-1;
if(H2max<=(H2min+1))H2max=H2min+1;
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u",H2max);
write_eeprom (8,H2max);
break;
}
break;
case 16: //Tecla1 DECREMENTAR MAXIMO
cursor=10;
switch(cursor2){
case 4: //DECREMENTAR MAXIMO Temperatura1
T1max=T1max-1;
if(T1max<=(T1min))T1max=100;
lcd_gotoxy(11,2);
correcion(T1max);
printf(lcd_putc,"%u",T1max);
write_eeprom (2,T1max);
break;
case 5: //DECREMENTAR MAXIMO Temperatura2
T2max=T2max-1;
if(T2max<=(T2min))T2max=100;
lcd_gotoxy(11,2);
correcion(T2max);
printf(lcd_putc,"%u",T2max);
write_eeprom (4,T2max);
break;
case 6: //DECREMENTAR MAXIMO Humedad1
H1max=H1max-1;
if(H1max<=(H1min))H1max=100;
lcd_gotoxy(11,2);
correcion(H1max);
printf(lcd_putc,"%u",H1max);
write_eeprom (6,H1max);
break;
case 7: //DECREMENTAR MAXIMO Humedad2
H2max=H2max-1;
if(H2max<=(H2min))H2max=100;
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u",H2max);
write_eeprom (8,H2max);
break;
}//switch(cursor2)
break;
case 17: //Tecla1 INCREMENTAR MAXIMO
cursor=10;
switch(cursor2){
case 4: //INCREMENTAR MAXIMO Temperatura1
T1max=T1max+1;
if(T1max>=100)T1max=T1min+1;
lcd_gotoxy(11,2);
correcion(T1max);
printf(lcd_putc,"%u",T1max);
write_eeprom (2,T1max);
break;
case 5: //INCREMENTAR MAXIMO Temperatura2
T1max=T1max+1;
if(T1max>=100)T1max=T1min+1;
lcd_gotoxy(11,2);
correcion(T2max);
printf(lcd_putc,"%u",T2max);
write_eeprom (4,T2max);
break;
case 6: //INCREMENTAR MAXIMO Humedad1
H1max=H1max+1;
if(H1max>=100)H1max=H1min+1;
lcd_gotoxy(11,2);
correcion(H1max);
printf(lcd_putc,"%u",H1max);
write_eeprom (6,H1max);
break;
case 7: //INCREMENTAR MAXIMO Humedad2
H2max=H2max+1;
if(H2max>=100)H2max=H2min+1;
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u",H2max);
write_eeprom (8,H2max);
break;
}//switch(cursor2)
break;
}//switch (cursor)
}//while(input(pin_b0)==0)
}//void configuracion()
//*****************************************************************
/*Paso No6 (Determinar si se quiere programacion de puertos rapido, fijo, auto)
#use fast_io( )
#use fixed_io( )
#use standard_io( )
*/
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
//*****************************************************************
//Paso No7 Programa
void main(void){
set_tris_a(0b00000101);
set_tris_b(0b11111111);
set_tris_c(0b10000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
//------------------------------------------------------------------------------
output_a(0b00110000);//Dato de arranque en el puerto
output_c(0);//Dato de arranque en el puerto
output_d(0);//Dato de arranque en el puerto
//------------------------------------------------------------------------------
setup_adc(ADC_CLOCK_DIV_32); //Divisor de frecuencia del moulo ADC.
setup_adc_ports (ALL_ANALOG);//Apaga puertos del modulo conversor ADC.
//------------------------------------------------------------------------------
tiempo=read_eeprom (0);
T1min=read_eeprom (1);
T1max=read_eeprom (2);
T2min=read_eeprom (3);
T2max=read_eeprom (4);
H1min=read_eeprom (5);
H1max=read_eeprom (6);
H2min=read_eeprom (7);
H2max=read_eeprom (
;
//------------------------------------------------------------------------------
lcd_init(); //Inicializa pantalla LCD
//------------------------------------------------------------------------------
if (input(pin_b0)==0) configuracion();
//------------------------------------------------------------------------------
printf(lcd_putc,"T1: %cc H1: %%
T2: %cc H2: %%",Grados,Grados);
//------------------------------------------------------------------------------
output_bit(pin_c2,1);
delay_ms(25);
output_bit(pin_c2,0);
delay_ms(25);
//-----------------------------------------------------------------------------
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
//enable_interrupts(int_timer0); //Habilita interrupcion por desborde TMR1
setup_timer_1(t1_internal|t1_div_by_8);//Configura el TMR1 cada 0.5 segundos
enable_interrupts(int_timer1); //Habilita interrupcion por desborde TMR1
//enable_interrupts(int_rda); //Habilita interrupcion por llegada de dato RS232
enable_interrupts(global); //Habilita interrupcion global
//------------------------------------------------------------------------------
while (1){
delay_cycles(1);//Espero a que ocurra alguna interrupcion
}
}
//*****************************************************************
//Paso No8 Interrupciones
#int_timer1
void actualiza_RTC(){
disable_interrupts(global); //deshabilita interrupcion global
//----------------------------------------
set_adc_channel(0);
set_adc_channel(0);
analogo = read_adc();
analogo=analogo*0.196; //Temperatura1
lcd_gotoxy(3,1);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
set_adc_channel(2);
set_adc_channel(2);
analogo = read_adc();
analogo=analogo*0.392; //Humedad1
lcd_gotoxy(12,1);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
set_adc_channel(0);
set_adc_channel(0);
analogo = read_adc();
analogo=analogo*0.196; //Temperatura2
lcd_gotoxy(3,2);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
set_adc_channel(2);
set_adc_channel(2);
analogo = read_adc();
analogo=analogo*0.392; //Humedad2
lcd_gotoxy(12,2);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
enable_interrupts(global); //Habilita interrupcion global
}