Cajero PIC18F4550

DISEÑO DE SISTEMA PARA CAJERO ELECTRÓNICO HACIENDO USO DEL PIC18F4550 Presentado por: BAUTISTA ALMANZA ANDRÉS FELIPE Có

Views 264 Downloads 9 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

DISEÑO DE SISTEMA PARA CAJERO ELECTRÓNICO HACIENDO USO DEL PIC18F4550

Presentado por: BAUTISTA ALMANZA ANDRÉS FELIPE Código. 1070610122 BLANCO CAICEDO EDISON DAVID Código. 96022312925 VELANDIA GÓMEZ PAULA ANDREA Código. 95052704210 GRUPO A1B

Docente a cargo: PULIDO CASALLAS OSCAR ANDRÉS Ingeniero Electrónico

UNIVERSIDAD MANUELA BELTRAN PROGRAMA DE INGENIERÍA BIOMÉDICA SISTEMAS DIGITALES APLICADOS BOGOTÁ D.C. 2016

CONTENIDO RESUMEN................................................................................................................................ ABSTRACT.............................................................................................................................. INTRODUCCIÓN.................................................................................................................... OBJETIVOS............................................................................................................................. JUSTIFICACIÓN..................................................................................................................... 1. MARCO TEÓRICO........................................................................................................ 1.1 TEORÍAS GENÉRICAS EXPLICATIVAS.................................................................. 1.2 TEORÍAS GENÉRICAS DEL PROYECTO ...………………………………...4 2. INGENIERIA Y PUESTA EN MARCHA DEL PROYECTO......................................... 2.1 ANÁLISIS........................................................................................................................... 2.2 DISEÑO .............................................................................................................................. 2.3 RESULTADOS…………………………………………………………………….9 3. CONCLUSIONES................................................................................................................ 4. SUGERENCIAS Y RECOMENDACIONES..................................................................... BIBLIOGRAFIA.................................................................................................................... Anexos...................................................................................................................................... LISTA DE FIGURAS Figura 1. Código de programación en lenguaje de alto nivel y lenguaje ensamblador.....3 Figura 2. Ambiente de programación del MPLAB X IDE................................................4 Figura 3. Pines del microcontrolador PIC18F4550. .........................................................4 Figura 4. Instrucciones de comandos para lenguaje ensamblador. ...................................6 Figura 5. Simulación en Proteus 8 del circuito diseñado .................................................8 Figura 6. Conexión para bombillo de 110 Vac. ................................................................8 Figura 7. Diagrama de flujo para código de sistema de iluminación. ............................10 LISTA DE TABLAS YTabla 1. Secuencia de encendido de leds........................................................................7 Tabla 2. Configuración de pines para PIC18F4550...........................................................7

LISTA DE ANEXOS

Anexo A. Diagrama de flujo............................................................................................10 Anexo B. Código Fuente con comentarios......................................................................10

RESUMEN El presente informe corresponde a la recreación de un mecanismo propio de un cajero electrónico con opciones de retiro, consulta de saldo y cambio de clave; como instrumento de impresión de datos se utilizó una pantalla LCD y un teclado matricial 3x4 para interacción con el usuario. Se implementó un buzzer que conforma el sistema de alarma de bloqueo y un diodo LED de funcionamiento a 1Hz. Como microcontrolador se utilizó un PIC18F4550 programado en lenguaje XC8 mediante el entorno MPLAB X de Microchip. ABSTRACT This report corresponds to the recreation of an ATM´s mechanism with options such as cashout, amount check and password change; as printing instrument an LCD screen and a 3x4 matrix keyboard for user interaction was used. The system lock was showed by a buzzer and a LED operating at 1Hz was implemented showing the correct operation of the system. As microcontroller a PIC18F4550 was used programmed into XC8 language by MPLAB X environment. INTRODUCCIÓN Para profundizar más en el uso de microcontroladores, en este caso PIC18F4550 se implementó un circuito para que recree el funcionamiento de un cajero electrónico. Dicho PIC se programó con un código que muestree correctamente los impulsos proporcionados por el teclado matricial y se adiciono una librería para el control del display LCD mediante instrucciones genéricas; esta librería es la personalización de una perteneciente a la lista de periféricos. Cuando se realizan tres intentos incorrectos de ingreso de clave el sistema se bloquea. Cada vez que se realiza un cambio de clave exitosamente la nueva clave se almacena en memoria no volátil (EEPROM) para su posterior uso en caso de pérdida de poder. Por lo tanto es de vital importancia conocer sobre configuración de entradas y salidas tanto en la programación como en la realización electrónica. OBJETIVOS OBJETIVO GENERAL Implementar un sistema de cajero electrónico basado en el PIC18F4550, haciendo uso de un teclado matricial, sistema de sonido de alarma y un display de cristal líquido LCD. OBJETIVOS ESPECÍFICOS  

