Leer un teclado matricial

Un teclado matricial no es más que un arreglo de pulsadores en filas y columnas compartiendo algunos de sus pines, logrando una notable reducción de estos. Por ejemplo un teclado de 4 filas y 3 columnas (4×3) posee solo 7 pines de conexión y 12 teclas.
84-196-thickbox
Ahora bien, a la hora de implementar un teclado de este tipo en alguno de nuestros proyectos debemos realizar una lectura secuencial activando columnas y filas sucesivamente.

El sencillo ejemplo que mostramos simplemente escanea todas las teclas, si encuentra alguna presionada guarda un valor numérico en la variable «boton» y luego traslada el contenido de dicha variable directamente al puerto de salida PORTA. Obviamente la finalidad del código es ver la mecánica de lectura de un teclado matricial para comprenderla, modificarla y adaptarla a un programa práctico.


teclado-4x4

La siguiente rutina está escrita en el Basic de PIC Simulator IDE, aunque es fácilmente portable a otra variante del lenguaje.

AllDigital

'Pines que conforman las filas
Symbol fila1 = RB0
Symbol fila2 = RB1
Symbol fila3 = RB2
Symbol fila4 = RB3

'Pines que conforman las columnas
Symbol col1 = RB4
Symbol col2 = RB5
Symbol col3 = RB6
Symbol col4 = RB7

'Definición de puertos
TRISA = %00000000
TRISB = %00001111

'Definición de variables
Dim boton As Byte

'Programa principal
loop:
    Gosub get_button
    PORTA = boton
    Goto loop
End

'Subrutina
get_button:
    boton = 0
    col1 = 1
    If fila1 = 1 Then boton = 1
    If fila2 = 1 Then boton = 5
    If fila3 = 1 Then boton = 9
    If fila4 = 1 Then boton = 13
    col1 = 0
    col2 = 1
    If fila1 = 1 Then boton = 2
    If fila2 = 1 Then boton = 6
    If fila3 = 1 Then boton = 10
    If fila4 = 1 Then boton = 14
    col2 = 0
    col3 = 1
    If fila1 = 1 Then boton = 3
    If fila2 = 1 Then boton = 7
    If fila3 = 1 Then boton = 11
    If fila4 = 1 Then boton = 15
    col3 = 0
    col4 = 1
    If fila1 = 1 Then boton = 4
    If fila2 = 1 Then boton = 8
    If fila3 = 1 Then boton = 12
    If fila4 = 1 Then boton = 16
    col4 = 0
Return