ناتي الان لشرح داله char function_password
كود:
char function_password()
{
pp=0; // start value
password=0; // start value
check_password=0; // randam value
state_password=255; // randam value but not = 0 or 1
choice=255;// randam value but not equal=0
master_code=0;
for(x=0;x<16;x++) eeprom_write(16+x,0xff);// clear eeprom
for(x=0;x<16;x++) eeprom_write(32+x,0xff);//clear eeprom
while(1)
{ ////// choice what you need input password or changed////////
keypad(); // must be choice either kp=12 (#);(input password)
//or press * and more 5 sec choice (change password)
// or press 0 and more 5 sec master code display
if( kp is 4 &&cont>70)
{
lcd_cmd(1);
pp=1;
choice =0;
message(change_password); // change password message
}
if( kp is 12 && pp is 1)
{
message(old_password);
delay_ms(1000);
pp=0;
break;// exit from while
}
if( kp is 4 &&cont<50)
{
choice =255;
lcd_cmd(1);
return; //exit from while
}
else if( kp is 8 && cont>=70) // press " 0 "
{
master_password();// show master code but Encrypted
}
else if(kp is 12 && choice !=0)// kp=12 mean press #
{
lcd_cmd(1);
message(input_pass);// change password message
break;//exit from while
}
}
///////////////////////////////////////////////////////////////////
while(1)
{
keypad();
if(choice !=0 )
{
input_password_test();
if(state_password is 1)
{
lcd_cmd(1);
return state_password;
}
}
else if( choice is 0 && check_password is 0)new_password_test();
else if(check_password is 1)
{
change_password_test();
if(password is 3)return;
}
}
}
طبعا اعطيت للمتغيرات قيم الاوليه حتى ضمن عدم قراءه خاطئه يعني وجود خطا في تنفيذ الاوامر خصوصا نحن نستفاد من متغيرات في اكثر من داله لانه من غير معقول استخدام متغيرات لكل داله لذا من ضروري ولغرض اعطاء ضمان اكثر في تنفيذ صحيح للاوامر
متغير pp مهمته هو حساب طول شفره وخزنها في ايبروم
متغير password متغير مهم استخدمته لخزن الاشارات وبيان مراحل انتقالي من مرحله الى اخرى في اختبار تغير باسورد
متغير choice يختار ام تغير شفره بوضعه choice=0 او ادخال شفره بوضع choice !=0
متغير check_password متغير استخدمته عند تغير شفره فاذا تم دخول شفره بشكل صحيح يطلب مني شفره جديده بعده ادخال هذه شفره راح يصبح check_password=1 وهنا راح يطلب من مايكرو ادخال شفره للتاكيد
متغير master_code ايضا متغير استخدمته في حاله تغير شفره وبدخال ماستركود هنا تتغير قيمته الى 1 اذا كان شفره صحيحه ولى 0 اذا كانت خاطئه
متغير state_password يصبح 1 اذا كان ادخال شفره صحيح ويصبح 0 اذا كانت خاطئه
=========================
ملاحظه قبل في بدايه اختبار شفره لابد من تهيئه ذاكره ايبروم اي يغير الارقام التي تم خزنها مسبقا يعني بالبدايه ولاول مره يتم استخدام برنامج لاتلاحظ هناك مشكله ولكن بعد ذلك ستلاحظ هناك مشكله وهي لما تخزن قيم في ايبروم او مصفوفه لغرض مقارنتها مع شفره الاصليه فاذا كانت نتيجه مقارنه صحيحه ستبقى هذه الارقام مخزونه وعندما اريد ادخال شفره مره اخرى بمجرد الضغط على enter سوف يخبرك شفره صحيحه وهذه ثغره لماذا لان قيم مخزونه ولم تصفرها لغرض ادخال باسورد مره اخرى وعليه كتبت انه اخزن قيمه عشوائيه طبعا اكبر من 9 لان كيباده تبدا من 0 الى 9 انظرو الى كود
كود:
for(x=0;x<16;x++) eeprom_write(16+x,0xff);// clear eeprom
for(x=0;x<16;x++) eeprom_write(32+x,0xff);//clear eeprom
الان بعد ان وضعنا قيم الاوليه للبرنامج يدخل في لوب مستمر حتى يعرف ماذا ينفذ
وهنا تم استدعاء داله keypad لقراءه مفاتيح وعند ضغط على مفتاح ينفذ مايكرو الاوامر التاليه
(( ارجوا تصحيح هذا كود في برنامج مرفق في اول رد فانا لغيت pp واستخدمت choice لانهما يؤديان الامر نفسه ))
1-
كود:
if( kp is 4 &&cont>70)
{
lcd_cmd(1);
choice =0;
message(change_password); // change password message
}
هنا تم ضغط على * ولكن بزمن الكثر من 5 ثواني عندها يضع choice=0
راح يعرض لي رساله change password ولكن ينتظر مني موافقه عن طريق ضغط على #
لكن ماذا استفاد من الامر choice=0 هو عندما اضغط على اي مفتاح سوف يصبح kp لايساوي 4 وبالتالي شرط
كود:
if( kp is 4 &&cont>70)
علاوه على ذلك count عندما يقل يلقي شرط ولكني محتاج ان يبقى شرط معاي فعال لاني لم انهي مااردته جواب بسيط اضع متغير ليس له علاقه بشرط وهنا استخدمت choice=0 وبالتالي اخبرت مايكرو انه تم ضغط على علامه * اكثر من 5
اذا ضقطت على enter اي علامه # سيقارن هل تم ضغط على * اكثر من 5 ثواي كيف يعرف ذلك من خلال قيم تم خزنها وهي choice=0
2-
كود:
if( kp is 12 && choice is 0)
{ lcd_cmd(1);
message(old_password);
delay_ms(1000);
break;// exit from while
}
هنا طالما choice =0 معناها ضغطت على * اكثر من 5 ثواني وعند ضغط على # يعني enter راح يعرض لي رساله old password اي يريد مني شفره القديمه حتى يستطيع الاستمرار
3-
كود:
else if( kp is 8 && cont>=70) // press " 0 "
{
master_password();// show master code but Encrypted
}
هنا اذا ضغطت على 0 اكثر من 5 ثواني راح يعرض مايكرو على شاشه master key ولكنه كود مشفر
4-
كود:
if( kp is 4 &&cont<50)
{
choice =255;
lcd_cmd(1);
return; //exit from while
}
هنا اذا تم ضغط على * ولكن ليست ضغطه طويله سيلغي ماطلبته من مايكرو ويرجعني الى قائمه الرئيسيه عن طريق الامر return
5-
كود:
else if(kp is 12 && choice !=0)// kp=12 mean press #
{
lcd_cmd(1);
message(input_pass);
break;//exit from while
}
اما هنا سوف يتاكد هل قمت بالضغط على * لغرض تغير شفره عن طريق اختبار هل choice لايساوي 0 اذا كان لايساوي صفر سوف ادخل مباشره الى داله ادخال باسورد
تلاحظون قيمه الاوليه choice=255 واي قيمه تشاء ماعدا 0 لانها ستخدع مايكرو وتخبره انه تم ضغط على * ولن ينفذ داله ادخل باسورد لذا قيم الاوليه مهمه
كيف يتم تغيرها لاحظ برنامج هل هناك قيم تؤثر على برنامج يعني لو لم جعل مثلا password=1 ماراح تتنفذ داله فلانيه فبالتاكيد تضع password=1 في بدايه تنفيذ داله لغرض التاكيد من برنامج يسير وفق ماتم برمجته
=================================================
الان اما اضغط على # وهنا يطلب من ادخال شفره وطبعا اجعل متغير choice =255 مهم لاتساوي 0
ام اذا ضغطت على * اكثر من 5 ثواني راح يجعل choice=0 وعند ضغط على # راح يتم دخول الى داله تغير شفره
في الحالتين سوف يخرج من لوب مستمر ليدخل في لوب مستمر اخر
ماذا يحصل هنا
كود:
while(1)
{
keypad();
if(choice !=0 )
{
input_password_test();
if(state_password is 1)
{
lcd_cmd(1);
return state_password;
}
}
else if( choice is 0 && check_password is 0)new_password_test();
else if(check_password is 1)
{
change_password_test();
if(password is 3)return;
}
}
اكيد اول خطوه استدعي كيباده// لاحظو فائده دوال فرعيه تقلل كود وتسهل فهمه وحتى للو كررتها لاتؤثر على حجم الكود
1-
كود:
if(choice !=0 )
{
input_password_test();
if(state_password is 1)
{
lcd_cmd(1);
return state_password;
}
}
اذا كان choice !=0 فيدخل في داله ادخال شفره وهذه داله ترجع قيمه
بشرط ان تكون شفره صحيحه
طبعا اولا راح يتم اختبار شفره عن داله اختبار الشفره لاحظ كود
كود:
input_password_test();
بعد مقارنه شفره التي تم ادخالها مع شفره مخزونه اذا كانت نتيجه مقارنه دلت على باسورد صحيح يصبح متغير state_password is 1 عدا ذلك يصبحstate_password is 0
==============================================4
كود:
else if( choice is 0 && check_password is 0)new_password_test();
اذا كان متغير choice =0 اي انني طلب تغير شفره هنا كتبت دالتين يمكنك وضعهما في داله واحده
كتبت داله الاولى وسميتها
كود:
new_password_test();
عند تنفيذ هذه داله راح تتطلب منك رمز قديم وعندما يتم ادخال رمز تعمل له مقارنه هل رمز صحيح اذا كان صحيح راح تظهر رساله ادخل شفره جديده وطبعا هذه رساله لها طريقان الاول عن طريق ادخال رمز صحيح وثاني عن طريق ادخال ماستركي
اذا تم تنفيذ داله بنجاح تجعل متغير check_password = 1 وهنا راح يدخل في داله اخرى وهي
كود:
change_password_test();
وهنا في هذه الداله سيطلب منك اعاده ادخال شفره اذا كانت صحيحه يخبرك بان شفره تم تغيرها واذا كانت خاطئه يجعل check_password = 0 لتعاد عمليه ولكن ليست من بدايه (
بدايه هي ادخال رمز قديم لغرض تغيره وبدونه لايمكن تغير شفره)
وانما من بدايه التي تأمرك بادخال شفره جديده
اذا تم عمليه تغير شفره بنجاح سوف يرجعني مايكرو الى قائمه الرئيسيه ولكن كيف
عن طريق متغير اسمه password اذا كانت قيمته =3 فان عمليه تغير كانت ناجحه