código y simulación de caja fuerte pic16f84a

16
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. Nota: 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). 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 Página 1 de 16

Upload: serolfitnas

Post on 24-Jul-2015

1.371 views

Category:

Documents


34 download

TRANSCRIPT

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.

Nota: 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).

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 13

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 caracteres para el código de acceso.

Código.

#INCLUDE <P16F84.INC>__CONFIG _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_OFF

#DEFINE BUS PORTB ; Directivas del PIC16F84A y definiciones de#DEFINE RS PORTA,0 ; pines para reconocimiento rápido en su#DEFINE E PORTA,1 ; manipulación.#DEFINE R_LED PORTA,2#DEFINE G_LED PORTA,3#DEFINE COL1 PORTB,4#DEFINE COL2 PORTB,5#DEFINE COL3 PORTB,6#DEFINE COL4 PORTB,7CBLOCK 0CH ; Variables auxiliares para el manejo de la

CMD información.DATOVAR1VAR2VAR3FILACOLUMNACOUNT

Página 2 de 13

MALVALUENUM1NUM2NUM3NUM4NUM5NUM6NUM7NUM8

ENDC

ORG 0000H ; Origen del programa.BSF STATUS,RP0 ; Cambio al banco 1 para definir entradas y salidas.CLRF TRISA ; Designación del puerto A como salida.MOVLW 0F0H ; Carga del valor “11110000” al puerto B para

designarlo con la mitad como entrada y la mitadMOVWF TRISB como salida.BCF OPTION_REG,NOT_RBPU ; Activación de las resistencias Pull Up.BCF STATUS,RP0 ; Cambio al banco 0.CLRF PORTA ; Limpieza de los puertos A y B para asegurar queCLRF PORTB estos no contengan datos basura.CALL LCD_INI ; Llamada a la inicialización dela LCD.CALL LCD_CONFIG ; Llamada a la configuración de la LCD.MOVLW 01H ; Carga de un 1 al registro de trabajo para mandarloCALL LCD_CMND como comando a la LCD y esta se borre.CALL T_15MS ; Tiempo necesario para el comando de borrar la LCD. MOVLW " " ; Carga de caracteres y envío de estos como datosCALL LCD_DATA hacia la LCD para obtener el mensaje de BIENVENIDOMOVLW " " al encender o resetear el PIC.CALL LCD_DATAMOVLW " "CALL LCD_DATAMOVLW "B"CALL LCD_DATAMOVLW "I"CALL LCD_DATAMOVLW "E"CALL LCD_DATAMOVLW "N"CALL LCD_DATAMOVLW "V"CALL LCD_DATAMOVLW "E"CALL LCD_DATAMOVLW "N"CALL LCD_DATAMOVLW "I"CALL LCD_DATAMOVLW "D"CALL LCD_DATAMOVLW "O"CALL LCD_DATACALL T_1R ; Llama a la rutina de tiempo de 261, 892µs paraCALL T_1R mantener el mensaje de BIENVENIDO un momento enCALL T_1R la pantalla de la LCD.CALL T_1RCALL T_1RCALL T_1RMOVLW 01H ; Se vuelve a cargar y enviar un 1 como comando paraCALL LCD_CMND borrar la pantalla de la LCD y mostrar un mensajeCALL T_15MS posterior.MOVLW "C" ; Carga y envío de los caracteres a la LCD paraCALL LCD_DATA mostrar un mensaje de solicitud del código deMOVLW "O" activación (CODIGO:).CALL LCD_DATAMOVLW "D"CALL LCD_DATAMOVLW "I"

Página 3 de 13

CALL LCD_DATAMOVLW "G"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW ":"CALL LCD_DATAMOVLW 0C0HCALL LCD_CMNDBSF R_LEDCLRF MALCLRF COUNT

INI_TCL: MOVLW 08H ; Carga del valor de 8 para realizar la comparaciónSUBWF COUNT,0 del valor del contador y determinar el termino deBTFSC STATUS,Z la revisión de los pines para el teclado debido aGOTO REVISAR ya haber ingresado 8 caracteres para el código.

MOVLW 04H ; Carga de un valor de 4 para realizar la revisión deMOVWF FILA la caída de tensión en alguna de las 4 filas del

