Leyendo un documento de Microchip llamado Tips ‘n tricks (algo así como consejos y trucos) encontré una muy buena idea para manejar un teclado matricial de 12 teclas con un único terminal del PIC como se ve en la imagen de la derecha. La idea es leer el valor de tensión mediante un canal del conversor A/D del PIC, esta tensión será distinta para cada tecla apretada siempre y cuando hagamos una buena elección de los valores de las resistencias conectadas. En el ejemplo que muestro el LCD imprime la tecla pulsada, con # se borra el display y con * se cambia de línea.
El circuito es muy sencillo, sólo se necesita el teclado matricia, un display LCD y un conversor A/D. Para el ejemplo utilicé un PIC16F873A pero esta implementación es muy útil cuando disponemos de pocos terminales y, como dice el documento, es muy práctico para los PICs 12F de 8 terminales.
Simulación
Código Fuente
Utilizando la librería del CCS para LCDs el código es muy sencillo, consiste en comparar el valor de lectura del conversor A/D con el cálculo de tensión por cada tecla según el divisor resistivo que se utilice. Los límites de comparación de cada tecla mostrados son para los valores de resistencias del circuito y considerando una tolerancia del 1%.
#include <LCD.C>
void muestra(long valor);
void main()
{
long tecla;
set_tris_a(0xff);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
set_adc_channel(0);
lcd_init();
do{
tecla=read_adc();
muestra(tecla);
}while(true);
}
void muestra (long valor){
if ((valor >746)&(valor<761)){
lcd_putc("1");
delay_ms(400);
}
if ((valor >480)&(valor<490)){
lcd_putc("2");
delay_ms(400);
}
if ((valor >364)&(valor<372)){
lcd_putc("3");
delay_ms(400);
}
if ((valor >687)&(valor<701)){
lcd_putc("4");
delay_ms(400);
}
if ((valor >456)&(valor<465)){
lcd_putc("5");
delay_ms(400);
}
if ((valor >350)&(valor<357)){
lcd_putc("6");
delay_ms(400);
}
if ((valor >654)&(valor<668)){
lcd_putc("7");
delay_ms(400);
}
if ((valor >439)&(valor<448)){
lcd_putc("8");
delay_ms(400);
}
if ((valor >342)&(valor<349)){
lcd_putc("9");
delay_ms(400);
}
if ((valor >614)&(valor<626)){
lcd_putc("\n");
delay_ms(400);
}
if ((valor >330)&(valor<337)){
lcd_init();
delay_ms(400);
}
if ((valor >421)&(valor<430)){
lcd_putc("0");
delay_ms(400);
}
}

Muy bueno!!! Excelente idea para ahorrar patitas… Copado el blog!
Comentario por Oscar — 23 agosto 2009 @ 16:46 |
De nuevo… Felicitaciones!!
Comentario por Adrian — 24 agosto 2009 @ 13:48 |