#include<16f877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#opt 9
#define use_portb_lcd TRUE
#include<lcd.c>

void input_ver(); 
void scanning(); 
void password_gir();
void ilk_sifre_gir(); 
void yeni_sifre_gir(); 
void iceri_gir();
void sifreyi_yaz(); 
void alarm(); 
void kiyas_ilk();
void kiyas_yeni(); 
void password_degis(); 
void prm();
void tmp(); 
void temp2perm(); 
void password_sifirlama();
void temp_sifirlama(); 
void perm_sifirlama(); 
void lcd_input_ver(); 
void sifre_vazgec();
int i,j,k,p1,p2,cikis,y,d,length,length_temp,length_perm,change,yeni,vazgec,sayac,itut,ktut;
int password[12], temp[12], perm[12];
float x,v,volt;
float read_voltage(BYTE ch);
void init_hardware();

main(void)
{
   lcd_init(); delay_ms(1); init_hardware();
   setup_ccp1(CCP_PWM);
   delay_ms(1000);
   ilk_sifre_gir();
   while(TRUE)
   {
      iceri_gir();
      printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"ingresar a casa: 1");
      printf(lcd_putc,"\n"); lcd_gotoxy(1,2); printf(lcd_putc,"cambiar password: 2");
      lcd_input_ver();
      if(change==1)
         { printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
         printf(lcd_putc,"Bienvenido! Usted puede\nentrar."); delay_ms(2000); }
      else { 
      password_degis(); }
   }
   return 0;
}

void init_hardware()
{
   setup_adc(ADC_CLOCK_DIV_8);
   setup_adc_ports(ALL_ANALOG);
}

float read_voltage(BYTE ch)
{
   set_adc_channel(ch);
   delay_us(100);
   v = read_adc();
   return(v);
}

void scanning()
{
   for(i=0;i<4;i++)
   { 
      x=read_voltage(i);
      if(x>245) { sayac++; break; }
   }
   if(i==4) 
      { i=3; }
   if((i<3)&&(sayac<2)) 
      {j=j+1; } 
   else 
      {j=j; } 
   k=k+1;
}

void input_ver()
{
   password_sifirlama();
   vazgec=0;
   itut=10;
   sayac=0;
   ktut=0;
   output_low(PIN_d2); output_low(PIN_d3); output_low(PIN_c4); output_low(PIN_c5);
   while(TRUE)
   {
      cikis=0; k=0;
      output_high(PIN_d2); delay_ms(1); scanning(); password_gir(); delay_ms(1);
      output_low(PIN_d2); delay_ms(1);
      if(cikis==1 || j==12 || vazgec==1) { break;}
      output_high(PIN_d3); delay_ms(1); scanning(); password_gir(); delay_ms(1);
      output_low(PIN_d3); delay_ms(1);
      if(cikis==1 || j==12 || vazgec==1) { break;}
      output_high(PIN_c4); delay_ms(1); scanning(); password_gir(); delay_ms(1);
      output_low(PIN_c4); delay_ms(1);
      if(cikis==1 || j==12 || vazgec==1) { break;}
      output_high(PIN_c5); delay_ms(1); scanning(); password_gir(); delay_ms(1);
      output_low(PIN_c5); delay_ms(1);
      if(cikis==1 || j==12 || vazgec==1) { break;}
   }
}

void lcd_input_ver()
{
   j=0;
   change=0;
   while(TRUE)
   {
      output_high(PIN_d3);
      for(i=0;i<4;i++)
      { volt=read_voltage(i); if(volt>245) { break; } }
      if(i==0) { change=1; break;}
      if(i==2) { change=2; break;}
   }
   output_low(PIN_d3); delay_ms(1800);
}

void password_gir()
{
   p1=k*k+i; p2=k*k+i-2;
   if((k==ktut) && (x<245)) { sayac=0;}
   if(i<3)
   {
      if(k==1 || k==2)
      { password[j-1]=p1; ktut=k; itut=i; if(sayac<2) { printf(lcd_putc,"*"); } }
      if(k==3)
      { password[j-1]=p2; ktut=k; itut=i; if(sayac<2) { printf(lcd_putc,"*"); } }
      if(k==4 && i==0)
      { delay_ms(250); password_sifirlama(); vazgec=1; }
      if(k==4 && i==1)
      { 
         password[j-1]=0; ktut=k; itut=i; 
            if(sayac<2) 
            { 
               printf(lcd_putc,"*"); 
            } 
      }
      if(k==4 && i==2) { cikis=1; }
   }
}

void sifreyi_yaz()
{
   if(j==12)
   { 
      delay_ms(400); length=j; printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
      printf(lcd_putc,"max. length\nreached"); delay_ms(1500); 
   }
   if(j<12) { length=j-1; }
}

void ilk_sifre_gir()
{
   while(TRUE)
   {
      j=0; d=0;
      while(TRUE)
      {
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Ingrese pass incial:");
         printf(lcd_putc,"\nPW="); input_ver();
         if(vazgec==1) 
         { 
            sifre_vazgec();
         }
         else { break; }
      }
      sifreyi_yaz(); prm(); password_sifirlama(); delay_ms(500);
      while(TRUE)
      {
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Reenter:\nPW=");
         j=0; input_ver();
         if(vazgec==1) { sifre_vazgec();} else { break; }
      }
      sifreyi_yaz(); d=0; kiyas_ilk(); delay_ms(100);
      if(d==j && length==length_perm)
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
         printf(lcd_putc,"pw verified"); delay_ms(2000); break; }
      else
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
         printf(lcd_putc,"passwords do not\nmatch!"); delay_ms(2000); perm_sifirlama(); }
   }
   printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
   printf(lcd_putc,"your password\nsaved."); delay_ms(2000);
}

void yeni_sifre_gir()
{
   while(TRUE)
   {
      delay_ms(500); j=0; d=0;
      printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Enter your new\npassword:");
      input_ver(); sifreyi_yaz(); tmp();
      password_sifirlama(); delay_ms(1000);
      printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Reenter:\nPW=");
      j=0; input_ver(); sifreyi_yaz(); d=0;
      kiyas_yeni(); delay_ms(100);
      if(d==j && length==length_temp)
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"password saved");
         delay_ms(2000); temp2perm(); temp_sifirlama(); break; }
      else
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"passwords do not\nmatch!");
         delay_ms(2000); temp_sifirlama(); }
   }
   printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"you can use use\nyour password.");
   delay_ms(2000);
}

void iceri_gir()
{
   y=0; printf(lcd_putc,"\f");
   lcd_gotoxy(1,1); printf(lcd_putc,"Enter password: "); delay_ms(100);
   while(TRUE)
   {
      j=0; password_sifirlama();
      lcd_gotoxy(1,2); printf(lcd_putc,"PW= "); input_ver();
      sifreyi_yaz(); d=0; kiyas_ilk();
      if(d==j && length==length_perm)
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
         printf(lcd_putc,"password correct"); break; delay_ms(2000); }
      else
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"password wrong"); delay_ms(2000);
         y=y+1; }
      printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"%d trial remained",4-y);
      if(y==4)
      { 
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"You are not\nauthorized");
         delay_ms(2000);
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Alarm will be\nactivated.");
         delay_ms(3000);
         y=0; alarm(); 
      }
   }
   printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
   printf(lcd_putc,"password correct"); delay_ms(2000);
   printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
   printf(lcd_putc,"You can\nenter"); delay_ms(2000);
}

void password_degis()
{
   yeni=0;
   while(TRUE)
   {
      printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
      printf(lcd_putc,"Enter old pass:"); printf(lcd_putc,"\nPW=");
      j=0; password_sifirlama();
      input_ver(); sifreyi_yaz(); d=0; kiyas_ilk();
      if(d==j && length==length_perm)
      { 
         yeni_sifre_gir(); yeni=1; break; 
      }
      else
      { 
         change=0; printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
         printf(lcd_putc,"Wrong!! Are you\nsure to change?"); delay_ms(1500);
         printf(lcd_putc,"\f"); lcd_gotoxy(1,1); printf(lcd_putc,"change pw: 1");
         printf(lcd_putc,"\n"); lcd_gotoxy(1,2); printf(lcd_putc,"disregard: 2");
         lcd_input_ver(); if(change!=1) { break; }
      }
   }
   if(yeni!=1) 
   { 
      printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
      printf(lcd_putc,"valid pw is the\nold one."); 
   }
}

void sifre_vazgec()
{
   printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
   printf(lcd_putc,"Password entrance\naborted."); delay_ms(2000); j=0; 
}

void kiyas_ilk()
{ 
   for(i=0;i<j;i++) { if(password[i]==perm[i]) {d=d+1; } }
}

void kiyas_yeni()
{ 
   for(i=0;i<j;i++) { if(password[i]==temp[i]) {d=d+1; } }
}

void prm()
{ 
   for(i=0;i<12;i++) { perm[i]=password[i]; } length_perm=length; 
}

void tmp()
{ 
   for(i=0;i<12;i++) 
   { 
      temp[i]=password[i]; 
   } 
   length_temp=length;
}

void temp2perm()
{ 
   for(i=0;i<12;i++) 
   { 
      perm[i]=temp[i]; 
   } 
   length_perm=length_temp; 
}

void password_sifirlama()
{ 
   for(i=0;i<12;i++) 
   { 
      password[i]=0; 
   } 
}

void perm_sifirlama()
{ 
   for(i=0;i<12;i++) 
   { 
      perm[i]=0; 
   } 
}

void temp_sifirlama()
{ 
   for(i=0;i<12;i++) 
   { 
      temp[i]=0; 
   } 
}

void alarm()
{ 
   printf(lcd_putc,"\f"); lcd_gotoxy(1,1);
   printf(lcd_putc,"Alarm is active\nin 2 minutes."); 
   delay_ms(2000);
}