CCL_TCL: MOVF FILA,0 teclado.CALL CEROS ; Llamada a la función de ceros que entrega la cadenaMOVWF BUS de 4 bits que indica la posición en fila de la teclaCALL T_15MS que se detecte presionada.BTFSS COL1 ; Revisión y llamada de las funciones para obtener laGOTO COLUMNA1 posición en columna de la tecla que se detecte comoBTFSS COL2 presionada debido a la caída de tensión provocada.GOTO COLUMNA2BTFSS COL3GOTO COLUMNA3BTFSS COL4GOTO COLUMNA4DECFSZ FILA,1GOTO CCL_TCL ; Regreso para otra revisión de las columnas.GOTO INI_TCL ; Regreso para otra revisión de las filas y

posteriormente columnas.

ASCII: MOVWF COLUMNA ; Rutina empleada para obtener el valor delCALL CARACTER carácter que se presione, se guarde en los registrosMOVWF VALUE auxiliares para la posterior comparación, seCALL LCD_DATA muestre en la LCD y se incremente el contador paraINCF COUNT,1 los 8 caracteres del código de acceso.CALL GUARDAGOTO CCL_TCL

CARACTER: ADDWF PCL,1 ; Rutina con los posibles caracteres que seDT "0123456789ABCD#*" generan al presionar una tecla.RETURN

CEROS: ADDWF PCL,1 ; Esta rutina da la cadena de bits que designa laRETLW B'1111' posición en fila de la tecla que se presione.RETLW B'0111'RETLW B'1011'RETLW B'1101'RETLW B'1110'RETURN

COLUMNA1: BTFSS COL1 ; Función que realiza la revisión de la columna 1 delGOTO $-1 teclado para asignar el valor correspondiente a laMOVF FILA,0 tecla que se presione en caso de que esta sea deSUBLW 04H dicha columna.BTFSS STATUS,ZGOTO $+3MOVLW D'1'GOTO ASCIIMOVF FILA,0SUBLW 03HBTFSS STATUS,ZGOTO $+3

Página 4 de 13

MOVLW D'4'GOTO ASCIIMOVF FILA,0SUBLW 02HBTFSS STATUS,ZGOTO $+3MOVLW D'7'GOTO ASCIIMOVLW D'14'GOTO ASCII

COLUMNA2: BTFSS COL2 ; Función que realiza la revision de la columna 2 delGOTO $-1 teclado para asignar el valor correspondiente a laMOVF FILA,0 tecla que se presione en caso de que esta sea de SUBLW 04H dicha columna.BTFSS STATUS,ZGOTO $+3MOVLW D'2'GOTO ASCIIMOVF FILA,0SUBLW 03HBTFSS STATUS,ZGOTO $+3MOVLW D'5'GOTO ASCIIMOVF FILA,0SUBLW 02HBTFSS STATUS,ZGOTO $+3MOVLW D'8'GOTO ASCIIMOVLW D'0'GOTO ASCII

COLUMNA3: BTFSS COL3 ; Función que realiza la revisión de la columna 3 delGOTO $-1 teclado para asignar el valor correspondiente a laMOVF FILA,0 tecla que se presione en caso de que esta sea deSUBLW 04H dicha columna.BTFSS STATUS,ZGOTO $+3MOVLW D'3'GOTO ASCIIMOVF FILA,0SUBLW 03HBTFSS STATUS,ZGOTO $+3MOVLW D'6'GOTO ASCIIMOVF FILA,0SUBLW 02HBTFSS STATUS,ZGOTO $+3MOVLW D'9'GOTO ASCIIMOVLW D'15'GOTO ASCII

COLUMNA4: BTFSS COL4 ; Función que realiza la revisión de la columna 4 delGOTO $-1 teclado para asignar el valor correspondiente a la

MOVF FILA,0 tecla que se presione en caso de que esta sea deSUBLW 04H dicha columna.BTFSS STATUS,ZGOTO $+3MOVLW D'10'GOTO ASCIIMOVF FILA,0SUBLW 03HBTFSS STATUS,ZGOTO $+3

Página 5 de 13

MOVLW D'11'GOTO ASCIIMOVF FILA,0SUBLW 02HBTFSS STATUS,ZGOTO $+3MOVLW D'12'GOTO ASCIIMOVLW D'13'GOTO ASCII

