Gestiona un teclado matricial con un sólo pin

En ocasiones un teclado matricial 4×3 puede ser un excelente dispositivo de entrada de datos en nuestros proyectos con PIC. La forma tradicional de conectarlos es utilizando 7 pines (3 columnas y 4 filas) lo que supone un auténtico lujo en algunos circuitos. Con esta técnica veremos cómo podemos utilizar un teclado completo con un sólo pin del micro.


La clave está en colocar una red de resistencias de valores distintos y conocidos en las filas y columnas de manera que cada tecla configure un divisor de tensión distinto, lo que dará lugar a una tensión diferente. La señal obtenida la leemos con el pin del ADC del PIC y podremos identificar la tecla pulsada.

Para poder «jugar» con los distintos valores de resistencias que podríamos colocar he diseñado una Hoja Excel que nos permite poner las que queramos y ver de inmediato qué tensión se obtendría con cada tecla y cuál es su correspondiente conversión a digital según la resolución en bits deseada.

Además de la Hoja Excel, también os proporciono una simulación en Proteus con un teclado matricial construido a base de pulsadores y un PIC 16F88 que nos indica vía RS232 la tecla que se ha pulsado en cada momento:

El programa que corre en el PIC es el siguiente:

#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES BROWNOUT //Reset when brownout detected
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled

#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9)

void main() {
int Tecla,TeclaAntigua;
char TeclaChar;

setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);
setup_oscillator(False);

printf ("Lectura de teclado hexadecimal utilizando un pin analogiconr");
printf ("Nocturno - 2007 www.micropic.es");

set_adc_channel(0);
Tecla=0;
TeclaAntigua=0;
while (1) {
Tecla = read_adc();
delay_ms( 50 );
if ((Tecla) && (Tecla!=TeclaAntigua)) // si no se pulsa nada,
// o se mantiene pulsada la misma tecla no hacemos nada
{
if (Tecla<150)
TeclaChar='#';
else if (Tecla<154)
TeclaChar='3';
else if (Tecla<160)
TeclaChar='6';
else if (Tecla<165)
TeclaChar='9';
else if (Tecla<175)
TeclaChar='0';
else if (Tecla<180)
TeclaChar='8';
else if (Tecla<188)
TeclaChar='5';
else if (Tecla<195)
TeclaChar='2';
else if (Tecla<205)
TeclaChar='*';
else if (Tecla<211)
TeclaChar='7';
else if (Tecla<223)
TeclaChar='4';
else if (Tecla<233)
TeclaChar='1';
printf("Valor analogico = %3u -> Tecla: %cnr", Tecla, TeclaChar);
}
TeclaAntigua=Tecla;
}
}

Puedes descargar todos los ficheros en un ZIP, en la zona de Descargas, apartado Proyectos, o desde aquí:
Ficheros

Share