Analizar el funcionamiento del teclado matricial y la pantalla de cristal líquido LCD de tal forma que se puedan aplicar sus funciones en el desarrollo e implementación del sistema de cajero electrónico. Estudiar el manejo de librerías para programación del PIC, de tal forma que se interprete su código y funciones útiles para el desarrollo del código del programa.



Realizar JUSTIFICACIÓN

Los cajeros automáticos son máquinas expendedoras de dinero que se activan mediante una tarjeta y una clave secreta personal, con las cuales se puede identificar el usuario. Estás máquinas suelen realizar operaciones como extracción de dinero, obtención o cambio de contraseñas, consulta de saldo disponible, pago de servicios y muchas otras más dependiendo de las prestaciones que ofrecen los bancos. La implantación de estos mecanismos son de gran importancia para los bancos ya que el personal que trabaja en los bancos no tiene que estar atendiendo a los clientes para ofrecer servicios básicos, lo que representa una herramienta de ahorro de tiempo y dinero para el banco y para los clientes. Los cajeros funcionan a partir con unos mecanismos de seguridad que permiten realizar operaciones solo a quien disponga de esta tarjeta, y esto es posible por un sistema de automatización y control de la información adquirida que permita reducir las posibles fallas operacionales y se tenga un mayor control y rendimiento en las prestaciones de estos cajeros. Es aquí donde los sistemas digitales proveen una solución de complejidad moderada, que suple las necesidades en el mecanismo de funcionamiento de cajero automático a partir de la programación de un PIC en lenguaje C, permitiendo la ejecución de las funciones de un cajero, donde el usuario selecciona la opción que necesita a partir de un teclado matricial, dependiendo de la opción que se utilice el microcontrolador guarda la información que se modifique y puede ser visualizada por el usuario a través de una LCD que va directamente controlada al microcontrolador con un margen de error bajo, además de contribuir en la precisión y un grado de exactitud mayor en el control y manejo de la información que realiza el usuario. 1. MARCO TEÓRICO 1.1.

TEORÍAS GENÉRICAS EXPLICATIVAS (Marco Conceptual)

LCD (Liquid Cristal Display) Es un display alfanumérico formado por matrices de puntos que sirve como interface entre la máquina y el ser humano, en estas se puede mostrar caracteres de cualquier tipo para formar mensajes y se encuentran en distintos formatos (2*8, 2*16, 4*20), donde el primer digito indica el número de filas y el segundo el número de columnas o máximo de caracteres por fila. Estos dispositivos son controlados por un microcontrolador el cual se encarga de polarizar los puntos de la pantalla, generar los caracteres, desplazar la pantalla y otras funciones donde el usuario solo necesita saber los comandos de configuración o instrucciones de alto nivel que le permitirán mostrar mensajes o animaciones sobre la pantalla. La LCD dispone de un puerto paralelo al exterior de fácil conexión a otros microcontroladores o microprocesadores. Los caracteres que se pueden mostrar están almacenados en la memoria ROM del microcontrolador, donde el fabricante destina una parte de la memoria RAM para los caracteres diseñados por el usuario como por ejemplo la letra Ñ.

