portb=vect[i];
//Este es el primer paso hacia el control de temperatura.Idea:que usualmente sea un sensor y ocacional o
//eventualmente presente en pantalla el numero correspondiente a la tecla oprimida.
#include <16f877.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=6
//#include <Rutina escaneo de teclado 4x3 en C.c>
#use fast_io(D)
char TECLA_PULSADA,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;
int i=0;
int vect[5]={0x0E,0x0D,0x0B,0x07,0};
char matriz_teclado[4][3]={'1','2','3','4','5','6','7','8','9','*','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)
{
TECLA_PULSADA=escan_teclado();
if(TECLA_PULSADA!=0)
{
if(digitos==0)
printf(lcd_putc,"\fUMBRAL INF. C=%c",escan_teclado());
else
{
printf(lcd_putc,"%c",escan_teclado());
}
delay_ms(500);
++digitos;
}
}
// while(!input(PIN_B4)||!input(PIN_B5)||!input(PIN_B6)||!input(PIN_B7)); //Leo el portb(esto es necesario por problemas con CCS)y al mismo tiempo utilizo solo el flanco descendente como condición de ejecución.
portb=0x00;
}
main()
{
set_tris_b(0xf0);
set_tris_d(0x00); //Puerto D como salida.
lcd_init();
enable_interrupts(global);
enable_interrupts(int_rb);
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(20);
setup_adc_ports(AN0_VREF_VREF);
set_adc_channel(0); //El canal analogo a emplear será RA0/AN0.
delay_us(20); //Tiempo de adquisición del dato.
bin_lectura=read_adc();
setup_adc(ADC_OFF);
delay_us(20);
voltaje=(bin_lectura*P)+2.73;
temperatura=(voltaje/0.01)-273;
printf(lcd_putc,"\fTEMPERATURA=%.3f C",temperatura);
delay_ms(100);
lcd_putc("\f"); //Borro LCD.
}
}
//Este programa controla el funcionamiento de una fuente de frio,la temperatura de encendido se puede
//programar por teclado.
#include <16f877.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#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;
}
main()
{
set_tris_b(0xf0);
set_tris_d(0x00); //Puerto D como salida.
lcd_init();
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(20);
setup_adc_ports(AN0_VREF_VREF);
set_adc_channel(0); //El canal analogo a emplear será RA0/AN0.
delay_us(20); //Tiempo de adquisición del dato.
bin_lectura=read_adc();
setup_adc(ADC_OFF);
delay_us(20);
voltaje=(bin_lectura*P)+2.73;
temperatura=(voltaje/0.01)-273;
printf(lcd_putc,"\fTEMP.=%.3f C",temperatura);
lcd_gotoxy(1,2);
printf(lcd_putc,"AIR ON=%d C",umbral_encendido);
delay_ms(100);
if(temperatura>umbral_encendido)
output_bit(PIN_C0,1); //Hace calor,prende el aire.
else
output_bit(PIN_C0,0);
}
}