//Este programa controla el funcionamiento de una fuente de frio,la temperatura de encendido se puede
//programar por teclado.

#include <16f877A.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#include<flex_lcd.c>
//#include <lcd.c>
#byte portb=6
//#include <Rutina escaneo de teclado 4x3 en C.c>
#use fast_io(D)


int  TECLA_PULSADA;
int  umbral_encendido,digitos;
float const P=0.002219;               //P=(5-2.73)/1023
float voltaje,temperatura;            //Declaro estas variables como globales.
unsigned long int bin_lectura;        //Si bien trabajare con un dato entero de 10 bits.

char escan_teclado()
{
     int tecla=44;
     int i=0;
     int vect[5]={0x0E,0x0D,0x0B,0x07,0};
     int matriz_teclado[4][3]={1,2,3,4,5,6,7,8,9,0,0,0};

     while(i<4)
          {
          portb=vect[i]; 
          if(!input(PIN_B4))
                {
                 tecla=0;
                 tecla=matriz_teclado[i][tecla];
                }
          if(!input(PIN_B5))
                {
                 tecla=1;
                 tecla=matriz_teclado[i][tecla];
                } 
          if(!input(PIN_B6))
                {
                 tecla=2;
                 tecla=matriz_teclado[i][tecla];
                }
          i++;     
          }      
     return(tecla);
} 

#int_rb   //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente. 
void exploracion_teclado(void)
{
port_b_pullups(TRUE);
digitos=0;
    while(digitos<2)   
    {
    while(escan_teclado()!=0x2c)
      {
    TECLA_PULSADA=escan_teclado();
      if(digitos==0)
      {
      printf(lcd_putc,"\fAIR ON C=%d",TECLA_PULSADA);
      umbral_encendido=TECLA_PULSADA;
      umbral_encendido*=10;
      }
      else   
      {   
      printf(lcd_putc,"%d",TECLA_PULSADA);
      delay_ms(1000);
      umbral_encendido+=TECLA_PULSADA;
         if(umbral_encendido<20 || umbral_encendido>30)
         {
         printf(lcd_putc,"\f-ERROR-");
         delay_ms(1000);
         printf(lcd_putc,"\fRANGO:20/30 C");
         delay_ms(1000);
         umbral_encendido=25;
         }
      }
    delay_ms(1000);   
    ++digitos;
      }
    }
    portb=0x00;
    lcd_gotoxy(1,1);
    lcd_putc("\fTEMPE. C= ");            //("\fTEMPE. C= ")original
    lcd_gotoxy(1,2);
    lcd_putc("AIR ON C= ");              // ("AIR ON C= ")original
} 

main()
{   
   set_tris_b(0xf0);
   set_tris_d(0x00);                     //Puerto D como salida.
   lcd_init();
   lcd_putc("\fTEMPE. C= ");
   lcd_gotoxy(1,2);
   lcd_putc("AIR ON C= ");
   enable_interrupts(global);
   enable_interrupts(int_rb);
   umbral_encendido=25;                  //Es la Tº de encendido por defecto.
   while(1)
   {
   set_tris_a(0x0D);                     //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.
   setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
   delay_us(80);
   setup_adc_ports(AN0_VREF_VREF);       
   set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.      
   delay_us(80);                         //Tiempo de adquisición del dato.      
   bin_lectura=read_adc();               
   //setup_adc(ADC_OFF);
   delay_us(80);
   voltaje=(bin_lectura*P)+2.73;
   temperatura=(voltaje/0.01)-273;
   lcd_gotoxy(10,1);
   printf(lcd_putc,"%.2f ",temperatura);
   lcd_gotoxy(10,2);
   printf(lcd_putc,"%d ",umbral_encendido);
   lcd_gotoxy(12,2);
   lcd_putc("     ");                    //Asi evito problemas de sobreescritura.
   delay_ms(100);
   if(temperatura>umbral_encendido)
   output_bit(PIN_C0,1);                 //Hace calor,prende el aire.
   else
   output_bit(PIN_C0,0);                 
   }
}
