كود:
#include <mega8.h> //لتعريف البرنامج بالمايكرو الذي نتعامل معه من اجل اضافة مكتبته الخاصة
#include <stdlib.h> //مكتبة خاصة بعمليات تحويل الارقام الطويلة الى سلسلة رقمية
#include <delay.h> //مكتبة خاصة بالتاخير الزمني
// Alphanumeric LCD Module functions
#include <alcd.h> // LCDمكتبة خاصة بشاشة
unsigned char comber[10],x=0,y=0,w=0,contr=0,conter1=0,LCD_X=3,LCD_Y=1,tem=0,flib=0; //مجموعة متحولات 8 بت
unsigned long int z=0,z1=0,z2=0; //مجموعة متحولات 32 بت
bit new=0,new1=0; // متحولات من النوع بت
eeprom long int passwrd,passwrd1; // متحولات في الذاكرة الدائمةلحفظ القيم فيها
void pass(unsigned char new_pas)
{
switch (new_pas)
{
case 1 : //اختبار الضغط على # فعند الضغط سيتم مسح الشاشة وطلب الباسوورد القديم
{
z=0; //المتحول الذي نخزن به الارقام بشكل مؤقت
lcd_clear(); //تعليمة مسح الشاشة
lcd_gotoxy(2,0); //تعليمة مكان الكتابة على الشاشة
lcd_puts("PASSWORD OLD");break; //تعليمة كتابة سلسلةاحرف
}
case 2 :
{
if((z==passwrd)||(z==passwrd1&&new1==1)) //بعد وضع الباسورد القديم او الباسوورد الاحتياطي اذا كان صحيحا سيتم
//السماح لنا ادخال الباسوورد الجديد
{
z=0;
w=0;
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts("New Password");break;
}
else if(z!=passwrd&&new1==0) //اما اذا كان الباسوورد خطأ سيعطي كلمة خطأوطلب الباسوورد القديم
{
z=0;
w++; //متحول لزيادة عداد المحاولات الخاطئة
contr=1;
lcd_clear();
lcd_gotoxy(5,0);
lcd_puts("ERROR");
delay_ms(2000); //تعليمة تاخير لمدة ثانيتين
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts("PASSWORD OLD");break;
}
}
case 3 :
{
z1=z; //نقل الباسوورد الجديد الى متحول جديد وطلب اعادة كتابته مرة اخرى
w=0;
lcd_clear();
lcd_gotoxy(5,0);
z=0;
lcd_puts("REPEAT");break;
}
case 4 :
{
z2=z; // نقل الباسورد الجديد مرة اخرى الى متحول اخر من اجل مقارنة المتحولين مع بعض
z=0;
if(z1==z2) // ثم يعود للعرض الطبيعيDONE اذا كان نتيجة مقارنة المتحولين صحيحة سيتم عرض كلمة
{
flib=0;
passwrd=z2; //الاحتفاظ بالباسووردالجديد بالذاكرة الدائمة
contr=0;
new=0;
new1=0;
w=0;
lcd_clear();
lcd_gotoxy(6,0);
lcd_puts("DONE");
delay_ms(2000);
lcd_clear();
lcd_gotoxy(1,0);
lcd_puts("INTER PASSWORD");break;
}
else if(z1!=z2) //اذا كانت نتيجةالمقارنة خاطئة سيطلب من المستخدم اعادة كتابة الباسورد الجديد مرتين
{
contr=2;
z=0;
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts("New Password");break;
}
}
};
}
///////////////////////////////////////////////////////////////////////
char keybad() //تابع لقرائة حالة الكيبادواختبار الزر المضغوط
{
char temp=20; //مخزن مؤقت لوضع القيمة فيه عند ضغط احد الكبسات
DDRB.0=1;DDRB.1=0;DDRB.2=0; //وضع صفرعلى العامود الاول وقرائة حالة المداخل عند الاسطر في الكيباد
if(!PINB.3)temp='3'; //اذا كانت حالة المدخل الاول اي السطر الاول قيمته صفر فهذا يعني اننا ضغطنا
//على الرقم 3 في الكيباد ونفس العملية بالنسبة لباقي الكبسات على نفس العامود
if(!PINB.4)temp='6';
if(!PINB.5)temp='9';
if(!PINB.6)temp='#';
DDRB.0=0;DDRB.1=1;DDRB.2=0;
if(!PINB.3)temp='2';
if(!PINB.4)temp='5';
if(!PINB.5)temp='8';
if(!PINB.6)temp='0';
DDRB.0=0;DDRB.1=0;DDRB.2=1;
if(!PINB.3)temp='1';
if(!PINB.4)temp='4';
if(!PINB.5)temp='7';
if(!PINB.6)temp='*';
return temp;
}
//////////////////////////////////////////////////////////////////////////////////
void main(void)
{
PORTB=0xF8;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0xC0;
DDRD=0x3F;
ACSR=0x80;
SFIOR=0x00;
// Alphanumeric LCD initialization ترتيب وصل اقطاب الشاشة مع المايكروكونترولر
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 5
// RD - PORTC Bit 6
// EN - PORTC Bit 4
// D4 - PORTC Bit 3
// D5 - PORTC Bit 2
// D6 - PORTC Bit 1
// D7 - PORTC Bit 0
// Characters/line: 16
lcd_init(16); //تعريف الشاشة على انها ذات 16 محرف
lcd_gotoxy(1,0); //مكان الكتابة على الشاشة
lcd_puts("INTER PASSWORD"); //طلب ادخال الباسوورد لفتح الخزنة
////////////////////////////////////////////////////////////////////////
while (1)
{
if(PIND.6==0)passwrd=z; //تخزين قيمة الباسورد الاساسي اول مرة في الذاكرة الدائمةيكون بكتابة
//الرقم والضغط على كبسة مؤقتة في المايكرو
if(PIND.7==0)passwrd1=z; //تخزين قيمة الباسورد الاحتياطي اول مرة في الذاكرة الدائمة يكون بكتابة
//الرقم والضغط على كبسة مؤقتة اخرى في المايكرو
x=keybad(); // X قرائة حالة الكيباد باستمرار ووضع القيمة في المتحول
if(y!=x) //من اجل كتابة الرقم مرة واحدة عند الضغط على اي كبسة
{
delay_ms(200); // تاخير زمني قبل الكتابة في المتحول لحين استقرار ضغطة اليد على الكبسة
y=x;
if(x=='#'&&new1==0)flib++;//للتبديل بين طلب ادخال باسورد جديد او العودة للعرض العادي
if(flib==1&&x=='#') //لطلب ادخال باسوورد جديد
{
LCD_X=3;
new=1;
contr=1;
conter1=0;
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
pass(contr);
w=0;
z=0;
new1=0;
}
if(flib==2&&x=='#') //للعودة للعرض العادي
{
flib=0;
LCD_X=3;
new=0;
contr=0;
conter1=0;
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
lcd_clear();
lcd_gotoxy(1,0);
lcd_puts("INTER PASSWORD");
w=0;
z=0;
}
if(x=='*'&&new==1&&z!=0) //عند الضغط على النجمة في حال تبديل الباسورد سيتم استدعاء تابع من الاعلى لفحص
{ //النتيجة ووضع الحالة على الشاشة
LCD_X=3;
contr++;
conter1=0;
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
pass(contr);
z=0;
}
/////////////////////////////////////
if(x=='*'&&new==0&&z!=0) //عند الضغط على النجمة في حال محاولة فتح الخزنة اذا كانت القيمة الموجودة
//تساوي القيمة الموجودة في الذاكرة الدائمة سيتم فتح الخزنة Zفي المتحول
{ //ثم العودة للعرض بالشكل العاديGOODوالكتابة على الشاشة
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
if(z==passwrd&&new1==0&&z!=0)
{
z=0;
w=0;
LCD_X=3;
conter1=0;
lcd_clear();
lcd_gotoxy(6,0);
lcd_puts("GOOD");
PORTD.0=1;
delay_ms(2000);
PORTD.0=0;
lcd_gotoxy(1,0);
lcd_puts("INTER PASSWORD");
}
else if(z==passwrd1&&new1==1&&z!=0)//تبديل الباسوورد باستخدام الباسورد الاحطياطي في حال نسينا الاصلي
{
LCD_X=3;
new=1;
contr=2;
conter1=0;
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
pass(contr);
w=0;
z=0;
}
else if(z!=passwrd1&&new1==1)//لوضع خطأاذا كان الباسورد الاحتياطي الذي ندخله خاطئ والمحاولة مرة اخرى
{
z=0;
w++;
LCD_X=3;
conter1=0;
lcd_clear();
lcd_gotoxy(5,0);
lcd_puts("ERROR");
delay_ms(2000);
lcd_clear();
lcd_gotoxy(1,0);
lcd_puts("PASSWORD BACKUP");
}
else if(z!=passwrd&&new1==0) //لوضع خطأاذا كان الباسوردالاصلي الذي ندخله خاطئ والمحاولة مرة اخرى
{
w++;
z=0;
if(w<3)
{
LCD_X=3;
conter1=0;
lcd_clear();
lcd_gotoxy(5,0);
lcd_puts("ERROR");
PORTD.2=1;
delay_ms(2000);
PORTD.2=0;
lcd_gotoxy(1,0);
lcd_puts("INTER PASSWORD");
}
/////////////////////////////////////
////////////////////////////
}
}
if(w==3) //في حال ادخلنا باسورد خاطئ ثلاث مرات سنمنع من المحاولة مرة اخرى لمدة 10 دقائق
{ //واضائة ليد الانتظار وكتابة على الشاشة
LCD_X=3;
conter1=0;
PORTD.1=1;
lcd_clear();
lcd_gotoxy(4,0);
lcd_puts("WAITING");
for (tem=0;tem<10;tem++)
{
delay_ms(60000);
};
PORTD.1=0;
lcd_gotoxy(1,0);
lcd_puts("INTER PASSWORD");
w=0;
new1=0;
}
if(x!=20&&x!='*'&&x!='#'&&conter1<8) //لتخزين الارقام المدخلة بشكل مؤقت في المتحول وادخال 8ارقام كحد اقصى
{ //ووضع نجوم بدل الارقام من اجل عدم رؤية احد للارقام عند كتابتها
LCD_X++;
delay_ms(200);
z=(z*10)+x;
ltoa(z,comber);
conter1++;
lcd_gotoxy(LCD_X,LCD_Y);
lcd_puts("*");
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
}
//////////////////////////////////////
}
if(PINB.7==0&&new1==0) //للانتقال الى تبديل الباسورد بالاستعانة بالباسورد الاحتياطي في حال نسينا الاصلي
{
z=0;
w=0;
new1=1;
lcd_clear();
lcd_gotoxy(1,0);
lcd_puts("PASSWORD BACKUP");
PORTD.3=1;
delay_ms(250);
PORTD.3=0;
new=0;
contr=0;
}
}
}