#include<Keypad.h>  
 #include<LiquidCrystal.h>  
 #include<EEPROM.h>
 #include<Servo.h>     
 Servo myservo;  
 #define buzzer A3  
 LiquidCrystal lcd(13,4,3,2,A1,A0);
 byte chia1[] = {
  B00000,
  B00000,
  B01000,
  B10100,
  B10011,
  B10100,
  B01000,
  B00000
};
byte chia2[] = {
  B00000,
  B00000,
  B00000,
  B00101,
  B11111,
  B00000,
  B00000,
  B00000
};
 byte khoa[] = {
  B01110,
  B10001,
  B10001,
  B10001,
  B11111,
  B11011,
  B11011,
  B11111
};
byte mo[] = {
  B01110,
  B10001,
  B10000,
  B10000,
  B11111,
  B11011,
  B11011,
  B11111
};
 byte cuoi[] = {
  B00000,
  B01010,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
  B00000
};
byte muiten[] = {
  B00000,
  B00000,
  B00100,
  B00010,
  B11111,
  B00010,
  B00100,
  B00000
};
byte dung[] = {
  B00000,
  B00000,
  B00001,
  B00010,
  B10100,
  B01000,
  B00000,
  B00000
};
byte sai[] = {
  B00000,
  B00000,
  B00000,
  B01010,
  B00100,
  B01010,
  B00000,
  B00000
};
 char password[4];  
 char pass[4],pass1[4];  
 int i=0;  
 char customKey=0;  
 const byte ROWS = 4;
 const byte COLS = 4;
 char hexaKeys[ROWS][COLS] = {  
  {'1','2','3','A'},  
  {'4','5','6','B'},  
  {'7','8','9','C'},  
  {'*','0','#','D'}  
 };  
 byte rowPins[ROWS] = {5, 6, 7, 8};
 byte colPins[COLS] = {9, 10, 11, 12};
 Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);   
 void setup()  
 {  
  myservo.attach(A2);
  lcd.begin(16,2);
  lcd.createChar(0,cuoi);lcd.createChar(2,muiten);lcd.createChar(3,dung);lcd.createChar(4,sai);lcd.createChar(5,khoa);lcd.createChar(6,mo);lcd.createChar(7,chia1);lcd.createChar(1,chia2);
  pinMode(buzzer, OUTPUT);  
  lcd.setCursor(0,0);
  lcd.print("|--------------|");
  lcd.setCursor(7,1);  
  lcd.write(byte (0));
  lcd.setCursor(8,1);
  lcd.write(byte (0));
  delay(1000);
  lcd.clear();
  lcd.setCursor(7,0);  
  lcd.write(byte (0));
  lcd.setCursor(8,0);
  lcd.write(byte (1));
  lcd.setCursor(0,1);
  lcd.print("|--------------|");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);  
  lcd.print("Nhap pass mo:");
  lcd.setCursor(14,0);
  lcd.write(byte (5));
  lcd.setCursor(2,1);
  lcd.write(byte (7));
  lcd.setCursor(3,1);
  lcd.write(byte (1));
  lcd.setCursor(6,1);  
  for(int j=0;j<4;j++)  
  EEPROM.write(j, j+49);  
  for(int j=0;j<4;j++)  
  pass[j]=EEPROM.read(j);  
 }  
 void loop()  
 {  
  myservo.write(0);
  customKey = customKeypad.getKey();  
  if(customKey=='#')  
  change();
  if (customKey)  
  {  
    password[i++]=customKey;  
    lcd.print("*");  
    beep();  
  }  
  if(i==4)  
  {  
   delay(200);  
   for(int j=0;j<4;j++)  
   pass[j]=EEPROM.read(j);  
   if(!(strncmp(password, pass,4)))  
   {
    myservo.write(0); 
    beep();  
    lcd.clear();
    lcd.setCursor(0,0);  
    lcd.print("Mat khau dung");
    lcd.setCursor(14,0);
    lcd.write(byte (3));
    myservo.write(180);
    lcd.setCursor(7,1);
    lcd.write(byte (6)); 
    delay(5000);  
    lcd.setCursor(0,1);  
    lcd.print("# Thay doi pass");
    lcd.setCursor(1,1);
    lcd.write(byte (2));
    delay(2000);
    myservo.write(0);  
    lcd.clear();
    lcd.setCursor(0,0);  
    lcd.print("Nhap pass mo:");
    lcd.setCursor(14,0);
    lcd.write(byte (5));  
    lcd.setCursor(6,1);  
    i=0;
    myservo.write(0);  
   }  
   else  
   {  
    digitalWrite(buzzer, HIGH); 
    lcd.clear();
    lcd.setCursor(0,0);  
    lcd.print("Mat khau sai");
    lcd.setCursor(13,0);
    lcd.write(byte (4));  
    lcd.setCursor(0,1);  
    lcd.print("# Thay doi pass");
    lcd.setCursor(1,1);
    lcd.write(byte (2));  
    delay(2000);  
    lcd.clear();
    lcd.setCursor(0,0);  
    lcd.print("Nhap pass mo:");
    lcd.setCursor(14,0);
    lcd.write(byte (5));  
    lcd.setCursor(6,1);  
    i=0;  
    digitalWrite(buzzer, LOW);  
   }  
  }  
 }  
 void change()  
 {  
  int j=0;  
  lcd.clear();
  lcd.setCursor(0,0);  
  lcd.print("Nhap pass cu:");  
  lcd.setCursor(6,1);  
  while(j<4)  
  {  
   char key=customKeypad.getKey();  
   if(key)  
   {  
    pass1[j++]=key;
    lcd.print("*");  
    beep();  
   }  
   key=0;  
  }  
  delay(500);  
  if((strncmp(pass1, pass, 4)))  
  {  
   lcd.clear();
   lcd.setCursor(0,0);  
   lcd.print("Sai pass");
   lcd.setCursor(9,0);
   lcd.write(byte (4));  
   lcd.setCursor(0,1);  
   lcd.print("Hay thu lai");  
   delay(1000);  
  }  
  else  
  {  
   j=0;  
  lcd.clear();
  lcd.setCursor(0,0);  
  lcd.print("Nhap pass moi:");  
  lcd.setCursor(0,1);  
  while(j<4)  
  {  
   char key=customKeypad.getKey();  
   if(key)  
   {  
    pass[j]=key;  
    lcd.print(key);  
    EEPROM.write(j,key);  
    j++;  
    beep();  
   }  
  }
  lcd.setCursor(7,1);
  lcd.print("Xong");
  lcd.setCursor(12,1);
  lcd.write(byte (3));   
  delay(1000);  
  }  
  lcd.clear();
  lcd.setCursor(0,0);  
  lcd.print("Nhap pass mo:");  
  lcd.setCursor(6,1);  
  customKey=0;  
 }  
 void beep()  
 {  
  digitalWrite(buzzer, HIGH);  
  delay(20);  
  digitalWrite(buzzer, LOW);  
 }  
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd2:VSS
lcd2:VDD
lcd2:V0
lcd2:RS
lcd2:RW
lcd2:E
lcd2:D0
lcd2:D1
lcd2:D2
lcd2:D3
lcd2:D4
lcd2:D5
lcd2:D6
lcd2:D7
lcd2:A
lcd2:K
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
servo1:GND
servo1:V+
servo1:PWM
bz1:1
bz1:2