#include <16F877A.h> //Incluye la libreria del PIC
#fuses HS
#use delay(clock=4M) //Define la frecuencia con que se trabajara

#define LCD_ENABLE_PIN  PIN_C5
#define LCD_RS_PIN  PIN_C6
#define LCD_RW_PIN  PIN_C7
#define LCD_DATA4_PIN  PIN_D4
#define LCD_DATA5_PIN  PIN_D5
#define LCD_DATA6_PIN  PIN_D6
#define LCD_DATA7_PIN  PIN_D7

#define use_portb_kbd TRUE //Sentencia para poder conectar el teclado al puerto B

#include <lcd.c> // incluye libreia del lcd
#include <KBD2.c> //incluye libreria del teclado modificada
#rom 0x2100={'7','2','3','A'} //contraseņa guardada en memoria


void main(void)
{
   int item; //declaramos item
   int n; // declarmos n
   char k;
   int i; //Inicializamos i
   char data[4], clave[4]; //Espacio de memoria 
   lcd_init(); //inicializamos lcd
   kbd_init(); //inicializamos el teclado
   port_b_pullups(TRUE); //habilitamos resistencias de pullups
   while(true) //ciclo infinito
   {
     
      if(input(PIN_A0)==0) //Si en el Pin AO hay un cero logico debido a que se pulse el boton opciones
      {
         item++; //Incrementar item
         delay_ms(300);
      }
      switch(item)
      {
         case 0:  //si item es igual a cero
          lcd_gotoxy(1,1);
          lcd_putc("Elija una opcion y"); // Imprime este mensaje
          lcd_gotoxy(1,2);
          lcd_putc("presione enter");     //Imprime este mensaje
          break;

        case 1:  // si item igual a 1
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 1        "); //imprime este mensaje
         lcd_gotoxy(1,2);
         lcd_putc("Ingresar Contra"); //Imprime este mensaje
         if(input(PIN_A1)==0)  //Si en el Pin A1 hay un cero logico debido a que se pulse el boton enter
       {
         lcd_putc("\f");  //Limpia la pantalla LCD
         i=0;              // i igual a cero
         lcd_putc("Ingresar clave");  //Imprime este mensaje
         while(i<=3)  //siempre que i sea menor o igual a 3
           {
            k=kbd_getc(); //Se obtiene el valor de la tecla pulsada
             if (k!=0)  //Si ka es diferente de nulo
               {
                data[i]=k; //Guarda el valor de la tecla pulsada en un
                           //Espacio de memoria
                i++;       //Incrementa i      
                lcd_gotoxy(i,2);
                lcd_putc('*'); //se imprime * en representacion de un caracter
               }
           }
         for (i=0;i<=3;i++) //Ciclo para guardar la clave en moria en una nueva variable
         {
          clave[i]=read_eeprom(i);//Lee la clave guardada en memoria y la guarda en una nueva variable
                                  //Para luego comprobarla con la clave ingresada por el usuario
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3])) //comparacion de la clave ingresada
                                                                                                //Con la clave guardada en memoria
         {
         printf(lcd_putc,"\fPuerta Abierta"); //Si las claves son iguales se imprime este mensaje
         output_high(PIN_A3);                 //Si las claves son iguales el PIN A3 se pone en alto
         delay_ms(19000);                      // Espera 1 segundo
         output_low(PIN_A3);                  //El PIN A3 se pone en bajo
         }
         else printf(lcd_putc,"\fPuerta Cerrada"); //Si las claves no son iguales se imprime este mensaje
         delay_ms(1000);                        //Espera 1 segundo
         item=0;                //item se iguala a cero con el fin de que se devuelva al primer caso de item
         break;
         }
         break;
         
        case 2:  //Si item igua a2
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 2          "); //Imprime este mensaje
         lcd_gotoxy(1,2);
         lcd_putc("Cambiar Contra"); //Imprime este mensaje
         if(input(PIN_A1)==0) //Si en el Pin A1 hay un cero logico debido a que se pulse el boton enter
         {
         lcd_putc("\f"); //Limpia pantalla lcd
         i=0; //Se iguala i a cer
         lcd_putc("Ingrese clave"); //Imprime este mensaje
         while(i<=3) //Condicion de que siempre que i sea menor o igual a 3
           {
            k=kbd_getc(); //Se obtiene el valor de la tecla pulsada
             if (k!=0) //si k esta vacio
               {
                data[i]=k; //Guarda el valor de la tecla pulsada en la variable data
                i++; //se incrementa item
                lcd_gotoxy(i,2);
                lcd_putc('*'); //se imprime * en representacion de un caracter
               }
           }
         for (i=0;i<=3;i++)
         {
          clave[i]=read_eeprom(i);//Lee la clave guardada en memoria y la guarda en una nueva variable
                                  //Para luego compararla con la clave ingresada por el usuario
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))//comparacion de la clave ingresada
                                                                                                //Con la clave guardada en memoria
         {
         printf(lcd_putc,"\fClave nueva"); //Si las claves son iguales se imprime este mensaje
            while(n<=0) //Siempre que n sea menor o igual a 0
            {
               k=kbd_getc(); //Se obtiene el valor de la tecla presionada
               if (k!=0) //Si k esta vacio
               {  
                  data[n]=k;     //Guarda el valor de la tecla en la variable data o
                  write_eeprom(0x2100,k); //Se escibe el valor de la tecla en el primer espacio de memoria         
                  n++;           //se incrementa n
                  lcd_gotoxy(n,2);
                  lcd_putc('*'); //Se imprime * en representacion de un caracter
                  delay_ms(20);
               }
            }
            while(n<=1) //Siempre que n sea menor o igual a 1
            {
               k=kbd_getc();//Se obtiene el valor de la tecla presionada
               if (k!=0) //Si k esta vacio
               {
                  data[n]=k;     //Guarda el valor de la tecla en la variable data 1
                  write_eeprom(0x2101,k);//Se escibe el valor de la tecla en el segundo espacio de memoria 
                  n++;              //se incrementa n
                  lcd_gotoxy(n,2);
                  lcd_putc('*');    //Se imprime * en representacion de un caracter
                  delay_ms(20);         
               }
            }
            while(n<=2) //Siempre que n sea menor o igual a 2
            {
               k=kbd_getc(); //Se obtiene el valor de la tecla presionada
               if (k!=0) //Si k esta vacio
               { 
                  data[n]=k;     //Guarda el valor de la tecla en la variable data 2
                  write_eeprom(0x2102,k);//Se escibe el valor de la tecla en el tercer espacio de memoria 
                  n++;              //se incrementa n
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   //Se imprime * en representacion de un caracter
                  delay_ms(20);         
               }
            }
            while(n<=3) //Siempre que n sea menor o igual a 3
            {
               k=kbd_getc();  //Se obtiene el valor de la tecla presionada
               if (k!=0) //Si k esta vacio
               {   
                  data[n]=k;     //Guarda el valor de la tecla en la variable data 3
                  write_eeprom(0x2103,k);//Se escibe el valor de la tecla en el tercer espacio de memoria
                  n++;              //se incrementa n
                  lcd_gotoxy(n,2);
                  lcd_putc('*');    //Se imprime * en representacion de un caracter
                  delay_ms(20);   
               }
            }
            printf(lcd_putc,"\fClave cambiada");//Cuando se introduce la clave nueva imprime este mensaje
         }
         else printf(lcd_putc,"\fClave incorrecta"); //Si las claves no son iguales se imprime este mensaje
         delay_ms(1000); //Espera 1 segundo
         item=0;                 //item se iguala a cero con el fin de que se devuelva al primer caso de item
         break;
         }
         break; 

         default: //Caso por defecto
         item = 0; //Devuelve al primer caso de item
         break;
      }
   }   
}