Figura 1. Display de Cristal Líquido de 2*16. Tomada de (Suárez Marcelo, 2015) Teclado matricial Es un dispositivo de 16 teclas configurado como una matriz de filas y columnas con la intención de reducir el número de líneas que entran al microcontrolador. El teclado ingresa por el puerto B del microcontrolador donde las filas son programadas como salidas y las columnas como entradas. A partir de algoritmos se busca determinar la fila y columna correspondiente a la tecla que se presiona rotando un valor lógico (1 o 0) en cada una de las líneas configuradas como salidas e inmediatamente después leer el estado lógico de las líneas conectadas como entradas.

Figura 2. Teclado matricial de 16 caracteres. Tomada de (ELECTRONILAB, s.f.)

1.2.

TEORÍAS GENÉRICAS DEL PROYECTO (Marco referencial)

Conexión de una LCD

Figura 3. Descripción de los pines de conexión de una LCD. Tomada de (Suárez Marcelo, 2015) 1. Señales de alimentación Son tres señales correspondientes a los pines 1, 2 y 3.   

El pin 1 corresponde a tierra (Gnd). El pin 2 corresponde a la alimentación positiva (normalmente +5Vdc). El pin 3 corresponde al ajuste de contraste.

Si se alimenta la LCD si haber dado instrucciones de configuración, el display muestra todos sus caracteres en negro, si no es así se debe ajustar el contraste. Para el ajuste de contraste se debe colocar un potenciómetro de aproximadamente 10 KΩ, entre más baja la tensión en este pin mayor será el contraste.

2. Señales de control Estas señales están en los pines 4, 5 y 6. El pin 4 (RS) sirve para seleccionar el registro de datos (DR) cuando este tiene un valor lógico de 1, o de instrucciones (IR) cuando asume un valor de 0. El pin 5 (R/W) permite seleccionar la lectura o escritura en la LCD, tanto datos como instrucciones. Cuando esta salida posee un valor lógico de 1 se selecciona lectura, o si tiene un valor de 0 se selecciona escritura. El pin 6 (E) permite habilitar o deshabilitar la LCD. Cuando este toma un valor lógico de 1 el enable está habilitado, o por el contrario si toma un valor de cero el enable estará deshabilitado. 3. Señales de datos Los pines del 7 al 14 forman un bus de datos bidireccional de 8 bits, (D7 a D0). Por medio de estos pines se envía y se recibe información (si la LCD no está ocupada se puede leer la información del estado del cursor). La LCD también puede ser gobernada por un bus de datos de 4 hilos que se conectan a los 4 bits más significativos (D7, D6, D5 y D4).

Figura 4. Ubicación de los pines de conexión de una LCD. Tomada de (Suárez Marcelo, 2015) Como mostrar un carácter en una LCD Para escribir un carácter en una posición determinada, es necesario mandar al registro de instrucciones la dirección de la celda (instrucción “set DDRAM address”) y posteriormente enviar el carácter al registro de datos (write data to CG or DDRAM). Iniciación de la LCD

Las LCDs necesitan ser inicializarlas tras ser alimentadas. El proceso de inicialización es necesario, si no se respetan los pasos y los tiempos que indica el fabricante, esta no puede ser puesta en marcha. 1. Inicialización mediante el Reset interno El microcontrolador lleva incorporado un circuito para reset automático tras la alimentación del módulo, si no se cumplen los requisitos de tiempos especificados el modulo no se resetea y se deberá hacer mediante instrucciones.

Figura 5. Condiciones de la alimentación para producir un reset interno. Tomada de (Suárez Marcelo, 2015) 2. Inicialización mediante instrucciones Es la forma más confiable de inicializar el modulo, ya que los requerimientos de alimentación difícilmente se cumplen alguna vez. En la figura 6 se muestra la manera de inicializar teniendo un bus de datos de 8 bits.

Figura 6. Procedimiento a seguir para inicializar la LCD mediante instrucciones. Tomada de (Suárez Marcelo, 2015) Conexión del teclado matricial con el microcontrolador PIC 18F4550

Figura 7. Conexión del teclado matricial al PORTB del PIC 18F4550. Tomada de (Terven Salinas, 2012)

