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:
📌 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
💻 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
- Activar columna 0: Se pone en HIGH y se verifican las 4 filas
- Activar columna 1: Se pone en HIGH y se verifican las 4 filas
- Activar columna 2: Se pone en HIGH y se verifican las 4 filas
- Pausa: Se espera 10ms entre cambios de columna
- 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
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.
Publicar un comentario
¡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.