Você está na página 1de 19

DISEO DE SISTEMA PARA CAJERO ELECTRNICO HACIENDO USO

DEL PIC18F4550

Presentado por:
BAUTISTA ALMANZA ANDRS FELIPE
Cdigo. 1070610122
BLANCO CAICEDO EDISON DAVID
Cdigo. 96022312925
VELANDIA GMEZ PAULA ANDREA
Cdigo. 95052704210
GRUPO A1B

Docente a cargo:
PULIDO CASALLAS OSCAR ANDRS
Ingeniero Electrnico

UNIVERSIDAD MANUELA BELTRAN


PROGRAMA DE INGENIERA BIOMDICA
SISTEMAS DIGITALES APLICADOS
BOGOT D.C.
2016

CONTENIDO
RESUMEN................................................................................................................................
ABSTRACT..............................................................................................................................
INTRODUCCIN....................................................................................................................
OBJETIVOS.............................................................................................................................
JUSTIFICACIN.....................................................................................................................
1.
MARCO TERICO........................................................................................................
1.1 TEORAS GENRICAS EXPLICATIVAS..................................................................
1.2 TEORAS GENRICAS DEL PROYECTO ......4
2. INGENIERIA Y PUESTA EN MARCHA DEL PROYECTO.........................................
2.1 ANLISIS...........................................................................................................................
2.2 DISEO ..............................................................................................................................
2.3 RESULTADOS.9
3. CONCLUSIONES................................................................................................................
4. SUGERENCIAS Y RECOMENDACIONES.....................................................................
BIBLIOGRAFIA....................................................................................................................
Anexos......................................................................................................................................
LISTA DE FIGURAS
Figura 1. Cdigo de programacin en lenguaje de alto nivel y lenguaje ensamblador.....3
Figura 2. Ambiente de programacin del MPLAB X IDE................................................4
Figura 3. Pines del microcontrolador PIC18F4550. .........................................................4
Figura 4. Instrucciones de comandos para lenguaje ensamblador. ...................................6
Figura 5. Simulacin en Proteus 8 del circuito diseado .................................................8
Figura 6. Conexin para bombillo de 110 Vac. ................................................................8
Figura 7. Diagrama de flujo para cdigo de sistema de iluminacin. ............................10
LISTA DE TABLAS
YTabla 1. Secuencia de encendido de leds........................................................................7
Tabla 2. Configuracin de pines para PIC18F4550...........................................................7

LISTA DE ANEXOS

Anexo A. Diagrama de flujo............................................................................................10


Anexo B. Cdigo Fuente con comentarios......................................................................10

RESUMEN
El presente informe corresponde a la recreacin de un mecanismo propio de un cajero
electrnico con opciones de retiro, consulta de saldo y cambio de clave; como instrumento de
impresin de datos se utiliz una pantalla LCD y un teclado matricial 3x4 para interaccin 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 ATMs 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.
INTRODUCCIN
Para profundizar ms en el uso de microcontroladores, en este caso PIC18F4550 se implement
un circuito para que recree el funcionamiento de un cajero electrnico. Dicho PIC se program
con un cdigo que muestree correctamente los impulsos proporcionados por el teclado matricial
y se adiciono una librera para el control del display LCD mediante instrucciones genricas; esta
librera es la personalizacin de una perteneciente a la lista de perifricos. 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 voltil (EEPROM)
para su posterior uso en caso de prdida de poder. Por lo tanto es de vital importancia conocer
sobre configuracin de entradas y salidas tanto en la programacin como en la realizacin
electrnica.
OBJETIVOS
OBJETIVO GENERAL
Implementar un sistema de cajero electrnico basado en el PIC18F4550, haciendo uso de un
teclado matricial, sistema de sonido de alarma y un display de cristal lquido LCD.
OBJETIVOS ESPECFICOS

Analizar el funcionamiento del teclado matricial y la pantalla de cristal lquido LCD de


tal forma que se puedan aplicar sus funciones en el desarrollo e implementacin del
sistema de cajero electrnico.
Estudiar el manejo de libreras para programacin del PIC, de tal forma que se interprete
su cdigo y funciones tiles para el desarrollo del cdigo del programa.

Realizar
JUSTIFICACIN

Los cajeros automticos son mquinas expendedoras de dinero que se activan mediante una
tarjeta y una clave secreta personal, con las cuales se puede identificar el usuario. Ests mquinas
suelen realizar operaciones como extraccin de dinero, obtencin o cambio de contraseas,
consulta de saldo disponible, pago de servicios y muchas otras ms dependiendo de las
prestaciones que ofrecen los bancos. La implantacin 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 bsicos, 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 automatizacin y control de la informacin 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 solucin de complejidad moderada, que suple
las necesidades en el mecanismo de funcionamiento de cajero automtico a partir de la
programacin de un PIC en lenguaje C, permitiendo la ejecucin de las funciones de un cajero,
donde el usuario selecciona la opcin que necesita a partir de un teclado matricial, dependiendo
de la opcin que se utilice el microcontrolador guarda la informacin que se modifique y puede
ser visualizada por el usuario a travs de una LCD que va directamente controlada al
microcontrolador con un margen de error bajo, adems de contribuir en la precisin y un grado
de exactitud mayor en el control y manejo de la informacin que realiza el usuario.
1. MARCO TERICO
1.1.

