Teclado Matricial 4×4 «Números y Caracteres», Pic C Compiler

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
En la siguiente imagen se describe el funcionamiento de la instrucción, cuando mueve el bit 1, para activar la salida en los pines d4-d7.

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
   }

}
Scroll al inicio