Instrucciones.
Empleando el PIC16F84A realizar el código e implementación física del funcionamiento de un seguro electrónico usando de apoyo una LCD para mostrar mensajes que soliciten el código de acceso para el desbloqueo del seguro así como los mensajes correspondientes para indicar un acceso denegado por dar un código erróneo y un acceso por dar el código de seguridad correcto; además un teclado matricial con el cual se tecleara el código solicitado. También se deben de utilizar dos LED’s (uno rojo y uno verde) que se encenderán dependiendo del estado del acceso que se halla generado con el código de activación ingresado en el teclado; encenderá el verde si se da acceso y desbloqueo del seguro y encenderá el rojo si se niega el acceso. Emplear para el uso de la LCD la configuración en la cual se reciben los datos en dos partes, es decir, separar los datos en sus dos nibles (superior e inferior).
Nota:
Descripción del programa.
El código generado es bastante complejo en cuanto a su construcción con las instrucciones del PIC16F84A, pero fácil en cuanto al algoritmo seguido. Cabe mencionar que para evitar usar un archivo “.asm” muy largo en líneas de código, todas las instrucciones para el manejo de la LCD y algunas rutinas de tiempo fueron separadas en otro archivo con la extensión “.inc” para que así el compilador considerara a este archivo como una continuación del código principal. En general el programa se trata de estar continuamente realizando una detección de señales en el puerto B, que es donde se conecta el teclado, para así cuando se presione una tecla se reciba la posición de la tecla presionada mediante la detección de caída de tensión en los pines correspondientes a la fila y columna que pertenece la tecla. Empleando esta información se realiza una designación del carácter correspondiente y mediante una técnica de multiplexado se activa la mitad del puerto B como salida en un pequeño instante mandando el dato del carácter presionado hacia los pines 11, 12, 13 y 14 que reciben la información en nibles separados y muestran el carácter correspondiente. La cantidad de caracteres permitida como código es de 8, por lo que se emplea un contador que incrementa en uno cada vez que se ingresa un dato desde el teclado hacia la LCD, así al tener este un valor de 8 se terminara el proceso de revisar las caídas de tensión en las entradas y comenzara el proceso de comparación de los caracteres tecleados con los correctos para tener acceso en el seguro electrónico. Antes de que se realice la comparación los caracteres que se van tecleando al mismo tiempo se guardan en registros individuales que son designados por el valor del contador, esto se realiza mediante la cuestión ¿Qué valor tiene el contador en ese momento?, conociendo esto mediante simples restas se designa el registro donde se guardará el valor de la tecla presionada para formar la cadena de 8 caracteres que conforman el código de acceso. La comparación para saber si el código de acceso tecleado es el correcto o no se realiza mediante simples restas, activación de la “bandera de cero” (Z) en el registro STATUS y Página 1 de 12
toma de decisiones con este resultado. Las restas se hacen entre los registros donde se guardaron previamente los valores de los caracteres tecleados y los valores de los caracteres que se deben teclear para desbloquear el seguro electrónico (09030762); comenzando con el primer carácter tecleado se realiza la resta, cuando el carácter es el correcto simplemente se continua a realizar el mismo proceso de comparación pero para el siguiente carácter inmediato, en caso de que el carácter que se compara no concuerda con el establecido para el acceso una variable auxiliar incrementa en uno, esto se hace por cada carácter erróneo que se detecte. Con esta ultima variable auxiliar que lleva el conteo de los caracteres erróneos se toma la decisión si el código tecleado es correcto o no. Esto se realiza mediante la activación de la bandera de cero al mover este registro a la misma posición que esta, así si su valor es de cero (ningún carácter erróneo) se direcciona al mensaje de “CÓDIGO CORRECTO !”, pero si su valor no es de cero (al menos un carácter erróneo) se direcciona al mensaje “ ERROR!”. La parte del control de la LCD se trata básicamente de la programación de la inicialización que requiere este dispositivo, es decir, los comandos que necesita recibir antes que cualquier otro para que funcione adecuadamente. También se manejan algunas funciones que nos permiten el mandar comando e información (cada caso en una función diferente) hacia la LCD para que sea mostrada o realice alguna función como saltar de línea, borrar la pantalla, desaparecer el cursor, etc., esto se logra con la activación y desactivación secuencial de los pines designados para mandar señales a las entradas E y RS de la LCD. Cabe mencionar que las rutinas de tiempo programadas fueron para tener 40µs, 100µ, 1ms, 5ms, 15ms y 261, 892 µs. Los primeros son empleados para dar los tiempos que requiere el LCD en los comandos de su inicialización mientras que el último mencionado se deriva de una rutina de tiempo creada para mantener en la LCD durante un tiempo algún mensaje que se muestre, como por ejemplo el mensaje de “BIENVENIDO ” mostrado cada vez que se enciende o reinicia el PIC o el mensaje de “PROCESANDO …” que aparece posteriormente a ingresar los 8 caracter es para el código de acceso. Código. #INCLUDE
__CONFIG _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_OFF #DEFINE BUS #DEFINE RS #DEFINE E #DEFINE R_LED #DEFINE G_LED #DEFINE COL1 #DEFINE COL2 #DEFINE COL3 #DEFINE COL4 CBLOCK 0CH CMD DATO VAR1 VAR2 VAR3 FILA COLUMNA COUNT MAL VALUE NUM1
PORTB ; Directivas del PIC16F84A y definiciones de PORTA,0 ; pines para reconocimiento reconocimiento rápido en su PORTA,1 ; manipulación. manipulación. PORTA,2 PORTA,3 PORTB,4 PORTB,5 PORTB,6 PORTB,7 ; Variables auxiliares para el manejo de la información.
Página 2 de 12
ENDC ORG BSF CLRF MOVLW
INI_TCL:
NUM2 NUM3 NUM4 NUM5 NUM6 NUM7 NUM8 0000H STATUS,RP0 TRISA 0F0H
; ; ; ;
MOVWF BCF BCF CLRF CLRF CALL CALL MOVLW CALL CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL CALL CALL CALL CALL CALL CALL MOVLW CALL CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL BSF CLRF CLRF
Origen del programa. Cambio al banco 1 para definir entradas y salidas. Designación del puerto A como salida. Carga del valor “11110000” al puerto B para designarlo con la mitad como entrada y la mitad TRISB como salida. OPTION_REG,NOT_RBPU OPTION_REG,N OT_RBPU ; Activación de las resistencias Pull Up. STATUS,RP0 ; Cambio al banco 0. PORTA ; Limpieza de los puertos A y B para asegurar que PORTB estos no contengan datos basura. LCD_INI ; Llamada a la inicialización inicialización dela LCD. LCD_CONFIG ; Llamada a la configuración configuraci ón de la LCD. 01H ; Carga de un 1 al registro de trabajo para mandarlo LCD_CMND como comando a la LCD y esta se borre. T_15MS ; Tiempo necesario para el comando de borrar la LCD. " " ; Carga de caracteres y envío de estos como datos LCD_DATA hacia la LCD para obtener el mensaje de BIENVENIDO " " al encender o resetear el PIC. LCD_DATA " " LCD_DATA "B" LCD_DATA "I" LCD_DATA "E" LCD_DATA "N" LCD_DATA "V" LCD_DATA "E" LCD_DATA "N" LCD_DATA "I" LCD_DATA "D" LCD_DATA "O" LCD_DATA T_1R ; Llama a la rutina de tiempo de 261, 892µs para T_1R mantener el mensaje de BIENVENIDO un momento en T_1R la pantalla de la LCD. T_1R T_1R T_1R 01H ; Se vuelve a cargar y enviar un 1 como comando para LCD_CMND borrar la pantalla de la LCD y mostrar un mensaje T_15MS posterior. "C" ; Carga y envío de los caracteres a la LCD para LCD_DATA mostrar un mensaje de solicitud del código de "O" activación (CODIGO:). LCD_DATA "D" LCD_DATA "I" LCD_DATA "G" LCD_DATA "O" LCD_DATA ":" LCD_DATA 0C0H LCD_CMND R_LED MAL COUNT
MOVLW SUBWF
08H COUNT,0
; Carga del valor de 8 para realizar la comparación del valor del contador y determinar el termino de
Página 3 de 12
BTFSC GOTO
STATUS,Z REVISAR
MOVLW MOVWF MOVF CALL MOVWF CALL BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO DECFSZ GOTO GOTO
04H FILA FILA,0 CEROS BUS T_15MS COL1 COLUMNA1 COL2 COLUMNA2 COL3 COLUMNA3 COL4 COLUMNA4 FILA,1 CCL_TCL INI_TCL
ASCII:
MOVWF CALL MOVWF CALL INCF CALL GOTO
COLUMNA CARACTER VALUE LCD_DATA COUNT,1 GUARDA CCL_TCL
CARACTER:
ADDWF PCL,1 DT "0123456789ABCD#*" "0123456789ABCD#*" RETURN
CEROS:
ADDWF RETLW RETLW RETLW RETLW RETLW RETURN
PCL,1 B'1111' B'0111' B'1011' B'1101' B'1110'
; Esta rutina da la cadena de bits que designa la posición en fila de la tecla que se presione.
COLUMNA1:
BTFSS GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVLW GOTO
COL1 $-1 FILA,0 04H STATUS,Z $+3 D'1' ASCII FILA,0 03H STATUS,Z $+3 D'4' ASCII FILA,0 02H STATUS,Z $+3 D'7' ASCII D'14' ASCII
; Función que realiza la revisión de la columna 1 del teclado para asignar el valor correspondiente correspondiente a la tecla que se presione en caso de que esta sea de dicha columna.
COLUMNA2:
BTFSS GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW
COL2 $-1 FILA,0 04H STATUS,Z $+3 D'2' ASCII FILA,0 03H STATUS,Z $+3 D'5' ASCII FILA,0 02H
; Función que realiza la revision de la columna 2 del teclado para asignar el valor correspondiente correspondiente a la tecla que se presione en caso de que esta sea de dicha columna.
CCL_TCL:
la revisión de los pines para el teclado debido a ya haber ingresado 8 caracteres para el código. ; Carga de un valor de 4 para realizar la revisión de la caída de tensión en alguna de las 4 filas del teclado. ; Llamada a la función de ceros que entrega la cadena de 4 bits que indica la posición en fila de la tecla que se detecte presionada. ; Revisión y llamada de las funciones para obtener la posición en columna de la tecla que se detecte como presionada debido a la caída de tensión provocada.
; Regreso para otra revisión de las columnas. ; Regreso para otra revisión de las filas y posteriormente posteriormente columnas. ; Rutina empleada para obtener el valor del carácter que se presione, se guarde en los registros auxiliares para la posterior comparación, se muestre en la LCD y se incremente el contador para los 8 caracteres del código de acceso.
; Rutina con los posibles caracteres que se generan al presionar una tecla.
Página 4 de 12
BTFSS GOTO MOVLW GOTO MOVLW GOTO
STATUS,Z $+3 D'8' ASCII D'0' ASCII
COLUMNA3:
BTFSS GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVLW GOTO
COL3 $-1 FILA,0 04H STATUS,Z $+3 D'3' ASCII FILA,0 03H STATUS,Z $+3 D'6' ASCII FILA,0 02H STATUS,Z $+3 D'9' ASCII D'15' ASCII
; Función que realiza la revisión de la columna 3 del teclado para asignar el valor correspondiente correspondiente a la tecla que se presione en caso de que esta sea de dicha columna.
COLUMNA4:
BTFSS GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVF SUBLW BTFSS GOTO MOVLW GOTO MOVLW GOTO
COL4 $-1 FILA,0 04H STATUS,Z $+3 D'10' ASCII FILA,0 03H STATUS,Z $+3 D'11' ASCII FILA,0 02H STATUS,Z $+3 D'12' ASCII D'13' ASCII
; Función que realiza la revisión de la columna 4 del teclado para asignar el valor correspondiente correspondiente a la tecla que se presione en caso de que esta sea de dicha columna.
T_1R:
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF NOP DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO CLRW RETURN
D'1' VAR1 D'255' VAR2 D'255' VAR3
; Rutina de tiempo que tarda 261, 892µs.
MOVF SUBLW BTFSC GOTO MOVF SUBLW BTFSC GOTO MOVF SUBLW BTFSC GOTO
COUNT,0 01H STATUS,Z GUARDA1 COUNT,0 02H STATUS,Z GUARDA2 COUNT,0 03H STATUS,Z GUARDA3
GUARDA:
VAR3,1 $-2 VAR2,1 $-6 VAR1,1 $-10
; Esta función realiza el guardado de los valores de los caracteres que se vallan presionando en el teclado en las variables NUM1 a NUM8 según la posición del carácter que indica el contador de la cantidad de caracteres para el código de acceso.
Página 5 de 12
GUARDA1: GUARDA2: GUARDA3: GUARDA4: GUARDA5: GUARDA6: GUARDA7: GUARDA8:
REVISAR:
MOVF SUBLW BTFSC GOTO MOVF SUBLW BTFSC GOTO MOVF SUBLW BTFSC GOTO MOVF SUBLW BTFSC GOTO MOVF SUBLW BTFSC GOTO MOVF MOVWF RETURN MOVF MOVWF RETURN MOVF MOVWF RETURN MOVF MOVWF RETURN MOVF MOVWF RETURN MOVF MOVWF RETURN MOVF MOVWF RETURN MOVF MOVWF RETURN
COUNT,0 04H STATUS,Z GUARDA4 COUNT,0 05H STATUS,Z GUARDA5 COUNT,0 06H STATUS,Z GUARDA6 COUNT,0 07H STATUS,Z GUARDA7 COUNT,0 08H STATUS,Z GUARDA8 VALUE,0 NUM1
MOVLW SUBWF BTFSS INCF
30H NUM1,0 STATUS,Z MAL,1
MOVLW SUBWF BTFSS INCF
39H NUM2,0 STATUS,Z MAL,1
MOVLW SUBWF BTFSS INCF
30H NUM3,0 STATUS,Z MAL,1
MOVLW SUBWF BTFSS INCF
33H NUM4,0 STATUS,Z MAL,1
MOVLW SUBWF BTFSS INCF
30H NUM5,0 STATUS,Z MAL,1
MOVLW SUBWF BTFSS INCF
37H NUM6,0 STATUS,Z MAL,1
MOVLW SUBWF BTFSS INCF
36H NUM7,0 STATUS,Z MAL,1
MOVLW
32H
VALUE,0 NUM2 VALUE,0 NUM3 VALUE,0 NUM4 VALUE,0 NUM5 VALUE,0 NUM6 VALUE,0 NUM7 VALUE,0 NUM8 ; Carga el carácter 0 para la comparación del primer carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el primer carácter sea erróneo. ; Carga el carácter 9 para la comparación del segundo carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el segundo carácter sea erróneo. ; Carga el carácter 0 para la comparación del tercer carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el tercer carácter sea erróneo. ; Carga el carácter 3 para la comparación del cuarto carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el cuarto carácter sea erróneo. ; Carga el carácter 0 para la comparación del quinto carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el quinto carácter sea erróneo. ; Carga el carácter 7 para la comparación del sexto carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el sexto carácter sea erróneo. ; Carga el carácter 6 para la comparación del séptimo carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el séptimo carácter sea erróneo. ; Carga el carácter 2 para la comparación del octavo
Página 6 de 12
SUBWF BTFSS INCF
NUM8,0 STATUS,Z MAL,1
CALL PROCESA GOTO $+0 RETURN PROCESA:
F_PROS: C_CORR:
carácter en el código de acceso. ; Incremento de la variable MAL en caso de que el Octavo carácter sea erróneo.
MOVF BTFSC GOTO GOTO RETURN
MAL,1 STATUS,Z C_CORR C_INCR
; Esta rutina verifica el valor que tiene MAL y si es 0 direcciona hacia el mensaje de acceso y al mensaje de acceso denegado cuando es mayor a 0.
MOVLW CALL CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL MOVLW CALL CALL BSF BCF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW
01H LCD_CMND T_15MS "P" LCD_DATA "R" LCD_DATA "O" LCD_DATA "C" LCD_DATA "E" LCD_DATA "S" LCD_DATA "A" LCD_DATA "N" LCD_DATA "D" LCD_DATA "O" LCD_DATA "." LCD_DATA "." LCD_DATA "." LCD_DATA T_1R T_1R T_1R T_1R T_1R T_1R T_1R T_1R T_1R T_1R 01H LCD_CMND T_15MS G_LED R_LED "C" LCD_DATA "O" LCD_DATA "D" LCD_DATA "I" LCD_DATA "G" LCD_DATA "O" LCD_DATA " " LCD_DATA "C" LCD_DATA "O" LCD_DATA "R" LCD_DATA "R" LCD_DATA "E"
; Muestra de los mensajes “PROCESANDO…” y “CODIGO CORRECTO” en la LCD.
Página 7 de 12
C_INCR:
CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL GOTO
LCD_DATA "C" LCD_DATA "T" LCD_DATA "O" LCD_DATA "!" LCD_DATA F_PROS
MOVLW CALL CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL MOVLW CALL CALL BSF BCF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL GOTO
01H LCD_CMND T_15MS "P" LCD_DATA "R" LCD_DATA "O" LCD_DATA "C" LCD_DATA "E" LCD_DATA "S" LCD_DATA "A" LCD_DATA "N" LCD_DATA "D" LCD_DATA "O" LCD_DATA "." LCD_DATA "." LCD_DATA "." LCD_DATA T_1R T_1R T_1R T_1R T_1R T_1R T_1R T_1R T_1R T_1R 01H LCD_CMND T_15MS R_LED G_LED "E" LCD_DATA "R" LCD_DATA "R" LCD_DATA "O" LCD_DATA "R" LCD_DATA "!" LCD_DATA F_PROS
#INCLUDE
; Muestra de los mensajes “PROCESANDO…” “PROCESANDO…” y “ERROR!” en la LCD.
END
; Inclusión del archivo con las funciones para la LCD. ; Fin del código.
LCD.INC LCD_INI:
BSF CLRF MOVLW MOVWF
STATUS,RP0 TRISA B'11110000' TRISB
; Función que realiza la configuración configuració n de inicialización inicialización para la LCD.
Página 8 de 12
BCF CLRF CLRF CALL MOVLW MOVWF CALL CALL MOVLW MOVWF CALL CALL MOVLW MOVWF CALL CALL MOVLW MOVWF CALL CALL RETURN
STATUS,RP0 PORTA PORTB T_15MS 03H BUS SIG_CMD T_5MS 03H BUS SIG_CMD T_100US 03H BUS SIG_CMD T_40US 02H BUS SIG_CMD T_40US
SIG_CMD:
BCF BSF BCF BCF CLRF RETURN
RS E E RS BUS
LCD_CONFIG: LCD_CONFIG:
MOVLW CALL MOVLW CALL MOVLW CALL RETURN
06H LCD_CMND 0FH LCD_CMND 2CH LCD_CMND
LCD_CMND:
MOVWF SWAPF ANDLW MOVWF CALL MOVF ANDLW MOVWF CALL CALL RETURN
CMD CMD CMD,0 0FH BUS SIG_CMD CMD,0 0FH BUS SIG_CMD T_40US
; Función que permite mandar un valor como comando para la LCD.
LCD_DATA:
MOVWF SWAPF ANDLW MOVWF CALL MOVF ANDLW MOVWF CALL CALL RETURN
DATO DATO,0 0FH BUS SIG_DATA DATO,0 0FH BUS SIG_DATA T_40US
; Función que permite mandar un valor como dato para la LCD.
SIG_DATA:
BSF BSF BCF BCF CLRF RETURN
RS E E RS BUS
T_100US:
MOVLW MOVWF NOP DECFSZ GOTO NOP RETURN
D'23' VAR1
MOVLW MOVWF NOP DECFSZ GOTO
D'8' VAR1
T_40US:
; Rutina de tiempo de 100µs.
VAR1,1 $-2
; Rutina de tiempo de 40µs.
VAR1,1 $-2
Página 9 de 12
NOP RETURN T_1MS:
MOVLW MOVWF NOP DECFSZ GOTO NOP RETURN
D'248' VAR1
; Rutina de tiempo de 1ms.
T_15MS:
CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL RETURN
T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS T_1MS
; Rutina de tiempo de 15ms.
T_5MS:
CALL CALL CALL CALL CALL RETURN END
T_1MS T_1MS T_1MS T_1MS T_1MS
; Rutina de tiempo de 5ms.
VAR1,1 $-2
Simulación.
En esta simulación se empleó un esquemático del PIC16F84A totalmente diferente, como se muestra en la figura 1. Ahora, se utilizaron dos componentes nuevos: un display LCD de dos líneas y un teclado matricial. De esta misma forma, fueron colocados dos indicadores LED, uno color rojo y otro color verde. Estos LED indican si el motor abrirá o cerrará la caja fuerte dependiendo si el código introducido mediante el teclado matricial es el correcto. La conexión de todos los componentes del esquemático en Proteus fue realizada exitosamente gracias los circuitos vistos en clase, además de las presentaciones acerca del LCD y teclado matricial, en las cuales se indica el funcionamiento a detalle de uno.
Página 10 de 12
Figura 1. Diseño del circuito requerido en la práctica en Proteus utilizando el PIC16F84A.
EL teclado matricial presentado en el paquete de simulación es distinto al de la práctica en físico, debido a que este presenta operadores y otros botones, pero en el modo de operación son exactamente iguales. Probando el funcionamiento del código, se cargo el archivo .cof al PIC y en el primer instante de la simulación aparece en el display la palabra “BIENVENIDO”, vista en la figura 2. Después de pocos segundos, el programa sigue, borra del LCD los anteriores caracteres y ahora el PIC coloca en él la palabra “CÓDIGO”, como se observa en la figura 3. En este paso, ya se requiere colocar la cadena de bits o caracteres, combinados o no, que permitan la apertura de la caja fuerte.
Figura 2.Inicio de la simulación, LCD mostrando la palabra “BIENVENIDO”.
Página 11 de 12
Figura 3.”CODIGO:”, segunda palabra mostrada en el LCD, una vez terminada la parte de bienvenida.
Ahora, se procede con la introducción del código mediante el teclado matricial. Por programación, se sabe que la cuarta columna mostrada de izquierda a derecha representa las letras A, B, C y D en orden descendente y que la cuarta fila de arriba hacia abajo representa a los símbolos *, #, 0 y D, en vez de lo que se tiene en el teclado del esquemático. Si se introduce un código erróneo de 8 caracteres, en este caso 77777777, el programa escribirá en el LCD “PROCESANDO” , para luego mostrar unos instantes después la palabra “ERROR!” al mismo tiempo que el LED que indica la caja permanece cerrada se enciende (color rojo), visto en la figura 4.
Figura 4.Secuencia dada en la simulación después de la introducción de un código erróneo.
Una vez mostrado el mensaje de error, es necesario reiniciar el PIC y por ende se debe presionar el botón de reinicio, ubicado en la parte izquierda del esquemático. De nueva cuenta se mostrarán los mensajes de bienvenida y código; introduciendo el código correcto (09030762) ocurre la secuencia vista en la figura 5: Se coloca también la palabra “PROCESANDO” y unos instantes después se muestra un mensaje de que el código introducido al teclado si fue el requerido: “CODIGO CORRECTO!”. Además, el LED que indica la apertura de la caja fuerte (LED verde) es encendido.
Figura 5.Secuencia dada en la simulación después de la introducción de un código correcto.
Página 12 de 12