▷ Sistema para control de acceso con PIC, LCD y teclado matricial - Microcode

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.


📌 Requisito previo: Antes de continuar con este tutorial, te recomendamos revisar el proyecto anterior sobre Teclado Matricial y LCD 16x2 con PIC16F877A. Este conocimiento es fundamental para comprender la integración de componentes en el presente proyecto.

📦 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:

Diagrama de conexiones del sistema de control de acceso con PIC16F877A

📋 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
⚡ Nota importante: En simulación no es necesario conectar el oscilador externo con sus capacitores. Sin embargo, en un proyecto real, debe incluirse para el funcionamiento correcto del PIC.

💾 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

  1. Activar columna 1: Se pone en HIGH y se leen las 4 filas
  2. Activar columna 2: Se pone en HIGH y se leen las 4 filas
  3. Activar columna 3: Se pone en HIGH y se leen las 4 filas
  4. Pausa: Se espera 200ms entre ciclos
  5. 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] = "*"
📥 Descarga el Código y Simulación

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

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.