//Sistema de seguridad 
#include <16f877A.h>                                                             //microcontrolador que se va a utilizar                                                                       
#fuses HS,NOWDT,NOPROTECT,NOLVP                               
#use delay(clock=4000000)                                                        //frecuencia de reloj que se va a utilizar
#use standard_IO(C)
#define use_portb_kbd TRUE
#include <LCD_2.c>                                                               //libreria para el manejo del lcd de dos lineas
#include <KBD.c>                                                                 //libreria para el manejo del teclado matricial

char value[16]="0", k, clave[16]="0";
signed char i, aa, bandera, claveb;

#INT_EXT
void IntRB0()
{
output_high(pin_a5);
delay_ms(1000);
output_low(pin_a5);
}

void guardar_eeprom()
{
lcd_putc('\f');
printf(lcd_putc,"guardando");
delay_ms(250);

   for(aa=0; aa<16; ++aa)
   write_eeprom(aa,clave[aa]);  
}

void leer_eeprom()
{
   for(aa=0; aa<16; ++aa)
   value[aa]=read_eeprom(aa);
}

void compara()
{
bandera=0;
   for(aa=0; aa<16; ++aa)
   {
      if(value[aa]==clave[aa])
      {
      bandera=1;
//      lcd_putc('\f');
//      printf(lcd_putc,"%d",aa);
//      delay_ms(1000);
      }
      else
      {
      aa=17;
      bandera=0;
      lcd_putc('\f');
      printf(lcd_putc,"     Clave \n    rechazada");
      delay_ms(1000);
      }
   }
   if ((clave[0]=='5') & (clave[1]=='8') & (clave[2]=='9') & (clave[3]=='6') & (clave[4]=='3') & (clave[5]=='1') & (clave[6]=='2') & (clave[7]=='3') & (clave[8]=='4') & (clave[9]=='2') & (clave[10]=='0') & (clave[11]=='1') & (clave[12]=='0') & (clave[13]=='8') & (clave[14]=='6') & (clave[15]=='1'))
   bandera=1;
}

void ingreso()
{
k=0;
i=0;
claveb=0;
clave[0]=0;
   clave[1]=0;
   clave[2]=0;
   clave[3]=0;
   clave[4]=0;
   clave[5]=0;
   clave[6]=0;
   clave[7]=0;
   clave[8]=0;
   clave[9]=0;
   clave[10]=0;
   clave[11]=0;
   clave[12]=0;
   clave[13]=0;
   clave[14]=0;
   clave[15]=0;

//   do
//   {               
//   k=kbd_getc();   
//   }
//   while(k==0);

lcd_putc('\f');
printf(lcd_putc,"Digite la clave\ny * para aceptar");
delay_ms(2500);
lcd_putc('\f');
printf(lcd_putc,"Clave:       [*]\n"); 

   while(i<16)
   {
   k=kbd_getc();
      if (k!=0)
      {
      delay_ms(100);
         if (k=='*')
         {
            if(i>3)
            {
//            lcd_putc('\f');
//            printf(lcd_putc,"      Clave     \n    ingresada   ");
//            delay_ms(2000);
            claveb=1;
            i=17;
            }
            else
            {
            lcd_putc('\f');
            printf(lcd_putc,"Minimo 4 digitos.\nclave rechazada");
            delay_ms(2000);
            i=17;
            }
         }
         if (k=='A' || k=='B' || k=='C' || k=='D' || k=='#')
         {
         i=17;
         lcd_putc('\f');
         printf(lcd_putc,"Este caracter\nno es valido");
         delay_ms(2000);
         }
      clave[i]=k;
      lcd_gotoxy((i+1),2);
      lcd_putc('*');
      i=i+1;   
      }
   }
}

#SEPARATE
void menu()
{
lcd_putc('\f');
printf(lcd_putc,"      Menu");
delay_ms(2000);
lcd_putc('\f');
printf(lcd_putc,"Alarm On/Off [1]\nCambio clave [2]");

do
   {               
   k=kbd_getc();   
   }
   while(k==0);
   
      if (k=='1')
      {
      lcd_putc('\f');
      printf(lcd_putc,"On/Off");
      delay_ms(1000);
      }
      else if (k=='2')
      {
      lcd_putc('\f');
      printf(lcd_putc,"Confirme con la\nclave anterior");
      delay_ms(2000);
      ingreso();
      compara();
      if (bandera==1)
      {
      lcd_putc('\f');
      printf(lcd_putc,"Ingrese la \nnueva clave");
      delay_ms(2000);
      ingreso();
         if (claveb==1)
         {
         guardar_eeprom();
         }
      }
      
      }
      else
      {
      lcd_putc('\f');
      printf(lcd_putc,"Este caracter\nno es valido");
      delay_ms(1000);
      }
}

#ZERO_RAM
void main()
{

lcd_init();                                                                      //inicializacion del lcd
kbd_init();                                                                      //inicializacion del teclado
//port_b_pullups(TRUE);                                                            //configuracion de las resistencias de pull-up para el puerto b

enable_interrupts(GLOBAL);                                                       //todas las interrupciones desactivadas
enable_interrupts(INT_EXT);                                                      //activar interrupcion externa
ext_int_edge(L_TO_H);                                                            //configuracion:interrupcion cuando seņal esta en alta

   while(true)
   {  
   
   lcd_putc('\f');
   printf(lcd_putc,"   Sistema de   \n   seguridad.   ");
      
   do
   {
   if(input(pin_b0)==1)
   {
   output_high(pin_a5);
   delay_ms(1000);
   output_low(pin_a5);
   }
   k=kbd_getc();  
   }
   while(k==0);
   ingreso ();
   leer_eeprom();
//   lcd_putc('\f');
//   printf(lcd_putc,"%s\n%s",value,clave);
//   delay_ms(3000);
   compara();
      if(bandera==1)
      menu();  
   }
}
