You are on page 1of 7

Cerradura electrónica con PIC16F84

Esta es una carradura electrónica cuya combinación es de 4 digitos, dicho código se puede cambiar
cuando el usuario lo desee, el circuito opera con un relay a su salida, osea que se puede conectar cargas de
CC o CA de hasta 10A, como al ingresar el código el rele permanece activado por tiempo indefinido o
hasta que se ingrese de nuevo el mismo código, se pude pensar en muchas aplicaciones.

El código que se cambia se guarda en la memoria EEPROM interna del microcontrolador, asi cuando se
va la energía permenece el mismo código no se borra fácilmente.

Usamos un teclado matricial de 3x4, la disposición de pines a su salida es como se muestra:

COL1 COL2 COL3


FILA1 1 2 3
FILA2 4 5 6
FILA3 7 8 9
FILA4 * 0 #

El flag empieza de la siguiente manera:

FILA4
FILA3
FILA2
FILA1
COL3
COL2
COL1 (se identifica con una línea blanca)

Para validar un dato se aplica el símbolo “#” que hace la función de Enter.
Para grabar un nuevo número se hace uso del símbolo “*”.

Como dijimos el código consta de 4 números.


En un inicio tenemos el código 1234, cuando apretamos 1234# se activará el rele, apretamos nuevamente
1234# se debe desactivar.

Para cambiar el código procedemos así:


Primero: ingresamos la clave 1234 seguido de “*”, osea 1234*
Segundo colocamos la nueva clave seguido de “#” y otra vez seguido de “#”.
Por ejemplo: tenemos 1234, nuestra clave actual, queremos cambiarla a 4567, entonces colocamos:
1234*4567#4567#
Ahora nuestra nueva clave será 4567, si apretamos 4567# se activará el rel, y si apretamos nuevamente
4567# se desactivará.

A continuación se da el programa del proyecto.


Cerradura electrónica desarrollada en los Laboratorios de Labelin Electronics EIRL

list p=16f84a
#include <p16F84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

mhz EQU D'4'


pulsewidth EQU D'150'
clen EQU 4

ORG 0x2100
de "123456"

resta EQU 0x09 ;Configuración de registros


CONTA1 EQU 0x0a
uno EQU 0x08
ram_start EQU 0x0c
dcnt0 EQU ram_start+1
dcnt1 EQU ram_start+2
dcnt2 EQU ram_start+3
beepcnt EQU ram_start+4
keycode EQU ram_start+5
rowcnt EQU ram_start+6

cod EQU ram_start+9


cod_end EQU cod+clen

readlen EQU cod_end


readbuf_end EQU readbuf+clen

tmptr EQU readbuf_end

vectors ORG 0

goto main
nop
nop
nop
retfie

keytable movf keycode, W ;rutina que define los digitos del teclado
addwf PCL, F
dt 0x60
dt "123a"
dt "456b"
dt "789c"

eep_read movlw cod ;rutina para leer el código de la EEPROM


movwf FSR
clrf EEADR

eep_0 bsf STATUS, RP0


bsf EECON1, RD
bcf STATUS, RP0
movf EEDATA, W
movwf INDF

incf FSR, F
incf EEADR, F

movlw cod_end
subwf FSR, W
bnz eep_0
return

eep_write movlw cod ;rutina para escribir el Nuevo código en la EEPROM


movwf FSR
clrf EEADR

eep_1 movf INDF, W


movwf EEDATA
movwf EECON2
bsf EECON1, WR

eep_2 bcf STATUS, RP0


nop
nop
bsf STATUS, RP0
btfss EECON1, EEIF
goto eep_2
bcf STATUS, RP0

incf FSR, F
incf EEADR, F

return

udelay movwf dcnt0 ;rutina de retardo

udelay0 movlw 8 * mhz


movwf dcnt1

udelay1 decfsz dcnt1, F


goto udelay1

decfsz dcnt0, F
goto udelay0

return

beep movwf beepcnt ;rutina del sonido al apretar una tecla


beep0 bsf PORTB, 3
movlw 3
call udelay
bcf PORTB, 3
goto beep0
return

keyscan clrf keycode ;rutina para escanear alguna tecla pulsada


movlw 4
movwf rowcnt

movlw 0xfe
tris PORTA

rowscan movlw 0xa0


call udelay
swapf PORTB, W
movwf colstatus

movlw 4
movwf colcnt
colscan incf keycode, F
rrf colstatus, F
btfss STATUS, C
goto keytable

decfsz colcnt, F
goto colscan

bsf STATUS, C

bsf STATUS, RP0


rlf TRISA, F
bcf STATUS, RP0

decfsz rowcnt
goto rowscan
retlw 0

main clrf PORTA ;programa principal


clrw
tris PORTA
clrf PORTB
movlw 0xf0
tris PORTB
bsf STATUS, RP0
bcf OPTION_REG, NOT_RBPU
bcf STATUS, RP0
movlw 0x02

warm movlw 0xf0


call beep
call eep_read

loop call read ;espera hasta que se pulsa el código


movlw cod
call compbuf
bnz suena
goto nosuena

suena decfsz resta,F


goto loop
bsf PORTB,0
goto loop

nosuena movlw 0x03


movwf resta
movlw '*'
subwf keycode, W
bz codechange

pulseout btfss uno,2 ;activación del rele, hasta que se pulse de nuevo el código
goto desact
clrf PORTB
bsf PORTB,2
clrf uno
goto loop
desact bsf uno,2
clrf PORTB
goto loop
codechange movlw 2 ;cambio de código?
movwf PORTB
call read

movlw cod
call copybuf

call read
movlw cod
call compbuf
bnz warm

call eep_write
goto loop

read clrf readlen

readloop clrw
tris PORTA
movf PORTB, W
andlw 0xf0
xorlw 0xf0
btfss STATUS, Z
goto readloop

movlw 0xf0
call udelay

movf PORTB, W
movlw 1<<RBIE
movwf INTCON
sleep

key_pressed call keyscan ;tecla presionada?


andlw 0xff
movwf keycode
bz readloop

movlw 0xf0
call udelay

movlw clen
subwf readlen, W
bnz read_notfull

call read_chkenter
bnz read_notenter

movlw 0x40
call beep
movf keycode, W
return

read_notenter movlw readbuf+1


movwf FSR

read_shift movf INDF, W


decf FSR, F
movwf INDF
incf FSR, F
incf FSR, F
movlw readbuf_end
subwf FSR, W
bnz read_shift

decf readlen, F

read_notfull call read_chkenter


bz read

movlw 0x40
call beep

movlw readbuf
addwf readlen, W
movwf FSR
movf keycode, W
movwf INDF
incf readlen, F
goto readloop

read_chkenter movlw '#'


subwf keycode, W
btfsc STATUS, Z
return ; Z=1, enter
movlw '*'
subwf keycode, W
return

compbuf movwf tmptr ;compara código


clrf readlen

comp0 movlw readbuf


addwf readlen, W
movwf FSR
movf INDF, W
movwf tmbyte

movf tmptr, W
addwf readlen, W
movwf FSR
btfss STATUS, Z
return
incf readlen, F
movlw clen
subwf readlen, W
bnz comp0
return
copybuf movwf tmptr
clrf readlen
copy0 movlw readbuf
addwf readlen, W
movwf FSR
movf INDF, W
movwf tmbyte
movwf FSR
movf tmbyte, W
movwf INDF

incf readlen, F
movlw clen
subwf readlen, W
bnz copy0
return

end ;fin del programa

You might also like