Las filas del teclado se conectan a las líneas de la parte baja del PORTB configuradas como salida y las columnas se conectan a las líneas de la parte alta del PORTB configuradas como entrada. Estas líneas deben tener resistencias de pull-up, las cuales se encuentran presentes en todos los pines del PORTB y que pueden ser activadas por software. Para detectar que tecla se pulsa, se aplica a una fila un nivel bajo y a las otras filas un nivel alto. Si se presiona una tecla en la fila por la que se aplica el nivel bajo, aparecerá en la columna correspondiente con la que ha hecho contacto. En la figura 8 se pulsa la tecla “3”, de tal forma que cuando el microcontrolador explora la fila F1, este cero aparece en la columna C3 y es leído por el pin RB6.

Figura 8. Comportamiento de las entradas y salidas del teclado matricial cuando se pulsa una tecla. Tomada de (Terven Salinas, 2012) Algoritmo para la lectura del teclado El algoritmo de lectura del teclado matricial hace uso de la interrupción RBI para detectar si se pulsa alguna tecla. Una vez que la interrupción detecta que se pulso una tecla, el siguiente paso es determinar que tecla se pulso. En la figura 9 se muestra el diagrama del algoritmo de detección de tecla pulsada.

Figura 9. Algoritmo de detección de tecla pulsada. Tomada de (Terven Salinas, 2012) 2. INGENIERIA Y PUESTA EN MARCHA DEL PROYECTO. 2.1 Análisis En la implementación del sistema de un cajero automático, se hace uso de un teclado matricial y una pantalla de cristal líquido LCD. Para la implementación de éstos, como se mencionó en apartados anteriores, de acuerdo a su funcionamiento, se realiza una asignación de pines adecuada para su aplicación y además, una optimización de espacio de montaje.

De acuerdo a esto, se hace uso de la librería “lcd.h” para ejecutar comandos de la LCD que se incluyen en ésta. En el caso del teclado, no se hace necesario el uso de una librería ya que las funciones para éste son declaradas en el código principal. Adicional a lo anterior, se ejecuta también la librería para el uso de la eeprom, con el fin de poder guardar los valores de la clave establecida y que ésta misma se conserve en el PIC. De esta manera, para obtener el sistema de cajero electrónico, se hace uso de LCD para visualizar las distintas opciones que se ofrecen, tales como, solicitud de clave, menú de inicio, consulta de saldo, retiro de saldo y el cambio de la clave; cada opción se selecciona de acuerdo a lo que se indique en la LCD y por medio del teclado matricial de tal forma que se muestran en la LCD las siguientes opciones: VISUALIZACIÓN Digite su clave

Menú inicial R(1) CS(2) CC(3) S(*) Retirar saldo 1(1) 2(2) 5(3) 10(4) Consultar saldo. Cambiar clave

DESCRIPCIÓN Este mensaje aparecerá siempre que se quiere acceder al menú inicial. Ésta opción sólo tiene tres intentos de fallo, por lo cual, después de haber fallado tres veces en la clave, se activará el sistema de alarma y su salida será un Buzzer En el menú inicial se presentan distintas opciones abreviadas para la optimización del espacio en la LCD. R, significa el retiro del saldo, CS es la opción de consultar saldo, el cual, inicialmente será de 200, CC indica el cambio de clave y S indica una opción para salir, es decir, volver a solicitar clave. En este menú, se indican los valores posibles de retiro con su opción de digitación en el teclado. Además, no se podrá hacer retiro cuando se haya excedido el saldo inicial. Aquí, se visualiza el valor de saldo actual. Se hace la solicitud de la clave nueva y dicha clave se almacenará en la EEPROM, para que sea conservada aún si se desconecta el sistema de alimentación.

De esta manera, se designan los siguientes puertos del PIC18F4550 para la implementación del sistema: PUERTO RD2 RD3 RD4-RD7 RA4 RA5 RB0-RB6

FUNCIÓN Salida. RS de la LCD Salida. EN de la LCD Salida. Pines de funcionamiento de la LCD Salida. Led de visualización de frecuencia Salida. Sistema de alarma Buzzer Entrada. Pines de teclado matricial 4x3