TEORAS GENRICAS EXPLICATIVAS (Marco Conceptual)

LCD (Liquid Cristal Display)


Es un display alfanumrico formado por matrices de puntos que sirve como interface entre la
mquina 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 nmero de filas y el segundo el nmero de columnas o mximo 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 configuracin o instrucciones de alto nivel que
le permitirn mostrar mensajes o animaciones sobre la pantalla. La LCD dispone de un
puerto paralelo al exterior de fcil conexin a otros microcontroladores o microprocesadores.
Los caracteres que se pueden mostrar estn almacenados en la memoria ROM del
microcontrolador, donde el fabricante destina una parte de la memoria RAM para los
caracteres diseados por el usuario como por ejemplo la letra .

Figura 1. Display de Cristal Lquido de 2*16. Tomada de (Surez Marcelo, 2015)


Teclado matricial
Es un dispositivo de 16 teclas configurado como una matriz de filas y columnas con la
intencin de reducir el nmero de lneas 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 lgico (1 o 0) en cada una de las lneas configuradas como salidas
e inmediatamente despus leer el estado lgico de las lneas conectadas como entradas.

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

1.2.

TEORAS GENRICAS DEL PROYECTO (Marco referencial)

Conexin de una LCD

Figura 3. Descripcin de los pines de conexin de una LCD. Tomada de (Surez Marcelo,
2015)
1. Seales de alimentacin
Son tres seales correspondientes a los pines 1, 2 y 3.

El pin 1 corresponde a tierra (Gnd).


El pin 2 corresponde a la alimentacin positiva (normalmente +5Vdc).
El pin 3 corresponde al ajuste de contraste.

Si se alimenta la LCD si haber dado instrucciones de configuracin, 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 potencimetro de aproximadamente 10 K,
entre ms baja la tensin en este pin mayor ser el contraste.

2. Seales de control
Estas seales estn en los pines 4, 5 y 6.
El pin 4 (RS) sirve para seleccionar el registro de datos (DR) cuando este tiene un valor
lgico 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 lgico 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 lgico de
1 el enable est habilitado, o por el contrario si toma un valor de cero el enable estar
deshabilitado.
3. Seales 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 enva y se recibe informacin (si la LCD no est ocupada se
puede leer la informacin del estado del cursor).
La LCD tambin puede ser gobernada por un bus de datos de 4 hilos que se conectan a
los 4 bits ms significativos (D7, D6, D5 y D4).

Figura 4. Ubicacin de los pines de conexin de una LCD. Tomada de (Surez Marcelo,
2015)
Como mostrar un carcter en una LCD
Para escribir un carcter en una posicin determinada, es necesario mandar al registro de
instrucciones la direccin de la celda (instruccin set DDRAM address) y posteriormente
enviar el carcter al registro de datos (write data to CG or DDRAM).
Iniciacin de la LCD

Las LCDs necesitan ser inicializarlas tras ser alimentadas. El proceso de inicializacin es
necesario, si no se respetan los pasos y los tiempos que indica el fabricante, esta no puede ser
puesta en marcha.
1. Inicializacin mediante el Reset interno
El microcontrolador lleva incorporado un circuito para reset automtico tras la alimentacin
del mdulo, 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 alimentacin para producir un reset interno. Tomada de


(Surez Marcelo, 2015)
2. Inicializacin mediante instrucciones
Es la forma ms confiable de inicializar el modulo, ya que los requerimientos de
alimentacin difcilmente 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 (Surez Marcelo, 2015)
Conexin del teclado matricial con el microcontrolador PIC 18F4550

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

Las filas del teclado se conectan a las lneas de la parte baja del PORTB configuradas como
salida y las columnas se conectan a las lneas de la parte alta del PORTB configuradas como
entrada. Estas lneas 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 ledo 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 interrupcin RBI para detectar si se
pulsa alguna tecla. Una vez que la interrupcin 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
deteccin de tecla pulsada.

Figura 9. Algoritmo de deteccin de tecla pulsada. Tomada de (Terven Salinas, 2012)


2. INGENIERIA Y PUESTA EN MARCHA DEL PROYECTO.
2.1 Anlisis
En la implementacin del sistema de un cajero automtico, se hace uso de un teclado matricial y
una pantalla de cristal lquido LCD. Para la implementacin de stos, como se mencion en
apartados anteriores, de acuerdo a su funcionamiento, se realiza una asignacin de pines
adecuada para su aplicacin y adems, una optimizacin de espacio de montaje.