T_1R: MOVLW D'1' ; Rutina de tiempo que tarda 261, 892µs.MOVWF VAR1MOVLW D'255'MOVWF VAR2MOVLW D'255'MOVWF VAR3NOPDECFSZ VAR3,1GOTO $-2DECFSZ VAR2,1GOTO $-6DECFSZ VAR1,1GOTO $-10CLRWRETURN

GUARDA: MOVF COUNT,0 ; Esta función realiza el guardado de los valores de

SUBLW 01H los caracteres que se vallan presionando en elBTFSC STATUS,Z teclado en las variables NUM1 a NUM8 según laGOTO GUARDA1 posición del carácter que indica el contador deMOVF COUNT,0 la cantidad de caracteres para el código deSUBLW 02H acceso.BTFSC STATUS,ZGOTO GUARDA2MOVF COUNT,0SUBLW 03HBTFSC STATUS,ZGOTO GUARDA3MOVF COUNT,0SUBLW 04HBTFSC STATUS,ZGOTO GUARDA4MOVF COUNT,0SUBLW 05HBTFSC STATUS,ZGOTO GUARDA5MOVF COUNT,0SUBLW 06HBTFSC STATUS,ZGOTO GUARDA6MOVF COUNT,0SUBLW 07HBTFSC STATUS,ZGOTO GUARDA7MOVF COUNT,0SUBLW 08HBTFSC STATUS,ZGOTO GUARDA8

GUARDA1: MOVF VALUE,0MOVWF NUM1RETURN

GUARDA2: MOVF VALUE,0MOVWF NUM2RETURN

GUARDA3: MOVF VALUE,0MOVWF NUM3RETURN

Página 6 de 13

GUARDA4: MOVF VALUE,0MOVWF NUM4RETURN

GUARDA5: MOVF VALUE,0MOVWF NUM5RETURN

GUARDA6: MOVF VALUE,0MOVWF NUM6RETURN

GUARDA7: MOVF VALUE,0MOVWF NUM7RETURN

GUARDA8: MOVF VALUE,0MOVWF NUM8RETURN

REVISAR: MOVLW 30H ; Carga el carácter 0 para la comparación del primerSUBWF NUM1,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

primer carácter sea erróneo.MOVLW 39H ; Carga el carácter 9 para la comparación del segundoSUBWF NUM2,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

segundo carácter sea erróneo.MOVLW 30H ; Carga el carácter 0 para la comparación del tercerSUBWF NUM3,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

tercer carácter sea erróneo.MOVLW 33H ; Carga el carácter 3 para la comparación del cuartoSUBWF NUM4,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

cuarto carácter sea erróneo.MOVLW 30H ; Carga el carácter 0 para la comparación del quintoSUBWF NUM5,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

quinto carácter sea erróneo.MOVLW 37H ; Carga el carácter 7 para la comparación del sextoSUBWF NUM6,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

sexto carácter sea erróneo.MOVLW 36H ; Carga el carácter 6 para la comparación del séptimoSUBWF NUM7,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

séptimo carácter sea erróneo.MOVLW 32H ; Carga el carácter 2 para la comparación del octavoSUBWF NUM8,0 carácter en el código de acceso.BTFSS STATUS,ZINCF MAL,1 ; Incremento de la variable MAL en caso de que el

Octavo carácter sea erróneo.CALL PROCESAGOTO $+0RETURN

PROCESA: MOVF MAL,1 ; Esta rutina verifica el valor que tiene MAL y si esBTFSC STATUS,Z 0 direcciona hacia el mensaje de acceso y al mensajeGOTO C_CORR de acceso denegado cuando es mayor a 0.GOTO C_INCR

F_PROS: RETURN

C_CORR: MOVLW 01H ; Muestra de los mensajes “PROCESANDO…” yCALL LCD_CMND “CODIGO CORRECTO” en la LCD.CALL T_15MS

Página 7 de 13

