▷ Teclado Matricial y LCD 16x2 con PIC16F877A | Tutorial Completo

Aprende a conectar e implementar un teclado matricial con un LCD 16x2 y el microcontrolador PIC16F877A programado en MicroCode. Este proyecto te enseña cómo capturar y mostrar caracteres en pantalla mediante multiplexación del teclado y configuración PULL-DOWN.

📋 Materiales Requeridos

🖥️ Componentes Electrónicos

  • PIC 16F877A: Microcontrolador principal
  • LCD 16x2: Pantalla de visualización
  • Teclado matricial: Entrada de datos (4x3)
  • 4 Resistencias de 1kΩ: Configuración PULL-DOWN para las filas
  • Oscilador externo: Con capacitores (no necesario en simulación)

🔌 Diagrama de Conexiones

El diagrama esquemático muestra la integración completa del PIC16F877A con el LCD 16x2 y el teclado matricial:

Diagrama de conexiones: PIC16F877A con LCD 16x2 y teclado matricial

📌 Conexión PIC - LCD 16x2

El LCD se conecta al PIC en modo de 4 bits para economizar pines. Las líneas de control y datos se distribuyen en el PORTC:

PORTC.1 → RS (Selección de Registro)
PORTC.2 → E  (Habilitación)
PORTC.4 → D4 (Dato 4)
PORTC.5 → D5 (Dato 5)
PORTC.6 → D6 (Dato 6)
PORTC.7 → D7 (Dato 7)

⌨️ Conexión PIC - Teclado Matricial

El teclado matricial se conecta mediante una configuración de filas y columnas. Las filas actúan como entradas con resistencias PULL-DOWN, mientras que las columnas son salidas que se activan secuencialmente:

🔗 Filas del Teclado (Entradas con PULL-DOWN)

PORTD.3 → Fila 1 (A)
PORTD.2 → Fila 2 (B)
PORTD.1 → Fila 3 (C)
PORTD.0 → Fila 4 (D)

Importante: Cada fila debe tener una resistencia de 1kΩ conectada a tierra (GND) para mantenerla normalmente en nivel bajo.

🔗 Columnas del Teclado (Salidas)

PORTD.4 → Columna 1
PORTD.5 → Columna 2
PORTD.6 → Columna 3
⚡ Nota importante: En simulación no es necesario conectar el oscilador externo con sus capacitores. Sin embargo, en un proyecto físico real es imprescindible para el correcto funcionamiento del PIC.

💻 Código Fuente - MicroCode

El código implementa la multiplexación del teclado matricial y la visualización de caracteres en el LCD. A continuación se explica cada sección:

1️⃣ Configuración del LCD

Primero definimos los pines donde irá conectado el LCD utilizando directivas DEFINE:

; Configuración de pines del LCD
DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 2

2️⃣ Configuración de Entradas y Salidas

Declaramos el registro TRISB para definir qué pines serán entradas y cuáles salidas:

; Configuración del PORTD (0 = salida, 1 = entrada)
trisb = %00001111

; Explicación bit por bit (de derecha a izquierda):
; Bit 0 (PORTD.0) = 1 → Entrada (Fila 4)
; Bit 1 (PORTD.1) = 1 → Entrada (Fila 3)
; Bit 2 (PORTD.2) = 1 → Entrada (Fila 2)
; Bit 3 (PORTD.3) = 1 → Entrada (Fila 1)
; Bit 4 (PORTD.4) = 0 → Salida (Columna 1)
; Bit 5 (PORTD.5) = 0 → Salida (Columna 2)
; Bit 6 (PORTD.6) = 0 → Salida (Columna 3)

3️⃣ Definición de Variables y Pines

Nombramos cada pin para facilitar la lectura del código y hacerlo más mantenible:

; Definición de columnas (salidas)
columna0 VAR portd.4
columna1 VAR portd.5 
columna2 VAR portd.6 

; Definición de filas (entradas)
fila0 VAR PORTd.3
fila1 VAR portd.2 
fila2 VAR portd.1
fila3 VAR portd.0 

