 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
02-07-2017, 12:48 PM
المشاركة 4
|
|
مشروع قفل باب رقمى باستخدام الميكروكونترولر PIC16F877A :
الغرض :
تطبيق على استخدام شاشة LCD و لوحة المفاتيح Keypad وذاكرة EEPROM الداخلية .
الدائرة الكهربية :

الوصف :
• لايوجد كلمة سر Password افتراضية ، ويوجد داخل البرنامج كلمة سر رئيسية master password وهى فى هذه الحالة (23456) ، على سبيل المثال ويمكن تغيرها وتغيير عدد الحروف من داخل البرنامج .
• فى بداية التشغيل يطلب منك الضغط على الزر * ، بعد الضغط على هذا الزر سوف يطلب منك إدخال كلمة السر ، عندئذ ينبغى عليك أن تقوم بإدخال كلمة السر الرئيسية متبوعة بالضغط على الزر # ، الذى يقوم مقام زر الإدخال Enter ، سوف تظهر لك رسالة تفيد إدخال رقم سرى جديد ، عندئذ يمكنك كتابة الرقم السرى الذى ترغب فيه ، بكتابة أربع أرقام و / أو حروف المتوفرة فى لوحة المفاتيح ثم الضغط على الزر # .
• إذا حدث خطأ فى كتابة رقم يمكنك إعادة الكتابة من جديد بالضغط على الزر * ليبدأ من جديد .
• بعد تحديد كلمة السر الجديدة يمكنك فتح وغلق الباب بإدخال الأربع أرقام ثم الضغط على الز # .
• يمكنك تغيير كلمة السر فى أى وقت بإدخال كلمة السر الرئيسية .
• كلمة السر سوف تظل محفوظة داخل ذاكرة EEPROM حتى بعد غياب القدرة .
• عند إدخال كلمة سر غير صالحة ، تظهر لك رسالة عدم السماح ACCESS DENIED .
• إذا تكرر إدخال كلمة سر غير صالحة لثلاثة محاولات ، عندئذ يعمل الإنذار وتظهر رسالة تحذير . بعد ذلك تنطلق إشارة التحذير عند كل محاولة غير صحيحة .

