Autor Tema: Codigo para mostrar simultaneamente temperatura y teclado matricial en LCD  (Leído 2184 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado yesvari85

  • PIC10
  • *
  • Mensajes: 6
Buenos noches, les pido el favor a ver si me ayudan a verificar este código para manejar un teclado matricial 4x4 en conjunto con un sensor de temperatura lm35. El sensor me funciona correctamente pero el teclado no, no sale la tecla presionada en el lcd. He mirado varios ejemplos aquí pero no no encuentro como conectar el teclado como análogo. Muchas gracias!!

#include <16F887.h>
#DEVICE ADC=8;
#fuses intrc_io,nomclr, nowdt
#use  delay(clock=4Mhz)
#use rs232(baud=9600, parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include <LCD.c>



void temperatura(){
float valor_convertido;
float temperatura;
set_adc_channel(0);
valor_convertido=read_adc();
temperatura=(4.8/255)*valor_convertido*100;
   LCD_gotoxy(4,1);
   printf(LCD_PUTC,"T=%f",temperatura);
   LCD_gotoxy(4,2);
   LCD_PUTC(" ");
   delay_ms(50);
}
void teclado(){
int Valor_AD=0;
int Valor_AD_anterior=0;
char TeclaChar;
set_adc_channel(1);
Valor_AD=read_adc();
delay_ms(200);
if ((Valor_AD)&&(Valor_AD!=Valor_AD_anterior))
{
if(Valor_AD>=145&&Valor_AD<=149)
TeclaChar='0';
if(Valor_AD>=178&&Valor_AD<=180)
TeclaChar='8';
if(Valor_AD>=185&&Valor_AD<=188)
TeclaChar='5';
if(Valor_AD>=190&&Valor_AD<=195)
TeclaChar='2';
if(Valor_AD>=147&&Valor_AD<=150)
TeclaChar='#';
if(Valor_AD>=150&&Valor_AD<=154)
TeclaChar='9';
if(Valor_AD>=157&&Valor_AD<=160)
TeclaChar='6';
if(Valor_AD>=163&&Valor_AD<=165)
TeclaChar='3';
if(Valor_AD>=195&&Valor_AD<=197)
TeclaChar='*';
if(Valor_AD>=202&&Valor_AD<=204)
TeclaChar='7';
if(Valor_AD>=205&&Valor_AD<=214)
TeclaChar='4';
if(Valor_AD>=222&&Valor_AD<=224)
TeclaChar='1';
LCD_gotoxy(4,1);
LCD_PUTC(" ");
LCD_gotoxy(1,2);
printf(LCD_PUTC,"VC: %3u T:%c ",Valor_AD, TeclaChar);
delay_ms(500);}
Valor_AD_anterior=valor_AD;

}

void main()
{
LCD_init();
setup_adc_ports(PIN_A0);
setup_adc_ports(PIN_A1);
setup_adc(adc_clock_internal);


while(TRUE){
teclado();
temperatura();


}

}

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re:Codigo para mostrar simultaneamente temperatura y teclado matricial en LCD
« Respuesta #1 en: 10 de Noviembre de 2015, 01:11:02 »
umm no se, ese retardo de 200ms se ve muy grande, muchas cosas podrian pasar en 50ms+200ms+500ms

no nos dices si el código del pdf te funciona, no muestras el circuito del código completo, ¿te fijaste si los rangos limites de Valor_AD coinciden con Vref+ de la fuente utilizada?

¿no le falta un antirebote al teclado? ponle un condensador de 100nF en paralelo al ANx que estés usando para el teclado.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Codigo para mostrar simultaneamente temperatura y teclado matricial en LCD
« Respuesta #2 en: 10 de Noviembre de 2015, 09:05:27 »
Me parece que tenes un error en el código, pero como no manejo C, la verdad es que no estoy seguro.

En el último if donde chequea si la tecla pulsada es el 1, a continuación debería ir la llave del cierre, ya que sino a la hora de mostrar el teclado, solo lo hace cuando se presiona el pulsador 1
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado yesvari85

  • PIC10
  • *
  • Mensajes: 6
Re:Codigo para mostrar simultaneamente temperatura y teclado matricial en LCD
« Respuesta #3 en: 11 de Noviembre de 2015, 02:05:12 »
Hola amigos al final lo pude hacer funcionar este es el codigo, pero cuando presiono una tecla la temperatura me cambia de valor, de pronto me pueden decir en que estoy fallando? gracias!

#include <16f887.h>
#device ADC=8
#fuses intrc_io,nowdt, mclr
#use delay(clock=4MHz)
#include <LCD.c>
#byte portb = 06
#byte trisb = 0x86 
#define use_portb_kbd true
#include <kbd.c>

float valor_convertido;
float temperatura;
char k;
int x;

void main(){
lcd_init();
kbd_init();
set_tris_b(0xFF);
port_b_pullups(TRUE);

while(TRUE){
k=kbd_getc();
x=k-48;
if(k !=0){
lcd_gotoxy(1,2);
printf(lcd_putc,"tecla=%c",k);
delay_ms(100);


setup_adc_ports(pin_a0);
setup_adc(adc_clock_internal);
set_adc_channel(0);
valor_convertido=read_adc();// leer el valor convertido
temperatura=(5.4/1024)*valor_convertido*100;//
lcd_gotoxy(1,1);
printf(lcd_putc,"t=%F",temperatura);
delay_ms(1000);
}
}
}