Sie sind auf Seite 1von 13

/* * Nombre del Proyecto: Proyecto 2.

c * Nombre del Autor: Eduardo Casal y Roger Idrovo * Description: Simulacion de cajero automatico * Test configuration: MCU: Oscillator: SW: */ PIC16F887 HS, 08.0000 MHz mikroC PRO for PIC

unsigned short cnt; unsigned short presiona, i, j; // Variables de lazo

unsigned short col, num1, num2, opcion, res; unsigned int monto, valor; //Fin de definicion conexiones de puerto de entrada de teclado

// Definicion de conexiones de puerto del modulo LCD sbit LCD_RS at RE0_bit; sbit LCD_EN at RE1_bit; sbit LCD_D4 at RD4_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISE0_bit; sbit LCD_EN_Direction at TRISE1_bit; sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit; // Fin de definicion de conexiones de puerto del modulo LCD

// Definicion de variables de texto char txt1[] = "Ingrese clave:"; char txt2[] = "Error"; char txt3[] = "Bloqueado"; char txt4[] = "a.Retirar Dinero"; char txt5[] = "b.Cambiar clave"; char txt6[] = "Monto:"; char txt7[] = "Listo"; char txt8[] = "No disponible"; char txt9[] = "Disponible"; char clave[5]; char temporal[5]; char cantidad[5]; // Fin de definicion de variables de texto

// Procedimiento de limpieza del LCD

void Limpia_LCD() { Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); } // Fin de procedimiento de limpieza del LCD // Limpia pantalla // Apaga cursor

// Funcion que da codigo ASCII dependiendo del boton presionado void teclado(){ unsigned short i; presiona=0; PORTB=0xFF; RB0_bit=0; //for(i=0;i<10;i++){ if(!RB4_bit) presiona=49; if(!RB5_bit) presiona=50; if(!RB6_bit) presiona=51; if(!RB7_bit) presiona=52; Delay_5ms(); //} PORTB=0XFF; RB1_bit=0;

// for(i=0;i<10;i++){ if(!RB4_bit) presiona=53; if(!RB5_bit) presiona=54; if(!RB6_bit) presiona=55; if(!RB7_bit) presiona=56; Delay_5ms(); // } PORTB=0XFF; RB2_bit=0; //for(i=0;i<10;i++){ if(!RB4_bit) presiona=42; if(!RB5_bit) presiona=57; if(!RB6_bit) presiona=48; if(!RB7_bit) presiona=35; Delay_5ms(); //} PORTB=0XFF; RB3_bit=0;

//for(i=0;i<10;i++){ if(!RB4_bit) presiona=97; if(!RB5_bit) presiona=98; if(!RB6_bit) presiona=99; if(!RB7_bit) presiona=100; Delay_5ms(); //} }

// Funcion que permite el ingreso de clave por teclado void ingreso(){ col=0; j=0; do{ do { teclado(); Delay_ms(50); } while(presiona==0||presiona==42||presiona==35||presiona==97||presiona==98||presiona==99 ||presiona==100);

temporal[j]= presiona; col=col+1;

// Presenta en pantalla el valor // ingresado por teclado y lo guarda

Lcd_Chr(2, 5+col, presiona); Delay_ms(500); j=j+1; }while(j<4); } // guarda en el arreglo temporal[]

// Funcion que permite el ingreso de opciones por teclado void ingreso_opciones(){ do teclado(); while(!(presiona==97||presiona==98)); } // Solo habilito lectura de caracter "a" o "b"

// Fin de funcion de asignacion de codigo ASCII

/*********************************************************************/ /*********************************************************************/ /****************** Inicio de programa principal *********************/ void main() { ANSEL = 0; ANSELH = 0; //C1ON_bit = 0; // Disable comparators

//C2ON_bit = 0; TRISB = 0xF0; cnt = 0; Lcd_Init(); Limpia_Lcd(); Lcd_Out(1, 1, txt1); // Inicia contador // Inicializa Lcd // Limpia LCD // Escribe mensaje inicial en Lcd

for(i=0;i<4;i++) { clave[i]=49+i; }

// Genera clave por defecto

do {

do{ ingreso();

// Lazo para validadar la clave

res=strcmp(clave, temporal);// Verifica que sea la misma clave if(res==0) break; // Si la clve se ingreso correctamente // sale del lazo.

cnt=cnt+1;

if(cnt==1) { Limpia_LCD(); Lcd_Out(1,1,txt2);

Delay_ms(500); Limpia_LCD(); Lcd_Out(1,1,txt1);

} }while(cnt<2);

if(cnt==2) { Limpia_LCD(); do{

// El codigo de este if se ejecuta solo // si hubieron dos intentos fallidos al // ingresar la clave

Lcd_Out(1,1,txt3); }while(1); } /***************************Seleccion de opciones*****************************/ Limpia_LCD(); Lcd_Out(1,1, txt4); // Muestra mensajes de opciones. Solo si se

Lcd_Out(2,1, txt5); // ingreso correctamente la clave

ingreso_opciones();

switch(presiona) { case 97: i=0; col=0; // Caso para retiro de dinero

cnt=0; valor=0; UART1_Init(19200); Limpia_LCD(); Lcd_Out(1,1, txt6);

do{ teclado(); Delay_ms(50);

// Lazo para evitar ceros a la izquierda

}while(presiona==0||presiona==35||presiona==42||presiona==48||presiona==97||presiona==98 ||presiona==99||presiona==100);

cantidad[i]= presiona; // Presenta en pantalla el valor col=col+1; // ingresado por teclado y lo guarda

Lcd_Chr(2, 5+col, presiona); Delay_ms(500); i=i+1; // Guarda en el arreglo temporal[] el // primer elemento del arreglo

do{ cnt=i; do {

// Ingresar el resto de los elementos

// del arreglo temporal teclado(); Delay_ms(50); }

while(presiona==0||presiona==42||presiona==97||presiona==98||presiona==99||presiona==10 0);

if(presiona==35){ break; } cantidad[i]=presiona; col=col+1; Lcd_Chr(2, 5+col, presiona);// Presenta en pantalla la clave ingresada por teclado Delay_ms(500); i=i+1; } while(i<4);

j=i; i=0;

do{ UART1_Write(cantidad[i]); temporal[] Delay_ms(100); i=i+1; }while(i<j); // Transmite los caracterres ingresados en el arreglo

while(!UART1_Data_Ready()) {

Delay_ms(100); } i=UART1_Read(); Delay_ms(500);

if(i==48) { // Caso para falta de fondos Limpia_LCD(); Lcd_Out(1,1, txt8); Delay_ms(1000); }

if(i==49) { // Caso para fondos disponibles Limpia_LCD(); Lcd_Out(1,1,txt9); Delay_ms(1000); }

Delay_ms(1000);

Limpia_LCD(); Lcd_Out(1,1,txt1); cnt=0;

cantidad[5]="";

break;

case 98: col=0; Limpia_LCD();

// Caso para cambio de clave

Lcd_Out(1,1, txt1);

do{ ingreso(); res=strcmp(clave, temporal); if(res==0) { Limpia_LCD(); Lcd_Out(1,1,txt2); Delay_ms(1000); Limpia_LCD(); Lcd_Out(1,1, txt1); } } while(!res); // Verifica que no sea la misma clave

for(i=0;i<4;i++) Clave[i]=temporal[i];

// Reemplaza clave anterior con nueva

Limpia_LCD(); Lcd_Out(1,1,txt7); Delay_ms(1000); limpia_LCD(); Lcd_Out(1,1,txt1);

// Presenta mensaje de ingreso de clave // nueva exitoso y regresa al paso 1.

break; } } while (1); }

Das könnte Ihnen auch gefallen