MOVLW "P"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "C"CALL LCD_DATAMOVLW "E"CALL LCD_DATAMOVLW "S"CALL LCD_DATAMOVLW "A"CALL LCD_DATAMOVLW "N"CALL LCD_DATAMOVLW "D"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "."CALL LCD_DATAMOVLW "."CALL LCD_DATAMOVLW "."CALL LCD_DATACALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RMOVLW 01HCALL LCD_CMNDCALL T_15MSBSF G_LEDBCF R_LEDMOVLW "C"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "D"CALL LCD_DATAMOVLW "I"CALL LCD_DATAMOVLW "G"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW " "CALL LCD_DATAMOVLW "C"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "E"CALL LCD_DATAMOVLW "C"CALL LCD_DATAMOVLW "T"CALL LCD_DATA

Página 8 de 13

MOVLW "O"CALL LCD_DATAMOVLW "!"CALL LCD_DATAGOTO F_PROS

C_INCR: MOVLW 01H ; Muestra de los mensajes “PROCESANDO…” y “ERROR!” enCALL LCD_CMND la LCD.CALL T_15MSMOVLW "P"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "C"CALL LCD_DATAMOVLW "E"CALL LCD_DATAMOVLW "S"CALL LCD_DATAMOVLW "A"CALL LCD_DATAMOVLW "N"CALL LCD_DATAMOVLW "D"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "."CALL LCD_DATAMOVLW "."CALL LCD_DATAMOVLW "."CALL LCD_DATACALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RCALL T_1RMOVLW 01HCALL LCD_CMNDCALL T_15MSBSF R_LEDBCF G_LEDMOVLW "E"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "O"CALL LCD_DATAMOVLW "R"CALL LCD_DATAMOVLW "!"CALL LCD_DATAGOTO F_PROS

#INCLUDE <LCD.INC> ; Inclusión del archivo con las funciones para la LCD.

END ; Fin del código.

Página 9 de 13

LCD.INC

LCD_INI: BSF STATUS,RP0 ; Función que realiza la configuración de CLRF TRISA inicialización para la LCD.MOVLW B'11110000'MOVWF TRISBBCF STATUS,RP0CLRF PORTACLRF PORTBCALL T_15MSMOVLW 03HMOVWF BUSCALL SIG_CMDCALL T_5MSMOVLW 03HMOVWF BUSCALL SIG_CMDCALL T_100USMOVLW 03HMOVWF BUSCALL SIG_CMDCALL T_40USMOVLW 02HMOVWF BUSCALL SIG_CMDCALL T_40USRETURN

SIG_CMD: BCF RSBSF EBCF EBCF RSCLRF BUSRETURN

LCD_CONFIG: MOVLW 06HCALL LCD_CMNDMOVLW 0FHCALL LCD_CMNDMOVLW 2CHCALL LCD_CMNDRETURN

LCD_CMND: MOVWF CMD ; Función que permite mandar un valor como comandoSWAPF CMD,0 para la LCD.ANDLW 0FHMOVWF BUSCALL SIG_CMDMOVF CMD,0ANDLW 0FHMOVWF BUSCALL SIG_CMDCALL T_40USRETURN

LCD_DATA: MOVWF DATO ; Función que permite mandar un valor como dato paraSWAPF DATO,0 la LCD.ANDLW 0FHMOVWF BUSCALL SIG_DATAMOVF DATO,0ANDLW 0FHMOVWF BUSCALL SIG_DATACALL T_40USRETURN

SIG_DATA: BSF RS

Página 10 de 13

BSF EBCF EBCF RSCLRF BUSRETURN

T_100US: MOVLW D'23' ; Rutina de tiempo de 100µs.MOVWF VAR1NOPDECFSZ VAR1,1GOTO $-2NOPRETURN

T_40US: MOVLW D'8' ; Rutina de tiempo de 40µs.MOVWF VAR1NOPDECFSZ VAR1,1GOTO $-2NOPRETURN

T_1MS: MOVLW D'248' ; Rutina de tiempo de 1ms.MOVWF VAR1NOPDECFSZ VAR1,1GOTO $-2NOPRETURN

T_15MS: CALL T_1MS ; Rutina de tiempo de 15ms.CALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSRETURN

T_5MS: CALL T_1MS ; Rutina de tiempo de 5ms.CALL T_1MSCALL T_1MSCALL T_1MSCALL T_1MSRETURNEND

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

Página 11 de 13

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.

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 12 de 13

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 13 de 13