De acuerdo a esto, se hace uso de la librera 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 librera ya que las
funciones para ste son declaradas en el cdigo principal.
Adicional a lo anterior, se ejecuta tambin la librera 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 electrnico, 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 opcin 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:
VISUALIZACIN
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

DESCRIPCIN
Este mensaje aparecer siempre que se quiere acceder al men
inicial. sta opcin slo tiene tres intentos de fallo, por lo cual,
despus 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 optimizacin del espacio en la LCD. R, significa el
retiro del saldo, CS es la opcin de consultar saldo, el cual,
inicialmente ser de 200, CC indica el cambio de clave y S
indica una opcin para salir, es decir, volver a solicitar clave.
En este men, se indican los valores posibles de retiro con su
opcin de digitacin en el teclado. Adems, 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 an si se
desconecta el sistema de alimentacin.

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

FUNCIN
Salida. RS de la LCD
Salida. EN de la LCD
Salida. Pines de funcionamiento de la LCD
Salida. Led de visualizacin de frecuencia
Salida. Sistema de alarma Buzzer
Entrada. Pines de teclado matricial 4x3

Tabla 2. Configuracin de puertos e identificacin de entradas y salidas

Finalmente, se realiza la compilacin del cdigo (Anexo B) de acuerdo a lo establecido


anteriormente y segn el diagrama de flujo definido (Anexo A).
2.2 Diseo
El diseo del montaje, simulado con la ayuda de proteus es el siguiente, en cual se tienen en
cuenta la definicin 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

2
3
4
5
6
7
14
13

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. Diseo del montaje para la implementacin del sistema de cajero electrnico
Adems de esto, se realiza un diseo de PCB base para el montaje del micrcocontrolador, en el
cual se puede aadir el teclado matricial, la LCD y lo dems componentes usados en la prctica.

Figura 9. Diseo del montaje para la implementacin del sistema de cajero electrnico

2.3 Resultados
Al implementar el diseo realizado, se obtiene efectivamente el sistema del control de motor
realizando los giros segn la secuencia escogida y planeada. Sin embargo, la recepcin de la
peticin de velocidad, ya sea subir o bajar por parte de los pulsadores tomaba ms tiempo que la
recepcin de los dems estmulos 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 mnima y corresponda al factor de error proporcionado por el motor y el
nmero de ngulo mnimo posible recorrer.

3. CONCLUSIONES

Es muy importante tener en cuenta cuales son los procesos a llevar a cabo en la
implementacin del sistema de control del motor paso a paso, ya que de esa forma se
puede realizar un diagrama de flujo ordenado y fcil de entender, donde se pueden
identificar las condiciones de los procesos y hacia dnde van cada una.
El lenguaje de programacin XC8 tiene la ventaja de que puede soportar cualquier tipo de
PIC, pues el C18 que se usaba anteriormente, slo soportaba los de la familia 18.
Adems, gracias al compilador MPLAB X IDE, se puede construir el cdigo de una
forma ms sencilla y entendible, sin estar agregando libreras del PIC escogido como los
propios Delays, hacindolos sencillos de interpretar.
La energizacin 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
dao irreversible en el PIC. Adems de esto, el PICKit3 tiene varios tamaos para poner
el PIC18F4550 y un orden determinado; esto tambin puede ser perjudicial para el
microcontrolador si no se tiene en cuenta al momento de hacer la transferencia del cdigo
al PIC.
El tiempo determinado o la frecuencia de muestreo para la lectura de los pulsadores
depende de cmo se haya realizado, ya que en este caso, es bastante demorada mientras
realiza el ciclo debido a la cantidad de lneas del cdigo y por esta razn se deba
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 opcin de Retiro resulta ms prctico desplegar un men
con diferentes opciones de cantidad a retirar, esto limita considerablemente la versatilidad de
dicha opcin pero facilita la conversin del dato ingresado para su operacin con el saldo de la
mquina. En los pines de entrada al microcontrolador desde el teclado matricial es necesario
garantizar niveles estables de tensin 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 mdulo Timer
del microcontrolador en lugar de retardos, para no afectar el funcionamiento del cajero y su
configuracin de tiempos.

BIBLIOGRAFA.
ELECTRONILAB. (s.f.). Teclado Matricial de Membrana 44 16 dgitos. Obtenido de
http://electronilab.co/tienda/teclado-matricial-de-membrana-4x4-16-digitos/
Surez Marcelo, J. I. (06 de 10 de 2015). Cmo gobernar un display LCD alfanumrico 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. CDIGO FUENTE PARA EL SISTEMA DE CONTROL DE MOTOR PASO A


