Mostrando entradas con la etiqueta Cerradura. Mostrar todas las entradas
Mostrando entradas con la etiqueta Cerradura. Mostrar todas las entradas

viernes, 8 de enero de 2010

Cerradura electrónica con LCD y teclado 3x4 usando PIC 16F628A

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: