Summary of Password based door locking system
This project implements a low-cost password-based door lock using an AVR Atmega8 microcontroller. Passwords can be entered via a 4x3 matrix keypad or an IR RC-604 remote. The system drives two relays (one for a buzzer and one for a motor/door), displays prompts on a 16x2 LCD, and stores/retrieves the password in EEPROM. The article provides circuit diagrams, PCB layouts, Proteus simulation files, and full AVR C source code for programming and testing.
Parts used in the Password based door locking system:
- Atmega8 Microcontroller
- Relays
- Switches
- 4x3 Keypad Matrix
- LM7805 Voltage Regulator
- BC548 Transistor
- 16x2 LCD Display
- IR Remote (RC-604)
- Required passive components and PCB
Password based door locking system, uses Matrix keypad to enter the password, This project is extended to operate on IR Remote RC-604, In this project all required data is given Circuit diagram, C code, PCB design and All related data, This project is based on AVR Atmega8 Microcontroller.
Features:
1. You can enter password through Keypad or IR Remote
2. Low Cost
3. Simple to design
4. Operates Two relays One for Buzzer and Another for Operating Motor
Step 1: Major Components Required
2. Relays, Switches
4. LM7805
5. BC548
6. 16×2 LCD Display
Download Requires Files
1. Download Proteus Simulation Circuit Diagram (you can try proteus simulation of this project)
#include <avr/io.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include "remote.h"
unsigned char u8_data;
//LCD connections
#define E PD7
#define RS PB0
#define Relay PB3 //Relay1
#define Relay1 PB4 //Relay1
//Decleration
void display(char string[16]);
void displaybyte(char D);
void dispinit(void);
void cleardisplay(void);
void line1(void);
void line2(void);
void epulse(void);
void delay_ms(unsigned int de);
void PasswordNotOK();
void PasswordNotOK1();
char KeyCheck();
char mystr[6];
char Password[3];
int main(void)
{
DDRB = 0b00011011; //LCD port direction
DDRD = 0b11011001; //LCD port direction
DDRC = 0b00011010; //Key Pad
PORTC= 0b11111111; //Activate internal pullups for keypad
PORTD |=(1<<PD1);
// PORTB |=(1<<Relay);
delay_ms(500); //Initiaize LCD
dispinit();
delay_ms(200);
line1();
uint8_t cmd=0;
RemoteInit();
display(" Password ");
line2();
display(" Access ");
cleardisplay();
line1();
char Key,cnt;
cnt=0;
Key=KeyCheck();
if(Key==11)
{
//Get Old Password
line1();
display("Enter Old Pass: ");
line2();
cnt=0;
while(1)
{
Key = KeyCheck();
//cmd=GetRemoteCmd(0);
//displaybyte(cmd+48);
delay_ms(100);
if((Key != 15) && (cnt<4) && (Key !=11) && (Key !=12))
{
//line1();
//displaybyte(Key+48); //Display Passsword
displaybyte(0x2A); //"*" Display '*' Instead of password
Password[cnt]=Key;
cnt++;
}
if(Key==11) //Cancel Key
{
cnt=0;
PasswordNotOK1();
}
if(((Key !=15)) && (cnt==4))
{
if(Key==12) //OK Key
{
//Verify password
if(eeprom_read_byte((uint8_t*)4)==Password[0])
{
if(eeprom_read_byte((uint8_t*)5)==Password[1])
{
if(eeprom_read_byte((uint8_t*)6)==Password[2])
{
if(eeprom_read_byte((uint8_t*)7)==Password[3])
{
//PasswordOK
cleardisplay();
line1();
display(" Enter New ");
line2();
display("Password:");
while(1)
{
Key = KeyCheck();
delay_ms(100);
if((Key != 15) && (cnt<4))
{
//line1();
displaybyte(Key+48);
Password[cnt]=Key;
cnt++;
}
if((Key !=15) && (cnt==4))
{
if(Key==12) //OK Key
{
cleardisplay();
line1();
display("Password Changed");
eeprom_write_byte((uint8_t*)4,Password[0]);
eeprom_write_byte((uint8_t*)5,Password[1]);
eeprom_write_byte((uint8_t*)6,Password[2]);
eeprom_write_byte((uint8_t*)7,Password[3]);
delay_ms(2000);
cleardisplay();
break;
}
if(Key==11) //Cancel Key
{
cleardisplay();
break;
}
}
}
//}
//=========
cleardisplay();
line1();
display("Enter Password:");
line2();
cnt=0;
}
else
{
cnt=0;
//PORTB |= (1<<Relay1);
PasswordNotOK1();
}
}
else
{
cnt=0;
//PORTB |= (1<<Relay1);
PasswordNotOK1();
}
}
else
{
cnt=0;
//PORTB |= (1<<Relay1);
PasswordNotOK1();
}
}
else
{
cnt=0;
//PORTB |= (1<<Relay1);
PasswordNotOK1();
}
}
if(Key==11) //Cancel Key
{
cleardisplay();
line1();
display("Enter Old Pass: ");
line2();
cnt=0;
}
}
}
}
//----------------
line1();
display("Enter Password:");
line2();
cnt=0;
while(1)
{
Key = KeyCheck();
cmd=GetRemoteCmd(0);
//displaybyte(cmd+48);
delay_ms(100);
if((cnt<4) && (cmd !=10) && (cmd !=25) && (cmd !=255))
{
//line1();
//displaybyte(cmd+48);
displaybyte(0x2A); //"*"
Password[cnt]=cmd;
cnt++;
}
if((Key != 15) && (cnt<4) && (Key !=11) && (Key !=12))
{
//line1();
//displaybyte(Key+48);
displaybyte(0x2A); //"*"
Password[cnt]=Key;
cnt++;
}
if(Key==11 || cmd==10) //Cancel Key
{
cnt=0;
PasswordNotOK();
}
if(((Key !=15) || (cmd==25)) && (cnt==4))
{
if(Key==12 || cmd==25) //OK Key
{
//Verify password
if(eeprom_read_byte((uint8_t*)4)==Password[0])
{
if(eeprom_read_byte((uint8_t*)5)==Password[1])
{
if(eeprom_read_byte((uint8_t*)6)==Password[2])
{
if(eeprom_read_byte((uint8_t*)7)==Password[3])
{
//PasswordOK
cleardisplay();
PORTB |=(1<<Relay);
line1();
display("Open The Door");
delay_ms(4000);
cleardisplay();
//Operate Relay
PORTB &=~(1<<Relay);
line1();
display("Enter Password:");
line2();
cnt=0;
}
else
{
cnt=0;
PORTB |= (1<<Relay1);
PasswordNotOK();
}
}
else
{
cnt=0;
PORTB |= (1<<Relay1);
PasswordNotOK();
}
}
else
{
cnt=0;
PORTB |= (1<<Relay1);
PasswordNotOK();
}
}
else
{
cnt=0;
PORTB |= (1<<Relay1);
PasswordNotOK();
}
}
if(Key==11) //Cancel Key
{
cleardisplay();
line1();
display("Enter Password:");
line2();
cnt=0;
}
}
}
}
void PasswordNotOK()
{
cleardisplay();
line1();
display(" Incorrect ");
line2();
display(" Password ");
delay_ms(2000);
cleardisplay();
line1();
display("Enter Password:");
line2();
PORTB &=~ (1<<Relay1);
}
void PasswordNotOK1()
{
cleardisplay();
line1();
display(" Incorrect ");
line2();
display(" Password ");
delay_ms(2000);
cleardisplay();
line1();
display("Enter Old Pass: ");
line2();
}
char KeyCheck()
{
char KeyCode;
KeyCode=15;
//Scan 1
PORTC &=~(1<<PC1);
PORTC |=(1<<PC3);
PORTC |=(1<<PC4);
PORTD |=(1<<PD0);
if((PIND & 0x02)==0x00)
{
KeyCode=3;
while((PIND & 0x02)==0x00);
}
if((PINC & 0x04)==0x00)
{
KeyCode=2;
while((PINC & 0x04)==0x00);
}
if((PINC & 0x20)==0x00)
{
KeyCode=1;
while((PINC & 0x20)==0x00);
}
//Scan 2
PORTC |=(1<<PC1);
PORTC &=~(1<<PC3);
PORTC |=(1<<PC4);
PORTD |=(1<<PD0);
if((PIND & 0x02)==0x00)
{
KeyCode=6;
while((PIND & 0x02)==0x00);
}
if((PINC & 0x04)==0x00)
{
KeyCode=5;
while((PINC & 0x04)==0x00);
}
if((PINC & 0x20)==0x00)
{
KeyCode=4;
while((PINC & 0x20)==0x00);
}
//Scan 3
PORTC |=(1<<PC1);
PORTC |=(1<<PC3);
PORTC &=~(1<<PC4);
PORTD |=(1<<PD0);
if((PIND & 0x02)==0x00)
{
KeyCode=9;
while((PIND & 0x02)==0x00);
}
if((PINC & 0x04)==0x00)
{
KeyCode=8;
while((PINC & 0x04)==0x00);
}
if((PINC & 0x20)==0x00)
{
KeyCode=7;
while((PINC & 0x20)==0x00);
}
//Scan 4
PORTC |=(1<<PC1);
PORTC |=(1<<PC3);
PORTC |=(1<<PC4);
PORTD &=~(1<<PD0);
if((PIND & 0x02)==0x00)
{
KeyCode=12;
while((PIND & 0x02)==0x00);
}
if((PINC & 0x04)==0x00)
{
KeyCode=0;
while((PINC & 0x04)==0x00);
}
if((PINC & 0x20)==0x00)
{
KeyCode=11;
while((PINC & 0x20)==0x00);
}
return KeyCode;
}
void display(char string[16])
{
int len,count;
len = strlen(string);
for (count=0;count<len;count++)
{
displaybyte(string[count]);
}
}
void displaybyte(char D)
{
char D1;
D1=D;
D1=D1 & 0xF0;
D1=D1 >> 4; //Send MSB
PORTD = PORTD & (0b10100011);
PORTB = PORTB & (0b11111101);
PORTD |= ((D1 & 0x01) << 6);
//PORTD |= ((D1 & 0x02) << 1);
PORTB |= ((D1 & 0x02));
PORTD |= ((D1 & 0x04) << 2);
PORTD |= (D1 & 0x08);
epulse();
D1=D;
D1=D1 & 0x0F; //Send LSB
PORTD = PORTD & (0b10100011);
PORTB = PORTB & (0b11111101);
PORTD |= ((D1 & 0x01) << 6);
//PORTD |= ((D1 & 0x02) << 1);
PORTB |= ((D1 & 0x02));
PORTD |= ((D1 & 0x04) << 2);
PORTD |= (D1 & 0x08);
epulse();
}
void dispinit(void)
{
int count;
char init[]={0x43,0x03,0x03,0x02,0x28,0x01,0x0C,0x06,0x02,0x02};
PORTB &= ~(1<<RS); // RS=0
for (count = 0; count <= 9; count++)
{
displaybyte(init[count]);
}
PORTB |= 1<<RS; //RS=1
}
void cleardisplay(void)
{
PORTB &= ~(1<<RS); // RS=0
displaybyte(0x01);
PORTB |= 1<<RS; //RS=1
}
void line1(void)
{
PORTB &= ~(1<<RS); // RS=0
displaybyte(0x80);
PORTB |= 1<<RS; //RS=1
}
void line2(void)
{
PORTB &= ~(1<<RS); // RS=0
displaybyte(0xC0);
PORTB |= 1<<RS; //RS=1
}
void epulse(void)
{
PORTD |= 1<<E;
delay_ms(1);
PORTD &= ~(1<<E);
delay_ms(1);
}
void delay_ms(unsigned int de)
{
unsigned int rr,rr1;
for (rr=0;rr<de;rr++)
{
for(rr1=0;rr1<700;rr1++) //395
{
asm("nop");
}
}
}
Step 5: Test the code and Hardware
1. Follow us on Google+
2. You Did it Yourself
3. Refer Tutorials from this site for more understanding of code and Circuits
4. Please comment if you have any trouble, Its Tested code
- Can the password be entered using an IR remote?
Yes, the project is extended to operate with an IR Remote RC-604 as well as the keypad. - What microcontroller is this project based on?
The project is based on the AVR Atmega8 microcontroller. - Does the system use relays and what are they for?
Yes, it operates two relays: one for the buzzer and another for operating the motor (door). - Is the LCD used in the project specified?
Yes, a 16x2 LCD display is used to show prompts and messages. - Are circuit diagrams and PCB files provided?
Yes, the article provides circuit diagram, Proteus simulation file, and PDF PCB layout for download. - Is the AVR C source code available?
Yes, complete AVR Studio C code is provided in the article and downloadable as a project zip. - Where is the password stored?
The password is stored in EEPROM and read/written using AVR eeprom functions shown in the code. - Does the project include instructions for programming the controller?
Yes, the article includes a step for programming the controller and provides the necessary code files. - Is this project suitable for simulation?
Yes, a Proteus simulation circuit diagram is provided so you can try simulation of the project. - Is the design intended to be low cost and simple?
Yes, the features list states the project is low cost and simple to design.

