INTRODUCCION
Una cerradura electrónica consiste en llevar acabo una función especifica para la cual ha sido creada. La ventaja de una cerradura así es que el usuario de esta cerradura tendrá la confiabilidad de que cualquier persona no podrá acceder a su habitación o a un armario, caja, etc.
La parte principal del circuito de la cerradura es de PIC 16F876, microprocesador que se encarga de las funciones de: almacenamiento de la clave de acceso y la computadora y la comparación de las claves introducidas con la anteriormente mencionada. Las claves son introducidas por medio de un teclado de 12 teclas y visualizada en una pantalla LCD. También cuenta con dos teclas: aceptar y cambiar clave. Si la clave se introduce incorrectamente tres veces una alarma se activa durante unos segundos para avisar al usuario que tratan de acceder a su espacio.
PLANTEAMIENTO Y DELIMITACION
En primera instancia nuestro proyecto era realizar un control por voz, de tal forma que comenzamos por investigar cuales eran los circuitos existentes para realizar un control por voz, de los cuales uno fue el que nos llamo más la atención (Figura 1), ya que este circuito contenía una parte de teclado, es decir, que si el circuito no podía ser activado por voz(en caso de alguna falla) podría activarse por medio del teclado. Ya habiendo investigado acerca de este circuito nos dimos a la tarea de buscar cada uno de los componentes, de los cuales se tuvo un grave problema con uno de ellos (el elemento principal del circuito).
ELECCIÓN DE UN MICROCONTROLADOR PARA EL PROYECTO.
Para ele de microcontrolador a utilizar nos basamos en los siguientes puntos:
• Microcontroladores de uso más común.
• Mas utilizados en el ámbito laboral.
•Mayor información en libros y en internet para la investigación. Más económicos.
En base a esto decidimos que lo mejor sería utilizar micro controladores PIC, los cuales tienen una arquitectura RISC.
TECLADO MATRICIAL 4x3.
este tipo de teclado proviene de su interconexión entre las columnas y las filas, ya que esta conexión tiene la forma de una matriz. Existen teclados matriciales de 4 x 4 y de 4 x 3 teclas.
DESARROLLO DEL PROYECTO.
Se comenzó por la investigación de cada uno de los 3 elementos principales de nuestro proyecto (PIC, y el Teclado Matricial), de tal forma de saber cómo es su funcionamiento y como es que se comportan durante su tiempo de empleo. Ya sabiendo esto, se continúo con la investigación sobre cómo es que se podrían comunicar estos dispositivos, lo cual fue sencillo de averiguar, ya que cada elemento consta con su propio manual (llamados datasheet). Estos manuales contienen las especificaciones de trabajo con las que se deben de operar los elementos, es decir, cuanta alimentación de voltaje se debe de utilizar o como es que se deben de conectar estos elementos entre si, etc
PROGRAMACIÓN.
Para la rápida comprensión del programa a continuación se describirán a grandes rasgos los módulos involucrados en el código.
INICIO:
inicializa el Display (LCD).
Rutinas que utiliza este modulo: ƒ
INITLCD
Este modulo es el principal del programa ya que da la bienvenida al usuario desplegando en el Display el mensaje “INTRODUZCA CLAVE” y coloca el cursor en la línea inferior del Display para esperar a que ingresen el código de acceso, cuando se requiere reiniciar en sistema se hace una llamada a este modulo.
Rutinas que utiliza este modulo:ƒ CLEARL
ƒ SITUCU
ƒ ESCMEN
ECOD12, ECOD22, ECOD32, ECOD42:
Estos módulos extraen el código 1, código 2, código 3 y código 4, para posteriormente verificar la clave compuesta por la unión de los cuatro códigos coincida con la almacenada en la memoria.
Rutinas que utiliza este modulo:
SUELKEY
ESPEKEY | ||||||||||
INCOR | ||||||||||
CAMBIOC | ||||||||||
WRITEL
|
ESPEKEY | ||
CAMBIOC | ||
LEECOD | ||
INCOR | ||
CLEARL | ||
SITUCU | ||
ESCMEN | ||
CAMBIOC: Este modulo se utiliza para cambiar la clave de acceso, el cual para efectuar el | ||
cambio pide introduzcas el código antiguo y a continuación la clave nueva dos | ||
veces para confirmar que se introdujo correctamente y posteriormente se almacene | ||
en le memoria EEPROM. | ||
Rutinas que utiliza este modulo: |
CLEARL |
ESCMEN |
SUELKEY |
SITUCU |
COGECOD |
LEECOD |
INCORE |
INCOREC |
NUEVACL: | ||
Captura y verifica que la nueva clave sea correcta. | ||
NOVERI: | ||
Verifica que se introdujo bien la clave al realizar un cambio de esta | ||
Rutinas que utiliza este modulo: | ||
CLEARL | ||
ESCMEN | ||
SITUCU | ||
DELAY | ||
NUEVACL | ||
INCOREC: | ||
Despliega el mensaje de error cuando la clave no tiene el tamaño de 4 dígitos, y | ||
reinicia el sistema sin decrementar los intentos. | ||
Rutinas que utiliza este modulo: | ||
CLEARL | ||
ESCMEN | ||
SITUCU |
INCORE: | ||
Cuando la clave que se introdujo tiene el tamaño adecuado pero no corresponde con | ||
la almacenada en memoria este modulo despliega el mensaje de “CLAVE | ||
INCORRECTA” y decrementa el numero de intentos disponibles, si el numero de | ||
intentos llego a su máximo entonces activa la alarma. | ||
Rutinas que utiliza este modulo: | ||
ALARMA | ||
CLEARL | ||
ESCMEN | ||
SUELKEY | ||
DELAY |
ALARMA:
Después de 3 intentos incorrectos se activa la alarma, una vez activada la alarma suena por un tiempo definido y se reinicia el sistema.
COGECOD:
Almacena el código almacenado para su posterior uso EEWRITE:
Escribe el valor en CODWRITE en la localidad dada por el acumulador de la memoria.
GETKEY:
Devuelve el valor pulsado en el teclado en código ASCCI. HAYTECL:
Identifica la fila en la que se encuentra la tecla presionada.
SUELKEY:
Subrutina que espera a que se suelte la tecla
Ya teniendo listo el programa nos dimos a la tarea de buscar un grabador de PIC’s, el cual fue una herramienta necesaria para nuestro proyecto. Este grabador fue adquirido por Internet.
Con la posesión de nuestro grabador nos vino consigo el programa grabador y simulador de PIC (PIC Simulador IDE), el cual nos ayudo a averiguar si nuestro programa fue logrado con éxito, es decir, con el se comprobaría que la comunicación entre el PIC que las funciones fueran las adecuadas. Una vez acabado con este proceso nos dimos a la tarea de grabar el PIC con la ayuda de este mismo programa y del grabador.
COMPONENTES DEL PROYECTO.
Los componentes que se utilizaron para la construcción del proyecto fueron los siguientes:
Fue fuente de alimentacion
• 1 Transformador de 12V a 1A.
• 1 Puente de diodos rectificador a 2ª (RS203L).
• 1 Capacitor de 1000µF a 50V.
• 1 Regulador de voltaje positivo a 5V (L7805CV).
• 2 Conectores plug invertido de 1.3mm.
• Cable.
• 1 Gabinete para eliminador.
Cir circuito de cerradura
• 1 PIC (16F8576).
• 1 Teclado Matricial 4x3.
• 1 Bocina de 8Ω de impedancia.
• 1 Transistor para aplicación de switcheo (TIP31).
• 2 Capacitores de 22pF.
• 5 Resistencias de 10kΩ a 1/2W.
• 6 Resistencias de 1kΩ a 1/2W.
• 1 Resistencia de 470Ω a 1/2W.
• 1 Potenciómetro de 10kΩ.
• 2 LED’s (1 Verde y 1 Rojo).
• 2 switch’s tipo botón
• 2 Conectores plug de 1.3mm.
• Conectores header’s (Hembra y Macho).
• Cable plano de 24 hilos.
• Cable telefónico.
• 1 Gabinete de 8x14cm y 4cm de alto.
• 1 Tablilla de Experimentación de circuitos (Protoboard).
Grabación del PIC:
• 1 Grabador de PIC’s.
CODIGO FUENTE.
; Configuración
****************************************************************************************
LIST P=16F876 ;Procesador a usar
RADIX HEX ;Sistema de numeración Hexadecimal predeterminada
INCLUDE P16F876.INC ;Librería incluida, contiene definiciones de registros
internos
;Palabra de Configuración
__config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC
**********************************************************************
; Registros Reservados
;-----------------------------------------------------------------------------------------------------------------------------------
PCL EQU 02H
STATUS EQU 03H
PORTA EQU 05H ;Puerto A
DATO EQU 06H ;PUERTO B
KEYB EQU 07H ;Puerto C
INTCON EQU 0BH
PIR2 EQU 0DH
PIE2 EQU 8DH
ADECON1 EQU 9FH ; Análogo Digital Configuración
EEDATA EQU 10CH
EEADR EQU 10DH
EECON1 EQU 18CH
EECON2 EQU 18DH
**************
; Registros de Uso General
;-----------------------------------------------------------------------------------------------------------------------------------
T_RELE EQU 20H ;CONTROLA EL TIEMPO DE APERTURA DE LA PUERTA
PUNTAB EQU 20H
INTENTO EQU 21H ;Numero de intentos antes de que se accione la alarma
TECLA EQU 22H ; Almacena la tecla presionada
CUENTA1 EQU 23H
CUENTA2 EQU 24H
CUENTA3 EQU 25H
COD1 EQU 26H ; Almacena la primera tecla numérica presionada
COD2 EQU 27H; Almacena la segunda tecla numérica presionada
COD3 EQU 28H ; Almacena la tercera tecla numérica presionada
COD4 EQU 29H ; Almacena la cuarta tecla numérica presionada
CUENTA4 EQU 2AH
COD1A EQU 2BH ; Auxiliar para comprobar código
COD2A EQU 2CH ; Auxiliar para comprobar código
COD3A EQU 2DH ; Auxiliar para comprobar código
COD4A EQU 2EH ; Auxiliar para comprobar código
CODWRITE EQU 2FH ; Auxiliar para escribir código en EEPROM
;-----------------------------------------------------------------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------------------------------------------------------------
F EQU 1
W EQU 0
;------------------------------------------------------------- ----------------------------------------------------------------------
; Definiciones
;------------------------------------------------- ----------------------------------------------------------------------------------
#DEFINE EN 05H,2 ; Activa y desactiva el LCD
#DEFINE RW 05H,1 ;
#DEFINE RS 05H,0 ;
#DEFINE ALA 05H,3 ;
#DEFINE PORTERO 05H,5 ; Apertura y cierre de la puerta
ORG 00H
GOTO INICIO
ORG 04H
BCF PIR2,4
RETFIE
;-----------------------------------------------------------------------------------------------------------------------------------
TABLA
MOVWF PCL ; Hacemos apuntar el PCL a la dirección de inicio del mensaje
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 1 'Introduzca'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_1
RETLW 'I'
RETLW 'N'
RETLW 'T'
RETLW 'R'
RETLW 'O'
RETLW 'D'
RETLW 'U'
RETLW 'Z'
RETLW 'C'
RETLW 'A'
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 5 'Clave'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_5
RETLW ' '
RETLW 'C'
RETLW 'L'
RETLW 'A'
RETLW 'V'
RETLW 'E'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 2 'Puede Pasar'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_2
RETLW 'P'
RETLW 'U'
RETLW 'E'
RETLW 'D'
RETLW 'E'
RETLW ' '
RETLW 'P'
RETLW 'A'
RETLW 'S'
RETLW 'A'
RETLW 'R'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 3 'Clave Incorrecta'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_3
RETLW 'C'
RETLW 'L'
RETLW 'A'
RETLW 'V'
RETLW 'E'
RETLW ' '
RETLW 'I'
RETLW 'N'
RETLW 'C'
RETLW 'O'
RETLW 'R'
RETLW 'R'
RETLW 'E'
RETLW 'C'
RETLW 'T'
RETLW 'A'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 4 'Cambio de'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_4
RETLW 'C'
RETLW 'A'
RETLW 'M'
RETLW 'B'
RETLW 'I'
RETLW 'O'
RETLW ' '
RETLW 'D'
RETLW 'E'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 6 'Antigua'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_6
RETLW ' '
RETLW 'A'
RETLW 'N'
RETLW 'T'
RETLW 'I'
RETLW 'G'
RETLW 'U'
RETLW 'A'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 7 'Nueva'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_7
RETLW 'N'
RETLW 'U'
RETLW 'E'
RETLW 'V'
RETLW 'A'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 8 'Verifique'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_8
RETLW 'V'
RETLW 'E'
RETLW 'R'
RETLW 'I'
RETLW 'F'
RETLW 'I'
RETLW 'Q'
RETLW 'U'
RETLW 'E'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 9 'Cambiada'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_9
RETLW ' '
RETLW 'C'
RETLW 'A'
RETLW 'M'
RETLW 'B'
RETLW 'I'
RETLW 'A'
RETLW 'D'
RETLW 'A'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 10 'La Clave Debe' ;-----------------------------------------------------------------------------------------------------------------------------------
MEN_10
RETLW 'L'
RETLW 'A'
RETLW ' '
RETLW 'C'
RETLW 'L'
RETLW 'A'
RETLW 'V'
RETLW 'E'
RETLW ' '
RETLW 'D'
RETLW 'E'
RETLW 'B'
RETLW 'E'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 11 'Tener 4 Dígitos' ;-----------------------------------------------------------------------------------------------------------------------------------
MEN_11
RETLW 'T'
RETLW 'E'
RETLW 'N'
RETLW 'E'
RETLW 'R'
RETLW ' '
RETLW '4'
RETLW ' '
RETLW 'D'
RETLW 'I'
RETLW 'G'
RETLW 'I'
RETLW 'T'
RETLW 'O'
RETLW 'S'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 12 'Intentelo'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_12
RETLW 'I'
RETLW 'N'
RETLW 'T'
RETLW 'E'
RETLW 'N'
RETLW 'T'
RETLW 'E'
RETLW 'L'
RETLW 'O'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
;Mensaje 13 'De Nuevo'
;-----------------------------------------------------------------------------------------------------------------------------------
MEN_13
RETLW 'D'
RETLW 'E'
RETLW ' '
RETLW 'N'
RETLW 'U'
RETLW 'E'
RETLW 'V'
RETLW 'O'
RETLW 00H
;-----------------------------------------------------------------------------------------------------------------------------------
INICIO: Inicializa los dispositivos.
LCD
Teclado
;-----------------------------------------------------------------------------------------------------------------------------------
INICIO
CLRF DATO ; Inicializa el Puerto B
CLRF KEYB ; Inicializa el Teclado
CLRF PORTA ; Inicializa el Puerto A
BSF STATUS,5 ; Cambiamos al Banco 1 para definir las entradas como digitales
MOVLW 06H ; Bits de configuración para las entradas como digitales
MOVWF ADCON1 ; Envía la configuración
CLRF DATO ;
BCF EN ; Configuramos EN, RW,
BCF RW ;
BCF RS ; RS, ALA y Portero
BCF ALA ;
BCF PORTERO ; como salidas
MOVLW 0F0H ; Configuramos el teclado
MOVWF KEYB ; Columnas como salidas y Filas como entradas
BCF STATUS,5 ; Regresamos al banco 0
BCF PIR2,4 ; La EEPROM eta lista para usarse
MOVLW 03H ; Cargamos el numero de intentos que se podrán
MOVWF INTENTO ; realizar antes que se active la alarma en este caso 3
CALL INITLCD ; Inicializamos la pantalla LCD
;CALL INITLCD ;
;----------------------------------------------- ------------------------------------------------------------------------------------
;PRINCI: Cuerpo principal del programa
;----------------------------------------------- ------------------------------------------------------------------------------------
PRINCI
CALL CLEARL ; Borra el Display y coloca el cursor ala izq.
MOVLW 00H
CALL SITUCU ; Coloca el cursor al inicio de la línea superior del LCD
MOVLW MEN_1 ; Cargamos la dirección del Mensaje en el Acumulador
CALL ESCMEN ; Rutina que escribe el mensaje al que apunta el acumulador
MOVLW 44H
CALL SITUCU ; Coloca el cursor al inicio de la línea inferior del LCD
;-----------------------------------------------------------------------------------------------------------------------------------
;ECOD12: Este modulo almacena la primera tecla numérica presionada y valida
; que no sea una tecla de función en caso de 'C' entra a la sección
; de "Cambio de Clave"
ECOD12
CALL SUELKEY ; Verificamos que el teclado se encuentre bien inicializado
CALL ESPEKEY ; Esperamos a que se presione una tecla
MOVWF COD1 ; Almacenamos la primera tecla presionada en el Acumulador
SUBLW 'A' ; Verificamos si la tecla fue o no 'A'
BTFSC STATUS,2 ;
GOTO INCOR ; Si la tecla = 'A'
MOVF COD1,W ; Cargamos la tecla en el acumulador
SUBLW 'C' ; Verificamos si la tecla presionada fue 'C'
BTFSC STATUS,2 ; Si la tecla fue 'C'
GOTO CAMBIOC ; cambiamos la clave
MOVF COD1,W ; en caso de que se haya presionado una tecla numérica
MOVLW '*' ; para mantener oculta la tecla oprimida
;-----------------------------------------------------------------------------------------------------------------------------------
;ECOD22: Este modulo almacena la segunda tecla numérica presionada y valida
; que no sea una tecla de función en caso de 'C' entra a la sección
; de "Cambio de Clave"
;-----------------------------------------------------------------------------------------------------------------------------------
ECOD22
CALL SUELKEY ; Verificamos que el teclado se encuentre bien inicializado
CALL ESPEKEY ; Esperamos a que se presione una tecla
MOVWF COD2 ; Almacenamos la segunda tecla presionada en el Acumulador
SUBLW 'A' ; Verificamos si la tecla fue o no 'A'
BTFSC STATUS,2 ;
GOTO INCOR ; Si la tecla = 'A'
MOVF COD2,W ; Cargamos la tecla en el acumulador
SUBLW 'C' ; Verificamos si la tecla presionada fue 'C'
BTFSC STATUS,2 ; Si la tecla fue 'C'
GOTO CAMBIOC ; cambiamos la clave
MOVF COD2,W ; en caso de que se haya presionado una tecla numérica
MOVLW '*' ; para mantener oculta la tecla oprimida
;-----------------------------------------------------------------------------------------------------------------------------------
;ECOD32: Este modulo almacena la tercera tecla numérica presionada y valida
; que no sea una tecla de función en caso de 'C' entra a la sección
; de "Cambio de Clave"
;----------------------- ----------------- ------------ -------------------------------------------------------------------------------
ECOD32
CALL SUELKEY
CALL ESPEKEY
MOVWF COD3
SUBLW 'A'
BTFSC STATUS,2 ;
GOTO INCOR
MOVF COD3,W
SUBLW 'C'
BTFSC STATUS,2
GOTO CAMBIOC
MOVF COD3,W
MOVLW '*'
CALL WRITEL
;------------------------------- ----------------------------------------------------------------------------------------------------
;ECOD42: Este modulo almacena la cuarta tecla numérica presionada y valida
; que no sea una tecla de función en caso de 'C' entra a la sección
; de "Cambio de Clave"
;----------------------- ----------------- ------------ -------------------------------------------------------------------------------
ECOD42
CALL SUELKEY
CALL ESPEKEY
MOVWF COD4
SUBLW 'A'
BTFSC STATUS,2
GOTO INCOR
MOVF COD4,W
MOVLW 01H ; Leemos el registro de la EEPROM
CALL LEECOD ; donde se encuentra almacenado el código correcto
SUBWF COD2 ; Comparamos las teclas
BTFSS STATUS,2 ;
GOTO INCOR ; Si la tecla es incorrecta
MOVLW 02H ; Leemos el registro de la EEPROM
CALL LEECOD ; donde se encuentra almacenado el código correcto
SUBWF COD3 ; Comparamos las teclas
BTFSS STATUS,2 ;
GOTO INCOR ; Si la tecla es incorrecta
MOVLW 03H ; Leemos el registro de la EEPROM
CALL LEECOD ; donde se encuentra almacenado el código correcto
SUBWF COD4 ; Comparamos las teclas
BTFSS STATUS,2 ;
GOTO INCOR ; Si la tecla es incorrecta
CALL CLEARL ; CLAVE CORRECTA
MOVLW 02H ; Colocamos en posición
CALL SITUCU ; el cursor para escribir en el LCD
MOVLW MEN_2 ; Escribimos el Mensaje
CALL ESCMEN ; de bienvenida
MOVLW 03H ; Reinicia
MOVWF INTENTO ; el número de intentos
BSF PORTERO ; Activa mecanismo de apertura
MOVLW T_RELE ;
CALL DELAY ; Esperamos el tiempo dado por T_RELE
BCF PORTERO ; Desactivamos mecanismo de apertura
MOVLW 10H
CALL DELAY
GOTO PRINCI ; Reiniciamos el sistema
;-----------------------------------------------------------------------------------------------------------------------------------
;INCOR: La clave fue incorrecta y envía el mensaje al LCD
;--------------------------------------------------------------------------------------------- --------------------------------------
INCOR
MOVLW 0CH
CALL COMANDO
CALL CLEARL
MOVLW MEN_3 ;Escribeelmensajedeclave incorrecta
CALL ESCMEN ;
DECFSZ INTENTO,F; Decrementa el número de intentos disponibles
GOTO INCOR2 ; Si aún quedan intentos disponibles
GOTO ALARMA ; Si se acabaron los intentos activa la "Alarma"
INCOR2
MOVLW 20H ;Esperauntiempoantesde
CALL DELAY ; Poder intentar el ingreso
GOTO PRINCI
;----------------------- -------------------- --------- -------------------------------------------------------------------------------
;ALARMA: Después de 3 intentos incorrectos de acceso se activa
; la alarma
;-----------------------------------------------------------------------------------------------------------------------------------
ALARMA
MOVLW 1EH
MOVWF TECLA
ALARMA4
MOVLW 03H ;Reiniciamoselnumerodeintentos
MOVWF INTENTO ;disponibles
MOVLW 00FH
MOVWF CUENTA1
MOVLW 030H
MOVWF CUENTA2
ALARMA1
MOVLW 20H
MOVWF CUENTA4
DECF CUENTA1,F
BTFSC STATUS,2
GOTO ALARMA2
ALARMA3
BSF ALA ; Enciende
CALL FRECU ; Frecuencia de apagado y encendido
BCF ALA ; Apaga
CALL FRECU
DECFSZ CUENTA4,F
GOTO ALARMA3
GOTO ALARMA1
ALARMA2
MOVLW 01H
CALL DELAY
DECFSZ TECLA,F
GOTO ALARMA4
GOTO PRINCI
FRECU
MOVF CUENTA1,W
MOVWF CUENTA3
FRECU2
DECFSZ CUENTA3,F
GOTO FRECU2
DECFSZ CUENTA2,F
GOTO FRECU
MOVLW 030H
MOVWF CUENTA2
RETURN ;-----------------------------------------------------------------------------------------------------------------------------------
;CAMBIOC: Este modulo Cambia la clave almacenada ;-----------------------------------------------------------------------------------------------------------------------------------
CAMBIOC
CALL CLEARL
MOVLW MEN_4 ; 'CAMBIO DE'
CALL ESCMEN ; Escribe el mensaje
MOVLW MEN_5 ; ' CLAVE'
CALL ESCMEN ; Escribe el mensaje
MOVLW 20H
CALL DELAY ; Retardo
CALL CLEARL ; Limpiamos el Display
MOVLW MEN_5 ; ' CLAVE'
CALL ESCMEN ; Escribe el mensaje
MOVLW MEN_6 ; ' ANTIGUA'
CALL ESCMEN ; Escribe el mensaje
CALL SUELKEY ; Espera a que se deje de presionar la tecla
MOVLW 44H
CALL SITUCU ; Colocamos el cursor en la línea siguiente
CALL COGECOD ; Obtiene el Código Tecleado
MOVLW 00H ; Dirección de la EEPROM donde está almacenado el digito
CALL LEECOD ; Lee el Código de le EEPROM y lo regresa en el acumulador
SUBWF COD1 ; compara el código almacenado con el tecleado
BTFSS STATUS,2 ;
GOTO INCORE ; Si no es igual
; Si es igual compara el siguiente digito
MOVLW 01H ; Dirección de la EEPROM donde está almacenado el digito
CALL LEECOD ; Lee el Código de le EEPROM y lo regresa en el acumulador
SUBWF COD2 ; compara el código almacenado con el tecleado
BTFSS STATUS,2 ;
GOTO INCORE ; Si no es igual
; Si es igual compara el siguiente digito
MOVLW 02H ; Dirección de la EEPROM donde está almacenado el digito
CALL LEECOD ; Lee el Código de le EEPROM y lo regresa en el acumulador
SUBWF COD3 ; compara el código almacenado con el tecleado
BTFSS STATUS,2 ;
GOTO INCORE ; Si no es igual
; Si es igual compara el siguiente digito
MOVLW 03H ; Dirección de la EEPROM donde está almacenado el digito
CALL LEECOD ; Lee el Código de le EEPROM y lo regresa en el acumulador
SUBWF COD4 ; compara el código almacenado con el tecleado
BTFSS STATUS,2 ;
GOTO INCORE ; Si no es igual
MOVLW 03H ; Si el código fue correcto
MOVWF INTENTO ; Reiniciamos el número de intentos
;-----------------------------------------------------------------------------------------------------------------------------------
;NUEVACL: Capturamos y verificamos la nueva clave y se almacena
; en la EEPROM
;--------------------------------------------------------------------------------- --------------------------------------------------
NUEVACL
CALL CLEARL ; Limpiamos el Display
MOVLW 02H
CALL SITUCU ; Colocamos el cursor en la primera línea
MOVLW MEN_7 ; 'NUEVA'
CALL ESCMEN ; Escribimos el mensaje
MOVLW MEN_5 ; ' CLAVE'
CALL ESCMEN ; Escribimos el mensaje
MOVLW 44H ; Cambiamos de línea
CALL SITUCU ;
CALL SUELKEY ; Esperamos que se libere la tecla
CALL COGECOD ; Leemos el nuevo código
MOVF COD1,W ; Copiamos COD1 para verificar posteriormente
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD1A ; Almacenamos COD1 en COD1A
MOVF COD2,W ; Copiamos COD2 para verificar posteriormente
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD2A ; Almacenamos COD2 en COD2A
MOVF COD3,W ; Copiamos COD3 para verificar posteriormente
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD3A ; Almacenamos COD3 en COD3A
MOVF COD4,W ; Copiamos COD4 para verificar posteriormente
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD4A ; Almacenamos COD4 en COD4A
CALL CLEARL ;VERIFIQUE CLAVE
MOVLW MEN_8 ; 'VERIFIQUE'
CALL ESCMEN ; Escribe mensaje
MOVLW MEN_5 ; ' CLAVE'
CALL ESCMEN ; Escribe mensaje
MOVLW 44H ; Colocamos el cursor en la segunda línea
CALL SITUCU ;
CALL SUELKEY ;
CALL COGECOD ; Obtiene el código
MOVF COD1,W ; Compara el COD1 con COD1A
SUBWF COD1A,W ;
BTFSS STATUS,2 ;
GOTO NOVERI ; Si COD1 != COD1A
MOVF COD2,W ; Si COD1 = COD1A continuamos comparando
SUBWF COD2A,W ; COD2 contra COD2A
BTFSS STATUS,2;
GOTO NOVERI ; Si COD2 != COD2A
MOVF COD3,W ; Si COD2 = COD2A continuamos comparando
SUBWF COD3A,W ;
BTFSS STATUS,2;
GOTO NOVERI ; Si COD3 != COD3A
MOVF COD4,W ; Si COD3 = COD3A continuamos comparando
SUBWF COD4A,W ;
BTFSS STATUS,2;
GOTO NOVERI ; Si COD4 != COD4A
; Si COD4 = COD4A continuamos
CALL CLEARL ;CLAVE CAMBIADA
MOVLW MEN_5 ; ' CLAVE'
CALL ESCMEN ; Escribe mensaje
MOVLW MEN_9 ; ' CAMBIADA'
CALL ESCMEN ; Escribe mensaje
MOVF COD1,W ; Guarda en CODWRITE el
MOVWF CODWRITE ; digito que se almacenara en EEPROM
MOVLW 00H ; Dirección donde guardara el digito
CALL EEWRITE ; almacena en EEPROM la clave
MOVF COD2,W ; Guarda en CODWRITE el
MOVWF CODWRITE ; digito que se almacenara en EEPROM
MOVLW 01H ; Dirección donde guardara el digito
CALL EEWRITE ; almacena en EEPROM la clave
MOVF COD3,W ; Guarda en CODWRITE el
MOVWF CODWRITE ; digito que se almacenara en EEPROM
MOVLW 02H ; Dirección donde guardara el digito
CALL EEWRITE ; almacena en EEPROM la clave
MOVF COD4,W ; Guarda en CODWRITE el
MOVWF CODWRITE ; digito que se almacenara en EEPROM
MOVLW 03H ; Dirección donde guardara el digito
CALL EEWRITE ; almacena en EEPROM la clave
MOVLW 20H
CALL DELAY
GOTO PRINCI
;--------------------------------------------------------- --------------------------------------------------------------------------
;NOVERI: Identifica un error al ingresar la clave nueva
; por segunda vez
;----------------------------------------------------------------- ------------------------------------------------------------------
NOVERI
CALL CLEARL ; Limpia LCD
MOVLW 03H ;
CALL SITUCU ; Colocamos el cursor en la primera línea
MOVLW MEN_12 ; 'INTENTELO'
CALL ESCMEN ; Escribe Mensaje
MOVLW 43H ;
CALL SITUCU ; Colocamos el cursor en la segunda línea
MOVLW MEN_13 ; 'DE NUEVO'
CALL ESCMEN ; Escribe mensaje
MOVLW 20H
CALL DELAY
GOTO NUEVACL
;--------------------------------------------------------------------------------------------- --------------------------------------
;INCOREC: Despliega un mensaje cuando suscita un error al
; introducir el código
INCOREC
CALL CLEARL ;LA CLAVE DEBE TENER 4 DIGITOS
MOVLW MEN_10 ; 'LA CLAVE DEBE'
CALL ESCMEN ; Escribe mensaje
MOVLW 40H
CALL SITUCU ; Cursor a segunda línea
MOVLW MEN_11 ; 'TENER 4 DIGITOS'
CALL ESCMEN ; Escribe mensaje
MOVLW 20H
CALL DELAY
GOTO PRINCI
INCORE
DECF INTENTO,F; Decrementa el número de intentos
BTFSC STATUS,2 ; verifica que aun existan intentos
GOTO ALARMA ; si no hay intentos activa ALARMA
CALL CLEARL ; Limpia Display
MOVLW MEN_3 ; 'CLAVE INCORRECTA'
CALL ESCMEN ; Escribe Mensaje
MOVLW 20H
CALL DELAY
CALL SUELKEY ; Esperamos a que suelte la tecla
GOTO PRINCI
;-----------------------------------------------------------------------------------------------------------------------------------
;COGECOD: Lee el código y lo compara con el antiguo
;-----------------------------------------------------------------------------------------------------------------------------------
COGECOD
CLRF COD1 ; Limpiamos las variables
CLRF COD2
CLRF COD3
CLRF COD4
;-----------------------------------------------------------------------------------------------------------------------------------
;ECOD12C: Lee la primera tecla del código y verifica
; que sea numérica
;-----------------------------------------------------------------------------------------------------------------------------------
ECOD12C
CALL SUELKEY ;Esperamosaquesueltelatecla
CALL ESPEKEY ;Esperamosaquesepresionelatecla
MOVWF COD1 ;
SUBLW 'A'
BTFSC STATUS,2
RETURN ;Sies'A'
MOVF COD1,W ;Sinoes'A'verificamos'C'
SUBLW 'C'
BTFSC STATUS,2
GOTO ECOD12C ;Sies'C'
MOVLW '*' ;Sinoes'C'
CALL WRITEL ;Escribimos'*'enpantalla
;-----------------------------------------------------------------------------------------------------------------------------------
;ECOD22C: Lee la segunda tecla del código y verifica
; que sea numérica
;----------------------- ------------------------ ----- -------------------------------------------------------------------------------
ECOD22C
CALL SUELKEY ;Esperamos a que suelte la tecla
CALL ESPEKEY ; Esperamos a que se presione la tecla
MOVWF COD1 ;
SUBLW 'A'
BTFSC STATUS,2
RETURN ;Sies'A'
MOVF COD1,W ;Sinoes'A'verificamos'C'
SUBLW 'C'
BTFSC STATUS,2
GOTO ECOD22C ;Sies'C'
MOVLW '*' ;Sinoes'C'
CALL WRITEL ;Escribimos'*'enpantalla
;----------------------------------------- ------------------------------------------------------------------------------------------
;ECOD32C: Lee la tercera tecla del código y verifica
3 comentarios