#include <16f873a.h>
#device adc=10 //10 bits de resolucion
#FUSES xt,NOWDT,NOPROTECT,NOLVP,NOPUT,BROWNOUT //funcionamiento
#use delay (clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)//libreria par el manejo del puerto serie a 9600 baudios
#include "lcd.c"
/////////////////////////////////////
////////// FUNCIONES ///////////////
///////////////////////////////////
void inicializacion(void);
void com_ser(void);
void teclado(void);
//////////////////////////////////
//// Inicializacion Pines ///////
////////////////////////////////
#bit porta_2=0x05.2
#bit portc_0=0x07.0
#bit portc_4=0x07.4
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte adcon1=0x009f
///////////////////////////////
//////// Variables ///////////
/////////////////////////////
float valor,temp=0;
long set;
int cad[16],set_point=0;
int i=1; //contador para desplegar caracteres en lcd
////////////////////////////
////////ejecucion//////////
//////////////////////////
void inicializacion()
{
set_tris_a(0b00001011); // AN0, AN1 y AN3 son entradas
set_tris_c(0b10010000);
adcon1=(0b00000100); //conf del adcon1
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
porta=0x00; //todos los puertos inicializan en 0
portb=0x00;
portc=0x00;
}
void main()
{
inicializacion(); //funcion de inicializacion
porta_2=1; //led de encendido
lcd_gotoxy(4,1);lcd_putc("Bienvenidos \n\r");
delay_ms(2000);
for( ;; )
{
set_adc_channel(0); //se habilita el canal analog 0
valor=read_adc(); //se toma la lectura del canal 0
temp=500*valor/1024; //ecuacion para temperatura
printf(lcd_putc,"\fTemp=%0.1fºC", temp);
delay_ms(100);
com_ser(); //llamado para la comunicacion serie
if(portc_4==1) //interruptor para ingresar el set point x teclado
teclado(); //funcion para uso del teclado
delay_ms(1000);
}
}
void teclado()
{
inicializacion();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc(" ");
delay_ms(10);
lcd_putc("set point y +\r\n");
set_adc_channel(1); //lectura desde
set=read_adc(); //el teclado
if((set>613)&(set<625)) //condicion para ON/C
{
lcd_gotoxy(i,2);
lcd_putc('\f');delay_ms(40); //limpia la LCD
i=1;
}
if((set>423)&(set<431)) //Condicion para 0
{
lcd_gotoxy(i,2);
lcd_putc('0');delay_ms(200);
i=i+1;
}
if((set>271)&(set<277)) //condicion para +
{
if((cad[1]>0)&(cad[2]!=false)) // esto me funciona bien pero q pasa si cad[2] es igual a 0
{
set_point=(cad[1]*10)+cad[2];
lcd_gotoxy(1,1);
printf(lcd_putc,"\fTemp=%dºC", set_point);
delay_ms(2000);
}
if((cad[2]==false))
{
set_point=cad[1];
lcd_gotoxy(1,1);
printf(lcd_putc,"\fTemp=%dºC", set_point);
delay_ms(2000);
}
}
if((set>658)&(set<663)) //condicion para 1
{
cad[i]=1;
lcd_gotoxy(i,2);
lcd_putc('1');delay_ms(200);
i=i+1;
}
if((set>443)&(set<449)) //condicion para 2
{
cad[i]=2;
lcd_gotoxy(i,2);
lcd_putc('2');delay_ms(200);
i=i+1;
}
if((set>343)&(set<347)) //condicion para 3
{
cad[i]=3;
lcd_gotoxy(i,2);
lcd_putc('3');delay_ms(200);
i=i+1;
}
if((set>280)&(set<284)) //condicion para -
{
lcd_gotoxy(i,2);
lcd_putc('-');delay_ms(200);
i=i+1;
}
if((set>690)&(set<696)) //condicion para 4
{
lcd_gotoxy(i,2);
lcd_putc('4');delay_ms(200);
i=i+1;
}
if((set>458)&(set<462)) //condicion para 5
{
lcd_gotoxy(i,2);
lcd_putc('5');delay_ms(200);
i=i+1;
}
if((set>350)&(set<356)) //condicion para 6
{
lcd_gotoxy(i,2);
lcd_putc('6');delay_ms(200);
i=i+1;
}
if((set>748)&(set<755)) //condicion para 7
{
lcd_gotoxy(i,2);
lcd_putc('7');delay_ms(200);
i=i+1;
}
if((set>480)&(set<489)) //condicion para 8
{
lcd_gotoxy(i,2);
lcd_putc('8');delay_ms(200);
i=i+1;
}
if((set>365)&(set<371)) //condicion para 9
{
lcd_gotoxy(i,2);
lcd_putc('9');delay_ms(200);
i=i+1;
}
}
}
void com_ser()
{
portc_0=1;
set_adc_channel(0);
valor=read_adc();
temp=500*valor/1024;
printf("Temperatura=%01.2fºC\r\n",temp);
delay_ms(300);
portc_0=0;
}