En esta sección aprenderás a programar un teclado matricial 4×4 conectado con un microcontrolador PIC y un display LCD para mostrar las teclas oprimidas. El objetivo es codificar las entradas digitales del teclado matricial y mostrar el carácter en la pantalla LCD.
Teclado Matricial 4×4
Un teclado matricial está constituido por una matriz de pulsadores dispuestos en filas y columnas. En el diagrama siguiente se define la conexión del teclado 4×4 específicamente para ese modelo, por lo que deberás tener en cuenta la forma de conexión del teclado que deseas conectar.
Circuito del sistema
En el circuito anterior se muestra la conexión del teclado matricial de acuerdo con el diagrama del teclado, colocando los primeros 4 pines de las columnas (1,2,3,4) en los pines (D0-D3) y los pines de las filas (5,6,7,8) en los pines (D4-D7) esto por conveniencia y por llevar un orden de conexión, finalmente se coloca un display LCD para mostrar la tecla presionada.
Procedimiento
Existe una librería especifica para este teclado, pero si se desea utilizar otro teclado seria complicado encontrar la librería en internet, por lo que te enseñare a realizar un código para que puedas modificarlo y utilízalo en cualquier tipo de teclado.
En primer lugar crearemos una variables de tipo entera con matriz, en esta parte se define el número de filas del teclado.
int x[4]={1,0,0,0};//filas del teclado
En la pate de las finas se coloca n=numero de filas y entre los corchetes se coloca un 1 y n-1 ceros
En el caso del teclado 4×4 se realiza de la siguiente manera:
Se coloca el numero de filas n=4 y entre lo corchetes se coloca un 1 y n-1 ceros es decir 4-1=3 ceros.
La siguiente instrucción define los pines de salida conectados a las filas del teclado, en este caso de acuerdo con el circuito anterior, las filas están conectadas los pines D4-D6.
output_bit(pin_d4,x[0]);//salida pin D4
output_bit(pin_d5,x[1]);//salida pin D5
output_bit(pin_d6,x[2]);//salida pin D6 output_bit(pin_d7,x[3]);//salida pin D7
Ahora utilizaremos una instrucción para poder activar los pines de salida a las filas de teclado para detectar la tecla pulsada.
La instrucción mueve el bit 1 de la matriz de filas a la izquierda, esto para que pueda activar la salida en los pines de salida (D4-D7) uno a por uno
Se coloca la variable matriz que se define el numero de filas en este caso x y se coloca el numero de filas n=4;
rotate_left(x,4);// mueve el bit 1 de posición
Ejemplo del funcionamiento en el circuito para el caso 1 y si se presiona la tecla con el número 1:
Cuando la instrucción rota el bit para el x[0]=1; y activa el pin D4.
Al activar el pin D4 se alimentan los botones 1,4,7 y * con una señal digital.
Si se presiona el botón 1, el botón permitirá el paso de la señal digital al pin D0.
Por lo tanto si se activa la salida digital en el pin D4 y se detecta una entrada digital en el pin D0 se define que el botón oprimido será el numero «1».
El siguiente paso es asignar cada tecla para cada combinación de entradas y salidas del los pines del microcontrolador.
if (x[0]==1 && input(pin_d0)){c='1';} // pin d4 y d0 boton numero 1
if (x[1]==1 && input(pin_d0)){c='2';} // pin d5 y d0 boton numero 2
if (x[2]==1 && input(pin_d0)){c='3';} // pin d6 y d0 boton numero 3
if (x[3]==1 && input(pin_d0)){c='A';} // pin d7 y d0 boton numero A
if (x[0]==1 && input(pin_d1)){c='4';} // pin d4 y d1 boton numero 4
if (x[1]==1 && input(pin_d1)){c='5';} // pin d5 y d1 boton numero 5
if (x[2]==1 && input(pin_d1)){c='6';} // pin d6 y d1 boton numero 6
if (x[3]==1 && input(pin_d1)){c='B';} // pin d7 y d1 boton numero B
if (x[0]==1 && input(pin_d2)){c='7';} // pin d4 y d2 boton numero 7
if (x[1]==1 && input(pin_d2)){c='8';} // pin d5 y d2 boton numero 8
if (x[2]==1 && input(pin_d2)){c='9';} // pin d6 y d2 boton numero 9
if (x[3]==1 && input(pin_d2)){c='C';} // pin d7 y d2 boton numero C
if (x[0]==1 && input(pin_d3)){c='*';} // pin d4 y d3 boton numero *
if (x[1]==1 && input(pin_d3)){c='0';} // pin d5 y d3 boton numero 0
if (x[2]==1 && input(pin_d3)){c='#';} // pin d6 y d3 boton numero #
if (x[3]==1 && input(pin_d3)){c='D';} // pin d7 y d3 boton numero D
Para visualizar la tecla presionada en el display LCD, lo primero es crear una variable para interpretar caracteres en este caso la variable seria:
char c; //variable de caracteres
Finalmente utilizamos la instrucción para imprimir el número en pantalla.
lcd_gotoxy(1,1); printf(LCD_PUTC,"TECLA %c",c);
Código Completo
#FUSES NOMCLR
#define LCD_RS_PIN PIN_B6
#define LCD_RW_PIN PIN_B5
#define LCD_ENABLE_PIN PIN_B4
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B2
#define LCD_DATA6 PIN_B1
#define LCD_DATA7 PIN_B0
#include <lcd.c>
void main()
{
lcd_init();
int x[4]={1,0,0,0};//filas
char c; //variable de caracteres
while(TRUE)
{
lcd_gotoxy(1,1); printf(LCD_PUTC,"TECLA %c",c);
rotate_left(x,4);// mueve el bit 1 de posición
output_bit(pin_d4,x[0]);//salida pin D4
output_bit(pin_d5,x[1]);//salida pin D5
output_bit(pin_d6,x[2]);//salida pin D6
output_bit(pin_d7,x[3]);//salida pin D7
if (x[0]==1 && input(pin_d0)){c='1';} // pin d4 y d0 boton numero 1
if (x[1]==1 && input(pin_d0)){c='2';} // pin d5 y d0 boton numero 2
if (x[2]==1 && input(pin_d0)){c='3';} // pin d6 y d0 boton numero 3
if (x[3]==1 && input(pin_d0)){c='A';} // pin d7 y d0 boton numero A
if (x[0]==1 && input(pin_d1)){c='4';} // pin d4 y d1 boton numero 4
if (x[1]==1 && input(pin_d1)){c='5';} // pin d5 y d1 boton numero 5
if (x[2]==1 && input(pin_d1)){c='6';} // pin d6 y d1 boton numero 6
if (x[3]==1 && input(pin_d1)){c='B';} // pin d7 y d1 boton numero B
if (x[0]==1 && input(pin_d2)){c='7';} // pin d4 y d2 boton numero 7
if (x[1]==1 && input(pin_d2)){c='8';} // pin d5 y d2 boton numero 8
if (x[2]==1 && input(pin_d2)){c='9';} // pin d6 y d2 boton numero 9
if (x[3]==1 && input(pin_d2)){c='C';} // pin d7 y d2 boton numero C
if (x[0]==1 && input(pin_d3)){c='*';} // pin d4 y d3 boton numero *
if (x[1]==1 && input(pin_d3)){c='0';} // pin d5 y d3 boton numero 0
if (x[2]==1 && input(pin_d3)){c='#';} // pin d6 y d3 boton numero #
if (x[3]==1 && input(pin_d3)){c='D';} // pin d7 y d3 boton numero D
}
}