; Variables de trabajo
tecla VAR BYTE  ; Almacena el valor de la tecla pulsada
n VAR BYTE      ; Controla el desplazamiento del cursor en el LCD
pausa VAR BYTE  ; Pausa para el multiplexado

pausa = 10

🔄 Multiplexación del Teclado Matricial

La multiplexación es la técnica que permite leer un teclado matricial activando una columna a la vez y verificando qué fila se activó. Este proceso se repite cíclicamente:

📊 Proceso de Multiplexación

  1. Activar columna 0: Se pone en HIGH y se verifican las 4 filas
  2. Activar columna 1: Se pone en HIGH y se verifican las 4 filas
  3. Activar columna 2: Se pone en HIGH y se verifican las 4 filas
  4. Pausa: Se espera 10ms entre cambios de columna
  5. Repetir: El proceso se ejecuta continuamente

4️⃣ Código de Multiplexación - Columna 0

Activamos la primera columna y verificamos qué tecla fue presionada:

; Mensaje inicial en el LCD
LCDOUT $FE, 2, "TECLAS PULSADAS:"

ciclo:

    ; Activar columna 0 (contiene teclas: 3, 6, 9, #)
    HIGH columna0
    LOW columna1
    LOW columna2
    
    ; Verificar qué fila se activó
    IF fila0 = 1 THEN 
        tecla = 3: GOSUB imprimirValorDeTecla: ENDIF
    IF fila1 = 1 THEN 
        tecla = 6: GOSUB imprimirValorDeTecla: ENDIF
    IF fila2 = 1 THEN 
        tecla = 9: GOSUB imprimirValorDeTecla: ENDIF
    IF fila3 = 1 THEN 
        tecla = "#": GOSUB imprimirValorDeTecla: ENDIF
    
    ; Desactivar columna 0 y esperar
    LOW columna0
    PAUSE pausa

5️⃣ Código de Multiplexación - Columna 1

Activamos la segunda columna (contiene teclas: 2, 5, 8, 0):

    ; Activar columna 1
    LOW columna0
    HIGH columna1
    LOW columna2 
    
    IF fila0 = 1 THEN
        tecla = 2: GOSUB imprimirValorDeTecla: ENDIF
    IF fila1 = 1 THEN
        tecla = 5: GOSUB imprimirValorDeTecla: ENDIF
    IF fila2 = 1 THEN
        tecla = 8: GOSUB imprimirValorDeTecla: ENDIF
    IF fila3 = 1 THEN
        tecla = 0: GOSUB imprimirValorDeTecla: ENDIF

    LOW columna1
    PAUSE pausa

6️⃣ Código de Multiplexación - Columna 2

Activamos la tercera columna (contiene teclas: 1, 4, 7, *):

    ; Activar columna 2
    LOW columna0
    LOW columna1
    HIGH columna2
    
    IF fila0 = 1 THEN
        tecla = 1: GOSUB imprimirValorDeTecla: ENDIF
    IF fila1 = 1 THEN
        tecla = 4: GOSUB imprimirValorDeTecla: ENDIF
    IF fila2 = 1 THEN
        tecla = 7: GOSUB imprimirValorDeTecla: ENDIF
    IF fila3 = 1 THEN
        tecla = "*": GOSUB imprimirValorDeTecla: ENDIF
            
    LOW columna2
    PAUSE pausa
    
; Volver al inicio del ciclo
GOTO ciclo

📝 Subrutina para Imprimir Valores

Esta subrutina se encarga de mostrar el carácter presionado en el LCD, gestionar el desplazamiento del cursor y limpiar la pantalla cuando se llena:

imprimirValorDeTecla:

    ; Mostrar texto en la primera fila
    LCDOUT $FE, 2, "TECLAS PULSADAS:"
    
    ; Posicionar cursor en la segunda fila con desplazamiento
    LCDOUT $FE, $C0 + n
    
    ; Verificar si es un carácter especial (* o #)
    IF tecla = "*" THEN
        LCDOUT "*"
    ELSE
        IF tecla = "#" THEN
            LCDOUT "#"
        ELSE  
            ; Mostrar el número con DEC para evitar código ASCII
            LCDOUT DEC tecla
        ENDIF
    ENDIF
    
    ; Pausa para evitar rebotes
    PAUSE 50
    
    ; Incrementar posición del cursor
    n = n + 1
    
    ; Si se llenó la línea (16 caracteres), limpiar y reiniciar
    IF n >= 16 THEN 
        LCDOUT $FE, 1      ; Limpiar LCD
        n = 0                 ; Reiniciar contador
        LCDOUT $FE, 2, "TECLAS PULSADAS:"
    ENDIF

RETURN

🔍 Explicación Detallada

Concepto Función Explicación
PULL-DOWN Mantener nivel bajo Resistencias de 1kΩ a GND mantienen las filas en 0 cuando no hay pulsación
Multiplexación Escaneo secuencial Activar una columna a la vez y leer todas las filas
DEC Conversión decimal Muestra el valor numérico en lugar del código ASCII
$FE, $C0 Comando LCD Posiciona el cursor en la segunda línea

💡 Características del Sistema

✅ Ventajas del Diseño

  • Multiplexación eficiente: Permite leer 12 teclas con solo 7 pines del PIC
  • Anti-rebote integrado: Pausa de 50ms elimina lecturas falsas
  • Visualización continua: Actualización en tiempo real de las teclas presionadas
  • Gestión automática: Limpia el LCD cuando se completa la línea
  • Código modular: Fácil de modificar y adaptar a otros proyectos

⚙️ Funcionamiento del Sistema

  • El sistema escanea constantemente las 3 columnas del teclado
  • Cuando detecta una pulsación, captura el valor correspondiente
  • Imprime el carácter en el LCD y avanza el cursor
  • Al llenar la segunda línea (16 caracteres), reinicia automáticamente

🔧 Consejos de Implementación

✅ Buenas Prácticas

  • Verifica las conexiones: Asegúrate de que las resistencias PULL-DOWN estén correctamente conectadas
  • Ajusta pausas: Si hay rebotes, incrementa el delay de 50ms a 100ms
  • Contraste del LCD: Usa un potenciómetro para ajustar la visualización
  • Oscilador: En proyecto real, conecta cristal de 4MHz con capacitores de 22pF
📥 Descarga el Código y Simulación

Accede al código fuente completo, simulación en Proteus y documentación técnica del proyecto

🎓 Lo que has Aprendido

Al completar este proyecto, dominas la multiplexación de teclados matriciales, el manejo de displays LCD 16x2, la configuración de resistencias PULL-DOWN y la implementación de sistemas de entrada de datos con microcontroladores PIC. Estas habilidades son fundamentales para proyectos de control de acceso, menús interactivos y sistemas embebidos.

💬 ¿Tienes dudas o sugerencias? ¡Comparte tus preguntas en los comentarios y te ayudamos a resolverlas! Si lograste implementar el proyecto correctamente, cuéntanos tu experiencia.

0/Deja un comentario/Comentarios

¡Hola! Nos alegra mucho que hayas llegado hasta aquí y que estés leyendo este artículo en Edeptec.
Este formulario es un espacio abierto para ti: puedes dejar un comentario con tus dudas, sugerencias, experiencias o simplemente tu opinión sobre el tema tratado.

» ¿Te resultó útil la información?
» ¿Tienes alguna experiencia personal que quieras compartir?
» ¿Se te ocurre algún tema que te gustaría ver en próximos artículos?

Recuerda que este espacio es para aprender y compartir, por eso te animamos a participar de manera respetuosa y constructiva. Tus comentarios pueden ayudar a otros lectores que están en el mismo camino, ya sea en electrónica, programación, deportes o tecnología.

¡Gracias por ser parte de esta comunidad de aprendizaje! Tu participación es lo que hace crecer este proyecto.