PASO
// PIC18F4550 Configuration Bit Settings
// 'C' source line config statements
#include <xc.h>
#include "lcd.h"; //libreria personalizada de lcd
#include <htc.h>
#include <EEP.h> //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<4:0> 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<0){ //verificacion de saldo suficiente
Lcd_Clear();
Lcd_Set_Cursor(1, 1);
Lcd_Write_String("Insuficiente");
__delay_ms(150);
__delay_ms(100);
}else{
SALDO=SALDOP; //realizacion del retiro
Lcd_Clear();
Lcd_Set_Cursor(1, 1);
Lcd_Write_String("Exito");
__delay_ms(150);
__delay_ms(100);
}
return;
}
void ConsultarSaldo() {
u=SALDO%10;
u1=conversion(u);
s1=SALDO/10;
d=s1%10;
d1=conversion(d);
s2=s1/10;
c=s2%10;
c1=conversion(c); //conversion a ascii
if(c==0){c1=' ';}
if(c==0 && d==0){d1=' ';}
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Saldo: ");
Lcd_Set_Cursor(1,8);
Lcd_Write_Char(c1);
Lcd_Set_Cursor(1,9);
Lcd_Write_Char(d1);
Lcd_Set_Cursor(1,10);
Lcd_Write_Char(u1);
__delay_ms(150);
__delay_ms(100);
__delay_ms(150);
__delay_ms(100);
return;
}
void CambiarClave (void) {
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Digite Nueva");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("Clave ");
Lcd_Set_Cursor(2,6);
__delay_ms(150);
__delay_ms(100);
TecladoPol();
CLAVE_INTRODUCIDA[0]=salida;
Lcd_Set_Cursor(2, 8);
Lcd_Write_Char('*');
TecladoPol();

CLAVE_INTRODUCIDA[1]=salida;
Lcd_Set_Cursor(2, 9);
Lcd_Write_Char('*');
TecladoPol();
CLAVE_INTRODUCIDA[2]=salida;
Lcd_Set_Cursor(2, 10);
Lcd_Write_Char('*');
TecladoPol();
CLAVE_INTRODUCIDA[3]=salida;
Lcd_Set_Cursor(2, 11);
Lcd_Write_Char('*');
ec=1; //enable de la clave para la proxima solicitacion de
clave
EEPROM_WRITE(0xE0, CLAVE_INTRODUCIDA[0]);
EEPROM_WRITE(0xE1, CLAVE_INTRODUCIDA[1]);
EEPROM_WRITE(0xE2, CLAVE_INTRODUCIDA[2]);
EEPROM_WRITE(0xE3, CLAVE_INTRODUCIDA[3]);
EEPROM_WRITE(0xE4, ec);
__delay_ms(150);
__delay_ms(100);
Lcd_Clear();
Lcd_Set_Cursor(1, 1);
Lcd_Write_String("Exito");
__delay_ms(150);
__delay_ms(100);
return;
}

ec2=EEPROM_READ(0xE4); //validacion de clave en


memoria no volatil
if(ec2==1){
CLAVE_INTRODUCIDA[0]=EEPROM_READ(0xE0);
CLAVE_INTRODUCIDA[1]=EEPROM_READ(0xE1);
CLAVE_INTRODUCIDA[2]=EEPROM_READ(0xE2);
CLAVE_INTRODUCIDA[3]=EEPROM_READ(0xE3);
}
while(1){
SolicitarClave();
while(cc==1){ //si la clave es correcta
Lcd_Set_Cursor(1,1);
Lcd_Write_String("R(1) CS(2) "); //menu de cajero
Lcd_Set_Cursor(2,1);
Lcd_Write_String("CC(3) S(*) ");
TecladoPol();
o=salida;
if(o=='1'){
Lcd_Clear();
Retirar();
salida=0;cc=0;
}
if(o=='2'){
Lcd_Clear();
ConsultarSaldo();
salida=0;cc=0;
}
if(o=='3'){
Lcd_Clear();
CambiarClave();
salida=0;cc=0;
}
if(o=='*'){
__delay_ms(150);
__delay_ms(100);
salida=0;
cc=0; //salida de menu
}
}
}

void interrupt ledonoff(){ //rutina interrupcion para led


parpadeante
if(TMR0IF==1){
led=!led;
TMR0IF=0;
TMR0L=0xF6;TMR0H=0xC2;
}
}
void main(){
TRISD = 0;
TRISAbits.RA4=0;led=0;TRISAbits.RA5=0;buzzer=0;
PORTB = 0; LATB = 0; TRISB = 0b11110000; RBPU = 1;
Lcd_Init(); //inicializacion
Lcd_Clear();
GIE=1;IPEN=0;TMR0IE=1;T0CON=0b10000011;TMR0L=
0xF6;TMR0H=0xC2;

Você também pode gostar