Tabla 2. Configuración de puertos e identificación de entradas y salidas

Finalmente, se realiza la compilación del código (Anexo B) de acuerdo a lo establecido anteriormente y según el diagrama de flujo definido (Anexo A). 2.2 Diseño El diseño del montaje, simulado con la ayuda de proteus es el siguiente, en cual se tienen en cuenta la definición de pines anteriormente realizadas: LCD1 LM016L

4 5 6

D0 D1 D2 D3 D4 D5 D6 D7

VSS VDD VEE 1 2 3

LED FRECUENCIA

7 8 9 10 11 12 13 14

BUZZER

RS RW E

330

R4

BUZ1

LED-BIBY

U1

1

2

3

2 3 4 5 6 7 14 13

A

1

2

3

B

4

5

6

C

7

8

9

D

0

33 34 35 36 37 38 39 40

18

#

RA0/AN0 RC0/T1OSO/T1CKI RA1/AN1 RC1/T1OSI/CCP2/UOE RA2/AN2/VREF-/CVREF RC2/CCP1/P1A RA3/AN3/VREF+ RC4/D-/VM RA4/T0CKI/C1OUT/RCV RC5/D+/VP RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK RA6/OSC2/CLKO RC7/RX/DT/SDO OSC1/CLKI RB0/AN12/INT0/FLT0/SDI/SDA RB1/AN10/INT1/SCK/SCL RB2/AN8/INT2/VMO RB3/AN9/CCP2/VPO RB4/AN11/KBI0/CSSPP RB5/KBI1/PGM RB6/KBI2/PGC RB7/KBI3/PGD

VUSB PIC18F4550

RD0/SPP0 RD1/SPP1 RD2/SPP2 RD3/SPP3 RD4/SPP4 RD5/SPP5/P1B RD6/SPP6/P1C RD7/SPP7/P1D RE0/AN5/CK1SPP RE1/AN6/CK2SPP RE2/AN7/OESPP RE3/MCLR/VPP

15 16 17 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 1

R1 10k

R2 R3 1k

1k

Figura 9. Diseño del montaje para la implementación del sistema de cajero electrónico Además de esto, se realiza un diseño de PCB base para el montaje del micrcocontrolador, en el cual se puede añadir el teclado matricial, la LCD y lo demás componentes usados en la práctica.

Figura 9. Diseño del montaje para la implementación del sistema de cajero electrónico

2.3 Resultados Al implementar el diseño realizado, se obtiene efectivamente el sistema del control de motor realizando los giros según la secuencia escogida y planeada. Sin embargo, la recepción de la petición de velocidad, ya sea subir o bajar por parte de los pulsadores tomaba más tiempo que la recepción de los demás estímulos por lo que era necesario esperar a que el microcontrolador leyera el respectivo pin para que realizara el proceso deseado. La diferencia de ángulos entre la real y la esperada era mínima y correspondía al factor de error proporcionado por el motor y el número de ángulo mínimo posible recorrer.

3. CONCLUSIONES 







Es muy importante tener en cuenta cuales son los procesos a llevar a cabo en la implementación del sistema de control del motor paso a paso, ya que de esa forma se puede realizar un diagrama de flujo ordenado y fácil de entender, donde se pueden identificar las condiciones de los procesos y hacia dónde van cada una. El lenguaje de programación XC8 tiene la ventaja de que puede soportar cualquier tipo de PIC, pues el C18 que se usaba anteriormente, sólo soportaba los de la familia 18. Además, gracias al compilador MPLAB X IDE, se puede construir el código de una forma más sencilla y entendible, sin estar agregando librerías del PIC escogido como los propios Delays, haciéndolos sencillos de interpretar. La energización del PIC18F4550 debe ser muy cuidadosa, ya que al tener tanto pines, en el momento de contarlos pueden haber errores e invertir dichas conexiones llevando a un daño irreversible en el PIC. Además de esto, el PICKit3 tiene varios tamaños para poner el PIC18F4550 y un orden determinado; esto también puede ser perjudicial para el microcontrolador si no se tiene en cuenta al momento de hacer la transferencia del código al PIC. El tiempo determinado o la frecuencia de muestreo para la lectura de los pulsadores depende de cómo se haya realizado, ya que en este caso, es bastante demorada mientras realiza el ciclo debido a la cantidad de líneas del código y por esta razón se debía mantener presionado el pulsador hasta que se leyera el valor en el pin del microcontrolador. 4. SUGERENCIAS Y RECOMENDACIONES