كود:
// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection
//================================
unsigned short kp,i=0,cnt,j=0;
char input_PW[10] ,user_PW[4];
//================================
char msg1[] = ".. PROTECTED ..",msg2[] = "ENTER PASSWORD";
char msg3[] = "ACCESS GRANETED",msg4[] = "ACCESS DENIED";
char msg5[] = "Enter New Code",msg6[] = "**Done**" ;
char msg7[] = " **WELCOME** " , msg8[] = " * WARNING * ";
//======================================================
void Move_Delay() { // Function used for text moving
Delay_ms(500); // change text moving speed here
}
//===============
void code_enter()
{
kp = 0; // Reset key code variable
// Wait for key to be pressed and released
do
kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
// Prepare value for output, transform key to it's ASCII value
switch (kp)
{
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 4: kp = 65; break; // A
case 8: kp = 66; break; // B
case 12: kp = 67; break; // C
case 16: kp = 68; break; // D
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
}
input_PW[i] = kp;
Lcd_Chr(2, i+6, input_PW[i]); // Print key ASCII value on Lcd
i++;
}
//======================================
void delay_20ms()
{
Delay_ms(20);
}
//=========================================
void code_read() //Read data from EEPROM
{
user_PW[0] = EEPROM_Read(0x00);// Read data from address 0
delay_20ms();
user_PW[1] = EEPROM_Read(0x01);// Read data from address 1
delay_20ms();
user_PW[2] = EEPROM_Read(0x02);// Read data from address 2
delay_20ms();
user_PW[3] = EEPROM_Read(0x03);// Read data from address 3
delay_20ms();
}
//===============================================
void code_write() //Write data from EEPROM
{
EEPROM_Write(0x00,input_PW[0]);// Write some data to address 0
delay_20ms();
EEPROM_Write(0x01,input_PW[1]);// Write some data to address 1
delay_20ms();
EEPROM_Write(0x02,input_PW[2]);// Write some data to address 2
delay_20ms();
EEPROM_Write(0x03,input_PW[3]);// Write some data to address 3
delay_20ms();
}
//================================================
void change_code()
{ loop:
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2, "NEW PASSWORD");
Delay_ms(500);
i=0;
code_enter();//get input_PW[0]
if(input_PW[0] == 42)//test input_PW[0] if * return to loop .
{goto loop ;}
code_enter();//get input_PW[1]
if(input_PW[1] == 42)//test input_PW[1] if * return to loop .
{goto loop ;}
code_enter();
if(input_PW[2] == 42)//test input_PW[2] if * return to loop .
{goto loop ;}
code_enter();
if(input_PW[3] == 42)//test input_PW[3] if * return to loop .
{goto loop ;}
code_enter();
if(input_PW[4] == 42)//test input_PW[4] if * return to loop .
{goto loop ;}
if(input_PW[4] == 35){ //if # then
code_write();//write input_PW[] to EEPROM from address 0 to 3
code_read();// read EEPROM from address 0 to 3 , save at user_PW[0] t0 user_PW[3]
Delay_ms(500);
Lcd_Out(2,5,msg6);//"**Done**"
Delay_ms(2000);
}
else {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,7, "ERROR");
Delay_ms(1000); }
}
//======================================
void main()
{
ADCON1 = 0x07; // Configure AN pins as digital
TRISA = 0x00; // set direction to be output
Keypad_Init(); // Initialize Keypad
Lcd_Init(); // Initialize Lcd
//=========================================================
code_read();//Read EEPROM to user_PW[0] to user_PW[3]
//===========
//Initially all EEPROM locatins has 0xFF value
if(user_PW[0] == 0xFF && user_PW[1] == 0xFF && user_PW[2] == 0xFF && user_PW[3] == 0xFF )
{
EEPROM_Write(0x00,'1');// Write some data at address 00
delay_20ms();
EEPROM_Write(0x01,'2');// Write some data at address 01
delay_20ms();
EEPROM_Write(0x02,'3');// Write some data at address 02
delay_20ms();
EEPROM_Write(0x03,'4');// Write some data at address 03
}
//=========================================================
code_read();
//===========
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Delay_ms(500);
Lcd_Out(1, 2,msg1 );//".. PROTECTED .."
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); // Clear display
//======================================
cnt=0; // numbers of attempts
//=====
do
{ begin:
PORTA.B0=1;//indication led on
PORTA.B1=0; // lock off
PORTA.B2=0; // alarm off
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2, 4, " PRESS '*'");
//========================
i = 0;//before start of code enter
code_enter();//press * to get input_PW[0]=42
if(input_PW[0] == 42)// *
{ start:
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1, 2, msg2);//"ENTER PASSWORD"
i = 0;//before start of code enter
code_enter();//get input_PW[0] , if you press * you will begin from start
if(input_PW[0] == 42)//*
{goto start ;}
code_enter();//get input_PW[1]
if(input_PW[1] == 42)
{goto start ;}
code_enter();//get input_PW[2]
if(input_PW[2] == 42)
{goto start ;}
code_enter();//get input_PW[3]
if(input_PW[3] == 42)
{goto start ;}
code_enter();//get input_PW[4]
if(input_PW[4] == 42)
{goto start ;}
//=====================================
// If you want to change Master Key, add your numbers to '2' '3' '4' '5' '6'
if(input_PW[0] == '2' && input_PW[1] == '3' && input_PW[2] == '4' && input_PW[3] == '5' && input_PW[4] == '6') //check master code
{
code_enter();//get input_PW[5]
if(input_PW[5] == 35)//#
{
change_code();
goto begin ;
}
}
//=======================================
if(cnt<3 && input_PW[0] == user_PW[0] && input_PW[1] == user_PW[1] && input_PW[2] == user_PW
[2] && input_PW[3] == user_PW[3] && input_PW[4] == 35) //compare code with store one
{
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1, 2, msg3);//"ACCESS GRANETED"
Lcd_Out(2, 2, msg7);//" **WELCOME** "
cnt=0;
PORTA.B0=0;//indication led off
PORTA.B1=1; // open
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2, 2, msg7);//" **WELCOME** "
//Moving text
for(i=0; i<4; i++) { // Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();}
Delay_ms(500);
for(i=0; i<8; i++) { // Move text to the right 8 times
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();}
Delay_ms(500);
for(i=0; i<4; i++) { // Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();}
Delay_ms(5000); // Lock reactivate Time
PORTA.B1=0;//close
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
Lcd_Out(1,2,msg1);//".. PROTECTED .."
Delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
}
else
{
cnt++;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 3,msg4 );//"ACCESS DENIED"
Delay_ms(2000);
}
if(cnt>=3)
{
do
{
PORTA.B0=0;// led off
PORTA.B2=1;//alarm on
while(j<3) { //repeat blink 3 times
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
Lcd_Out(1, 3, msg8 );//" * WARNING * "
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
Lcd_Out(1, 3, msg8 );//" * WARNING * "
Delay_ms(1000);
j++;
}
cnt=2;// one attempt only
j=0;
goto begin ;
}
while(1);
}
}
}
while(1);
}
|