Beruflich Dokumente
Kultur Dokumente
El microcontrolador escanea en forma sucesiva los pines de salida, mientras lee las
entradas en la parte baja del puerto, de manera que puede detectar que teclas están
oprimidas en cada fila. Ahora solo falta escribir nuestro codigo en C que implemente los
procedimientos mencionados anteriormente y nos devuelva un valor de la tecla oprimida,
por ejemplo, mediante un número binario.
1 /**
2 * Procesa las entradas del teclado matricial y determina la tecla que esta
3 * siendo oprimida. Retorna una palabra binaria de 16 bits en la cual los bits
4 * que se encuentran en estado alto representan teclas oprimidas.
5 *
6 * Esta función esta diseñada para poder detectar cuando se oprimen varias
7 * teclas sin embargo, debido a limitantes de la forma de conexión del teclado
8 * matricial, no se deben esperar resultados correctos al oprimir varias teclas
9 *
10 * @return Retorna una palabra de 16 bits, cada bit representa una tecla.
11 */
12 uint16_t keypad_read()
13 {
14 unsigned char count = 0;
15 unsigned char bitmask = 0x10;
16
17 // Valor de retorno de la funcion keypad_read() entero de 16 bits
18 uint16_t keys =0;
19
20 // Revisamos si alguna de las lineas en la parte baja esta en estado alto
21 // debido a que se ha cerrado un switch en el teclado.
22 if( PORTB & 0x0F )
23 {
24 // Escaneamos las filas una por una para determinar la tecla oprimida
25 do
26 {
27 // Apagamos todas las filas (parte alta)
28 PORTB &= 0x0F;
29 // Seleccionamos solo una como salida (bit del registro tris = 0)
30 TRISB &= ~bitmask;
31 // Y colocamos el pin en estado alto
32 PORTB |= bitmask;
33 // Esperamos unos cuantos milisegundos y leemos las columnas
34 delay_ms(100);
35 // Guardamos las columnas en una variable de 16 bits
36 keys |= (PORTB & 0x0F);
37 // Si ya hemos leido 4 columnas, las siguientes instrucciones no son
38 // necesarias, por lo que salimos del ciclo
39 if( count == 3 )
40 break;
41 // Recorremos la lectura a la izquierda para hacer espacio
42 keys = keys<<4;
43 // Recorremos el bitmask de la fila a leer
44 bitmask = bitmask<<1;
45 // Incrementar el contador de filas
46 count ++;
47 } while(1);
48
49 // Mantenemos parte alta = salidas y parte baja = entradas
50 TRISB = 0x0F;
51 // Mantenemos los bits mas significativos del puerto en estado alto
52 PORTB = 0xF0;
53 return keys;
54 }
55 return 0;
56 }
1
2
3
4
5
Detalles de la implementación
En nuestra implementación del hardware, todos los pines tienen conectada una
resistencia “pull-down”, por lo que se mantienen en estado bajo (0) cuandoel teclado
esta en reposo. Cuando se presiona un botón, el estado del pin cambia a estado alto (1).
Esto puede hacerse de manera inversa, utilizando las resistencias “pull-up” incluidas
internamente en el puerto B de muchos PIC que están diseñadas para este tipo de
aplicaciones. En nuestro caso, la tarjeta que utilizamos tiene resistencias pull-down
previamente conectadas en los pines, por lo que decidimos aprovecharlas.
Es un buen ejercicio invertir la lógica del código para permitir que este funcione con
resistencias “pull-up”, por lo que te recomendamos que realices al menos este ejercicio.
Proyecto de MPLAB con teclado matricial
Para probar el código anterior, hemos desarrollado un ejemplo completo que puede abrirse
con MPLAB X y grabarse directamente sobre un PIC16F88. El programa esta configurado
para una velocidad de reloj de 4 Mhz y utiliza el puerto B completo para conectar el
teclado. Para mantener las cosas simples, mostramos el número binario correspondiente a
la tecla oprimida mediante leds conectados en el puerto A (nada de pantallas ni cosas
complicadas). Puedes descargar este proyecto a continuación:
Conclusión
Con la información que tenemos hasta este momento, ya podemos darnos una idea
de como funciona un teclado matricial y podemos comenzar a incluirlo en nuestros
proyectos. Nos queda de tarea estudiar más a fondo el funcionamiento del puerto B de los
PIC, que incluye varias funciones opcionales como resistencias pull-up internas e
interrupción por cambio de estado en los pines, ideales para facilitar la conexión de
teclados matriciales.