Para el ingreso del monto a retirar en la opción de Retiro resulta más práctico desplegar un menú con diferentes opciones de cantidad a retirar, esto limita considerablemente la versatilidad de dicha opción pero facilita la conversión del dato ingresado para su operación con el saldo de la máquina. En los pines de entrada al microcontrolador desde el teclado matricial es necesario garantizar niveles estables de tensión para lo cual se recomienda un puenteo hacia tierra con resistencias. En cuanto al diodo LED con frecuencia de 1Hz se sugiere el uso del módulo Timer del microcontrolador en lugar de retardos, para no afectar el funcionamiento del cajero y su configuración de tiempos.

BIBLIOGRAFÍA. ELECTRONILAB. (s.f.). Teclado Matricial de Membrana 4×4 – 16 dígitos. Obtenido de http://electronilab.co/tienda/teclado-matricial-de-membrana-4x4-16-digitos/ Suárez Marcelo, J. I. (06 de 10 de 2015). Cómo gobernar un display LCD alfanumérico basado en el controlador HD44780. Obtenido de http://eii.unex.es/profesores/jisuarez/descargas/ip/lcd_alfa.pdf Terven Salinas, J. R. (2012). Interrupciones. Obtenido de http://www.tervenet.com/itmaz/micros2012/05%20Teclado%20Matricial.pdf

ANEXO B. CÓDIGO FUENTE PARA EL SISTEMA DE CONTROL DE MOTOR PASO A PASO // PIC18F4550 Configuration Bit Settings // 'C' source line config statements #include #include "lcd.h"; //libreria personalizada de lcd #include #include //libreria para instrucciones eeprom // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1L #pragma config PLLDIV = 1 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly)) #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2]) #pragma config USBDIV = 1 // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale) // CONFIG1H #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator (HS)) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) #pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled) // CONFIG2L #pragma config PWRT = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config BOR = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software) #pragma config BORV = 3 // Brown-out Reset Voltage bits (Minimum setting 2.05V) #pragma config VREGEN = OFF // USB Voltage Regulator Enable bit (USB voltage regulator disabled) // CONFIG2H

#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) #pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768) // CONFIG3H #pragma config CCP2MX = ON // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1) #pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB pins are configured as digital I/O on Reset) #pragma config LPT1OSC = OFF // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation) #pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled) // CONFIG4L #pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset) #pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled) #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled) #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode)) // CONFIG5L #pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected) #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected) #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected) #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)

// CONFIG6L #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected) #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected) #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected) #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)

salida='2'; __delay_ms(150); while(PORTBbits.RB5==1){} t=0; } if(PORTBbits.RB6==1){ salida='3'; __delay_ms(150); while(PORTBbits.RB6==1){} t=0; } LATB=0b00000010; if(PORTBbits.RB4==1){ salida='4'; __delay_ms(150); while(PORTBbits.RB4==1){} t=0; } if(PORTBbits.RB5==1){ salida='5'; __delay_ms(150); while(PORTBbits.RB5==1){} t=0; } if(PORTBbits.RB6==1){ salida='6'; __delay_ms(150); while(PORTBbits.RB6==1){} t=0; } LATB=0b00000100; if(PORTBbits.RB4==1){ salida='7'; __delay_ms(150); while(PORTBbits.RB4==1){} t=0; } if(PORTBbits.RB5==1){ salida='8'; __delay_ms(150); while(PORTBbits.RB5==1){} t=0; } if(PORTBbits.RB6==1){ salida='9'; __delay_ms(150); while(PORTBbits.RB6==1){} t=0; } LATB=0b00001000; if(PORTBbits.RB4==1){ salida='*'; __delay_ms(150); while(PORTBbits.RB4==1){} t=0; } if(PORTBbits.RB5==1){ salida='0'; __delay_ms(150); while(PORTBbits.RB4==1){} t=0; } if(PORTBbits.RB6==1){ salida='*'; __delay_ms(150); while(PORTBbits.RB4==1){} t=0; }

// CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (3000003000FFh) are not write-protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not writeprotected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM is not write-protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks) #define _XTAL_FREQ 20000000 #define RS PORTDbits.RD2 #define EN PORTDbits.RD3 #define D4 PORTDbits.RD4 #define D5 PORTDbits.RD5 #define D6 PORTDbits.RD6 #define D7 PORTDbits.RD7 #define led LATAbits.LATA4 #define buzzer LATAbits.LATA5 int SALDO=200,SALDOP=0,VALOR=0,cc=0,ic,t,ec=0,ec2=0,s1,s2; ; //declaracion de variables int CLAVE_INTRODUCIDA[4]={'1','2','3','4'}; //clave generica int CLAVE_VERIFICAR[4]={0,0,0,0}; //clave a comparar con la correcta char salida=0,o,u,d,c,u1,d1,c1; void TecladoPol(){ //funcion teclado 3x4 salida=0; //variable que almacena el valor de la tecla pulsada t=1;PORTB=0;LATB=0; while(t==1){ LATB=0b00000001; if(PORTBbits.RB4==1){ salida='1'; __delay_ms(150); while(PORTBbits.RB4==1){} t=0; } if(PORTBbits.RB5==1){

}

} void SolicitarClave(void){ Lcd_Clear(); Lcd_Set_Cursor(1, 1); Lcd_Write_String("Digite clave"); TecladoPol(); CLAVE_VERIFICAR[0]=salida; Lcd_Set_Cursor(2, 1); Lcd_Write_Char('*'); TecladoPol(); CLAVE_VERIFICAR[1]=salida; Lcd_Set_Cursor(2, 2); Lcd_Write_Char('*'); TecladoPol(); CLAVE_VERIFICAR[2]=salida; Lcd_Set_Cursor(2, 3); Lcd_Write_Char('*'); TecladoPol(); CLAVE_VERIFICAR[3]=salida; Lcd_Set_Cursor(2, 4); Lcd_Write_Char('*'); __delay_ms(100); Lcd_Clear(); if(CLAVE_VERIFICAR[0]==CLAVE_INTRODUCIDA[0] && CLAVE_VERIFICAR[1]==CLAVE_INTRODUCIDA[1] && CLAVE_VERIFICAR[2]==CLAVE_INTRODUCIDA[2] && CLAVE_VERIFICAR[3]==CLAVE_INTRODUCIDA[3]){ Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Write_String("Correcto"); __delay_ms(150); __delay_ms(100); cc=1; //variable que habilita el menu (clave correcta) }else{ Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Write_String("Incorrecto"); __delay_ms(150); __delay_ms(100); cc=0; ic++; //numero de intentos de introduccion de clave if(ic==3){ //tercer intento incorrecto Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Write_String("Bloqueo"); buzzer=1; while(1){} //para desbloquearlo es necesario quitarle la fuente de poder } } return; } void Retirar () { Lcd_Clear(); Lcd_Set_Cursor(1, 1); Lcd_Write_String("Ingrese saldo a"); Lcd_Set_Cursor(2, 1); Lcd_Write_String("retirar:"); __delay_ms(150); __delay_ms(100); Lcd_Clear(); Lcd_Set_Cursor(1, 1); Lcd_Write_String("1(1) 2(2) "); //opciones de retiro de $ 1,2,5 o 10 Lcd_Set_Cursor(2, 1); Lcd_Write_String("5(3) 10(4)");

TecladoPol(); if(salida=='1'){VALOR=1;} if(salida=='2'){VALOR=2;} if(salida=='3'){VALOR=5;} if(salida=='4'){VALOR=10;} SALDOP = SALDO - VALOR; //saldo para la verificacion (saldo de prueba) if(SALDOP