Aprende a implementar un sistema de seguridad con contraseña utilizando un teclado matricial, LCD 16x2 y el microcontrolador PIC16F877A. Este proyecto integra componentes electrónicos reales para crear un control de acceso profesional con validación de claves.
📦 Lista de Materiales
Componentes Principales
- PIC 16F877A: Microcontrolador principal
- LCD 16x2: Pantalla de visualización
- Teclado matricial: Entrada de datos
- 5 Resistencias de 1kΩ: Configuración PULL-DOWN
- 1 Transistor 2N2222: Control de corriente
- 1 Relé de 5V: Activación de mecanismos
🔌 Diagrama de Conexiones
A continuación se muestra el diagrama esquemático del proyecto que integra todos los componentes electrónicos:
📋 Conexiones del LCD 16x2
El LCD se conecta al PIC mediante el PORTC utilizando el modo de 4 bits, lo que reduce el número de conexiones requeridas:
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)
⌨️ Conexiones del Teclado Matricial
El teclado se conecta en una configuración de matriz (filas y columnas). Las filas se conectan al PORTD con configuración PULL-DOWN mediante resistencias:
🔗 Filas del Teclado (Entrada)
PORTD.3 → Fila 1 (A) PORTD.2 → Fila 2 (B) PORTD.1 → Fila 3 (C) PORTD.0 → Fila 4 (D)
🔗 Columnas del Teclado (Salida)
PORTD.4 → Columna 1 PORTD.5 → Columna 2 PORTD.6 → Columna 3
💾 Estructura de Datos y Variables
El proyecto utiliza dos arrays principales para almacenar y comparar las contraseñas. La clave maestra se define al inicio del programa con 5 dígitos:
clave var BYTE[5] 'Array para almacenar la clave maestra valorTeclaPusada var BYTE[5] 'Array para almacenar la clave ingresada 'Definición de la clave maestra: *27#6 clave[0] = "*" clave[1] = 2 clave[2] = 7 clave[3] = "#" clave[4] = 6
🎮 Configuración del LCD y Teclado
Las directivas DEFINE configuran los pines del LCD para comunarse correctamente con el PIC. Los pines del teclado se asignan a variables para facilitar su lectura:
'Configuración LCD en modo 4 bits define LCD_DREG PORTC DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTC DEFINE LCD_RSBIT 1 DEFINE LCD_EREG PORTC DEFINE LCD_EBIT 2 'Asignación de pines del teclado columna0 var portd.4 columna1 var portd.5 columna2 var portd.6 fila0 var portd.3 fila1 var portd.2 fila2 var portd.1 fila3 var portd.0 'Salida para control del relé led var portd.7
🔄 Sistema de Multiplexación del Teclado
El teclado se lee mediante multiplexación: se activa una columna a la vez mientras se verifican todas las filas. Este proceso se repite cíclicamente para detectar cualquier pulsación:
📊 Proceso de Multiplexación
- Activar columna 1: Se pone en HIGH y se leen las 4 filas
- Activar columna 2: Se pone en HIGH y se leen las 4 filas
- Activar columna 3: Se pone en HIGH y se leen las 4 filas
- Pausa: Se espera 200ms entre ciclos
- Repetir: El proceso se repite continuamente
'Multiplexación - Columna 1 high columna0 low columna1 low columna2 if fila0 = 1 THEN tecla = 3:gosub almacenarDigitos:endif if fila1 = 1 THEN tecla = 6:gosub almacenarDigitos:endif if fila2 = 1 THEN tecla = 9:gosub almacenarDigitos:endif if fila3 = 1 THEN tecla = "#":gosub almacenarDigitos:endif
💾 Almacenamiento de Dígitos Ingresados
Cuando el usuario presiona una tecla, la subrutina almacenarDigitos realiza las siguientes acciones:
| Paso | Acción | Descripción |
|---|---|---|
| 1 | Mostrar "*" | Por seguridad, no muestra el carácter real |
| 2 | Desplazar cursor | Mueve el cursor a la siguiente posición |
| 3 | Almacenar valor | Guarda en el array valorTeclaPusada[n] |
| 4 | Pausa | Espera 50ms para debounce |
| 5 | Incrementar índice | Aumenta n para la siguiente posición |
almacenarDigitos:
lcdout $FE,$C5 + n 'Desplazar cursor a la derecha
lcdout "*" 'Mostrar asterisco en el LCD
'Almacenar el valor de la tecla pulsada
valorTeclaPusada[N] = tecla
PAUSE 50 'Debounce delay
n = n + 1 'Incrementar índice
if n = 5 then 'Longitud de la clave
GOSUB comprovarClaves
endif
return
🔐 Verificación y Validación de la Contraseña
Una vez que el usuario ha ingresado 5 dígitos, el sistema compara automáticamente la clave ingresada con la clave maestra. Si coinciden, se activa el relé; si no, muestra un mensaje de error:
comprovarClaves:
'Verificar si todas las posiciones coinciden
IF valorTeclaPusada[0] = Clave[0] AND _
valorTeclaPusada[1] = Clave[1] AND _
valorTeclaPusada[2] = Clave[2] AND _
valorTeclaPusada[3] = Clave[3] AND _
valorTeclaPusada[4] = Clave[4] THEN
'Clave correcta
lcdout $FE,1, $FE,2, "CLAVE CORRECTA"
high led 'Activar relé
PAUSE 5000 'Mantener activado 5 segundos
low led 'Desactivar relé
N = 0 'Reiniciar contador
ELSE
'Clave incorrecta
lcdout $FE,1, $FE,2, "CLAVE INCORRECTA"
PAUSE 5000 'Mostrar mensaje por 5 segundos
n = 0 'Reiniciar contador
lcdout $FE,1 'Limpiar pantalla
ENDIF
RETURN
🔄 Flujo del Programa Principal
El programa implementa un ciclo infinito que continuamente ejecuta la multiplexación del teclado, detectando pulsaciones y almacenando los valores ingresados:
manejarTeclado:
lcdout $FE,2, " <CLAVE> "
'Verificar columna 1
high columna0
low columna1
low columna2
if fila0 = 1 THEN
tecla = 3:gosub almacenarDigitos:endif
if fila1 = 1 THEN
tecla = 6:gosub almacenarDigitos:endif
if fila2 = 1 THEN
tecla = 9:gosub almacenarDigitos:endif
if fila3 = 1 THEN
tecla = "#":gosub almacenarDigitos:endif
goto manejarTeclado
💡 Características Principales del Sistema
- Contraseña de 5 caracteres: Combinación personalizable de números y símbolos
- Visualización segura: Muestra asteriscos en lugar de caracteres reales
- Validación instantánea: Verifica la clave tan pronto como se completan los 5 caracteres
- Control de relé: Activa dispositivos externos automáticamente
- Multiplexación eficiente: Escanea el teclado sin bloqueos
- Debounce integrado: Evita lecturas falsas por rebotes
🔧 Personalización de la Contraseña
Puedes modificar la contraseña maestra cambiando los valores en el array clave. Considera utilizar combinaciones de números y los caracteres especiales disponibles en el teclado matricial:
'Ejemplo: Cambiar contraseña a 1234* clave[0] = 1 clave[1] = 2 clave[2] = 3 clave[3] = 4 clave[4] = "*"
Accede al código fuente completo, simulación en Proteus y documentación técnica del proyecto
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.