Muy buenas a todos y todas los fanáticos de los microcontroladores!!!
Aquí les dejo un vídeo de una cerradura electrónica con el microcontrolador PIC 16f628A una pantalla LCD 16x2 y un teclado 4x4. También el esquema y el código en Pic Basic Pro (pbp).
Componentes necesarios:
Lista de componentes para una cerradura electrónica controlada por PIC,
- Microcontrolador PIC 16F628A
- Pantalla LCD 16x2
- Teclado 4x4
- 3 Resistencias 4K7 (4700Ohm)
- Rele (Lo podemos sustituir por un Led para hacer pruebas)
- Programador Micro JDM 16f628 y 16f84
Esquema en Proteus para 16F628A y LCD 16x02:
Como no tenía reles a mano he puesto un led en su lugar, pero a efectos es lo mismo poniendo un transistor podremos controlar cargas mayores.
En la siguiente imagen tenemos el mapa de los pines del microcontrolador PIC 16F628A:
Después de una pequeña revisión, me he dado cuenta que si se ponemos RS en el pin A4 no funciona la simulación, pero solo en la simulación. De todas maneras he cambiado la foto del esquema y el código para que todo funcione correctamente.
Solucionado el problema, os dejo los archivos para Proteus y los archivos de PBP en la sección de descargas de este blog.
Funciones del programa:
- Bienvenida: Muestra un mensaje de bienvenida en la pantalla.
- Inicio:
- Menú: tenemos dos opciones:
- Abrir puerta: Función "Abrir".
- Cambiar clave: Función "Nueva_clave".
- Teclado: Lee las pulsaciones del teclado.
- Clave: Imprime en la pantalla dígito a dígito.
- Grabar_clave Almacena los dígitos en la memoria EEPROM
- Nueva_clave Imprime en pantalla los dígitos llamando a la función "Grabar_clave" con la nueva clave.
Y este es el código para la programación en PBP:
; Cerradura Electrónica con teclado 3x4,Lcd 16x2,
; y clave de 4 dígitos que queda grabada aun cuando el Pic
; deje de tener corriente.
; utiliza el microcontrolador 16f628a prescidiendo del cristal de cuarzo
; externo y usando el reloj interno
@ DEVICE PIC16F628A, WDT_OFF
@ DEVICE PIC16F628A, PWRT_ON
@ DEVICE PIC16F628A, BOD_ON
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, CPD_OFF
@ DEVICE PIC16F628A, MCLR_OFF
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT
@ DEVICE PIC16F628A, LVP_OFF
DEFINE LCD_DREG PORTA ; Puerto de datos LCD
DEFINE LCD_DBIT 0 ; datos LCD comenzando en BIT 0 o 4 "estos deben estar consecutivos"
DEFINE LCD_EREG PORTB ; cambiamos Enable del portb.3
DEFINE LCD_EBIT 7 ; al portb.7
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 7
; Definicion de variables
a var word
tecla var word
n1 var byte
n2 var byte
n3 var byte
n4 var byte
eprom1 var byte
; Definiendo puertos
LA var portb.0 ; Linea A
LB var portb.1 ; Linea B
LC var portb.2 ; Linea C
LD var portb.3 ; Linea D
Funo var portb.4 ; Columna 1
Fdos var portb.5 ; Columna 2
Ftres var portb.6 ; Columna 3
rele var porta.6 ; Rele
n1 = "1" ; asigno valor a las variables
n2 = "1" ; el valor es equivalente en ascII
n3 = "1" ; esta sera la combinación predefinida
n4 = "1" ; recuerda cambiarla!!
eprom1 = "0"
PAUSE 100 ; Inicio del programa
read 0, eprom1
if eprom1 = 255 then Grabar_clave
goto Bienvenida
Grabar_clave:
WRITe 0, n1
WRITe 1, n2
WRITe 2, n3
WRITe 3, n4
LCDOUT $FE,1, $FE, 2 , " CLAVE GRABADA "
PAUSE 1500
GOTO Bienvenida
Bienvenida:
pause 500 ; Mensaje de Bienvenida
LCDOUT $FE,1, $FE, 2, " Infotronikblog"
LCDOUT $FE, $C0, " Presenta: "
Inicio:
pause 500
LOW LA
LOW LB
HIGH LC
LOW lD ; Activamos la linea del asterisco
IF fUNO = 0 then goto Clave
pause 500 ; LEE EL TECLADO A VER SI ES "*" SI NO ES CONTINUA MOSTRANDO MENSAJE
goto Inicio
; Función para leer el teclado
Teclado:
low la
if funo = 0 then uno
if fdos = 0 then dos
if ftres = 0 then tres
high la
low lb
if funo = 0 then cuatro
if fdos = 0 then cinco
if ftres = 0 then seis
high lb
low lc
if funo = 0 then siete
if fdos = 0 then ocho
if ftres = 0 then nueve
high lc
low ld
if funo = 0 then asterisco
if fdos = 0 then cero
if ftres = 0 then numeral
high ld
pause 10
goto Teclado
asterisco:
tecla ="*"
return
siete:
tecla = "7"
return
cuatro:
tecla = "4"
return
uno:
tecla = "1"
return
dos:
tecla = "2"
return
cinco:
tecla = "5"
return
ocho:
tecla = "8"
return
cero:
tecla = "0"
return
tres:
tecla = "3"
return
seis:
tecla = "6"
return
nueve:
tecla = "9"
return
numeral:
tecla = "#"
return
Clave:
LCDOUT $FE,1, $FE,2, "Escribe la Clave"
pause 1000
gosub Teclado
SWAP tecla, n1
LCDOUT $FE, $C5, "*"
pause 500
gosub Teclado
SWAP tecla, n2
LCDOUT $FE, $C6, "*"
pause 500
gosub Teclado
SWAP tecla, n3
LCDOUT $FE, $C7, "*"
pause 500
gosub Teclado
SWAP tecla, n4
LCDOUT $FE, $C8, "*"
pause 500
READ 0,EPROM1
IF eprom1 = n1 then miro_dos
Error:
LCDOUT $FE, 1, $FE, 2, "Clave Incorrecta"
pause 500
goto Bienvenida
miro_dos:
READ 1, eprom1
IF eprom1 = n2 then miro_tres
goto error
miro_tres:
READ 2, eprom1
IF eprom1 = n3 then miro_cuatro
goto error
miro_cuatro:
READ 3, eprom1
IF eprom1 = n4 then goto menu
goto error
menu:
LCDOUT $FE, 1, " Elige una "
LCDOUT $FE, $C0, " Opcion: "
pause 1500
LCDOUT $FE, 1, "1 Abrir Puerta"
pause 300
LCDOUT $FE, $C0, "2 Cambiar Clave"
gosub Teclado
if tecla = "1" THEN goto Abrir
if tecla = "2" then goto Nueva_clave
if tecla != "1" and tecla!= "2" then LCDOUT $FE,1, $FE,2, "TECLA INCORRECTA" ; Si pulsamos una
LCDOUT $FE, 1, $FE, 2, "TECLA INCORRECTA " ;que no es ni 1 ni 2 muestra tecla incorrecta
pause 700
goto menu
Abrir:
high rele
LCDOUT $FE, 1, $FE, 2, " Bienvenido "
pause 3000
low rele
goto Bienvenida
Nueva_clave:
LCDOUT $FE,1, $FE,2, "Escribe tu nueva"
LCDOUT $FE, $C0, "Clave:"
pause 500
gosub Teclado
SWAP tecla, n1
LCDOUT $FE, $C8, "*"
pause 500
gosub Teclado
SWAP tecla, n2
LCDOUT $FE, $C9, "*"
pause 500
gosub Teclado
SWAP tecla, n3
LCDOUT $FE, $C9+1, "*"
pause 500
gosub Teclado
SWAP tecla, n4
LCDOUT $FE, $C9+2, "*"
pause 500
goto Grabar_clave
*NOTA: En la simulación la clave esta cambiada a 2580 *
Otros enlaces sobre información o proyectos con microcontroladores:
