#include <18f4550.h>
#fuses HS
#DEVICE ADC=10                                                                                                                                                          
#use delay (crystal = 20MHz) 
#use i2c(Master,Fast=100000, sda=PIN_D0, scl=PIN_D1,force_sw) 
#include <i2c_Flex_LCD.c>  
#define use_portb_kbd TRUE 
#include <KBD2.c>
#rom int8 0xF00000 = {'1','2','3','4'} 


int A = 1;
void menu(void);

void main(void)
{
   set_tris_A(0xFF);
   int item; 
   int n; 
   char k;
   int i; 
   char data[4], clave[4]; 
   lcd_init(0x4E,20,4); 
   kbd_init(); 
   port_b_pullups(TRUE); 
   while(true) 
   {
     
      if(input(PIN_A0)==0) 
      {
         item++; 
         delay_ms(300);
      }
      switch(item)
      {
         case 0:  
          lcd_gotoxy(1,1);
          lcd_putc("Elija una opcion y"); 
          lcd_gotoxy(1,2);
          lcd_putc("presione enter");     
          break;

        case 1:  
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 1        "); 
         lcd_gotoxy(1,2);
         lcd_putc("Ingresar Contra"); 
         if(input(PIN_A1)==0)  
       {
         lcd_putc("\f");  
         i=0;              
         lcd_putc("Ingresar clave");  
         while(i<=3)  
           {
            k=kbd_getc(); 
            
             if (k!=0)  
               {
                data[i]=k; 
                           
                i++;           
                lcd_gotoxy(i,2);
                lcd_putc('*'); 
                lcd_gotoxy(3,4);
                printf(lcd_putc, "%c", k); 
               }
           }
         for (i=0;i<=3;i++) 
         {
          clave[i]=read_eeprom(0xF00000);
                                 
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3])) 
                                                                                                
         {
         printf(lcd_putc,"\fACCESO CONCEDIDO"); 
         output_high(PIN_D2);                 
         delay_ms(1000);                      
         output_low(PIN_D2);                  
         lcd_putc("\f"); 
         menu();

        
         }
         else printf(lcd_putc,"\fACCESO DENEGADO"); 
         delay_ms(1000);                       
         item=0;               
         break;
         }
         break;
         
        case 2:  
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 2          "); 
         lcd_gotoxy(1,2);
         lcd_putc("Cambiar Contrase;a"); 
         if(input(PIN_A1)==0) 
         {
         lcd_putc("\f"); 
         i=0; 
         lcd_putc("Ingrese clave"); 
         while(i<=3) 
           {
            k=kbd_getc(); 
             if (k!=0) 
               {
                data[i]=k; 
                i++; 
                lcd_gotoxy(i,2);
                lcd_putc('*'); 
               }
           }
         for (i=0;i<=3;i++)
         {
          clave[i]=read_eeprom(i);
                                  
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))
                                                                                                
         {
         printf(lcd_putc,"\fContrasena nueva"); 
            while(n<=0) 
            {
               k=kbd_getc(); 
               if (k!=0) 
               {  
                  data[n]=k;     
                  write_eeprom(0xF00000,k);        
                  n++;        
                  lcd_gotoxy(n,2);
                  lcd_putc('*'); 
                  delay_ms(20);
               }
            }
            while(n<=1)
            {
               k=kbd_getc();
               if (k!=0) 
               {
                  data[n]=k;     
                  write_eeprom(0xF00001,k);
                  n++;              
                  lcd_gotoxy(n,2);
                  lcd_putc('*');    
                  delay_ms(20);         
               }
            }
            while(n<=2) 
            {
               k=kbd_getc(); 
               if (k!=0) 
               { 
                  data[n]=k;     
                  write_eeprom(0xF00002,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);         
               }
            }
            while(n<=3)
            {
               k=kbd_getc();  
               if (k!=0) 
               {   
                  data[n]=k;    
                  write_eeprom(0xF00003,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);   
               }
            }
            printf(lcd_putc,"\fContrasena cambiada");
         }
         else printf(lcd_putc,"\fContrasena incorrecta");
         delay_ms(1000);
         item=0;                
         break;
         }
         break; 

         default: 
         item = 0; 
         break;
      }
   }   
}

void menu(void)
{
//do
while(true){
   if(!input(pin_A2)==0)
   {
   A--;
   delay_ms(10);
   }
   
   if(!input(pin_A0)==0)
   {
   A++;
   delay_ms(10);
   }
   
   if(A>4)
   {
   A = 1;
   }
   
   if(A<1)
   {
   A=4;
   }
   
   if(A==1)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "-> Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "   Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "   Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "   Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==0)
      {
         printf(lcd_putc, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   ESCANEO1");
      }
   }
   
   if(A==2)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "-> Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "   Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "   Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==0)
      {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   ESCANEO2");
      }
   }
   
   if(A==3)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "   Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "-> Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "   Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==0)
      {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   ESCANEO3");
      }
   }
   
   if(A==4)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "   Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "   Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "-> Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==1)
      {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   ESCANEO4");
      }
   }
}//while(true);
}

