قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 02:42 AM المشاركة 1   
افتراضي password project with master key Twitter FaceBook Google+



سلام عليكم
اهذا مشروع باسورد يمكنك ادخال شفره من 1 الى 15 رقم
وفيها ماستر كود
هذا ماستر مبرمج داخل ذاكره ايبروم للمايكرو وفي حاله نسيان مكنت للمستخدم رؤيه ماستر كود ولكن مشفر لابد له حل شفره واستخراج كود صحيح وطبعا عليه الاتصال بمبرمج
تشفير فقط في عرض رقم ماستر
ولكن في هذا المشروع لم تعطي عدد محاولات الخطأ
بالتاكيد سوف اشرح كود وخصوصا ماستر كود كيف تم تشفيره وحل شفره
بالنسبه للعدد محاولات الخطأ واعطاء زمن block اي لايسمح لك بادخال شفره الا بعد زمن معين فيمكن اضافه لاحقا
اي سؤال بخصوص كود انا حاضر
http://arabsh.com/files/0d3e444f61f5...-code-rar.html
============================================
رقم سري هو 1234
رقم سري للماستر كود هو 112233
عند ضغط على علامه # سوف يطلب منك باسورد
للتغير باسورد أضغط على علامه * لاكثر من 5 ثواي
لمسح او رجوع عندما تكون في قاءمه تغير شفره او عرض ماستر اضغط على * ولكن لاتزيد ضغطه عن 5 ثواي
ايضا لمسح باسورد في حاله كتبت رقم زائد او خطأ اضغط على *
لرؤويه ماستر كود اضغط على 0 لاكثر من 5 ثواني سوف يظهر لك ماستر كود ولكنه مشفره عليك حل شفره لاستخراج كود


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 17-08-2013 الساعة 02:50 AM
اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 03:08 AM المشاركة 2   
افتراضي


مشروع باسورد
كود:
#define led             portc.f0
#define led_dir         trisc.f0
#define input           1
#define output          0
#define on              1
#define off             0
#define is              ==

////////////////////////////////////////////
// LCD module connections
sbit LCD_RS at RA0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RA2_bit;
sbit LCD_D5 at RA3_bit;
sbit LCD_D6 at RA4_bit;
sbit LCD_D7 at RA5_bit;

sbit LCD_RS_Direction at TRISA0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISA2_bit;
sbit LCD_D5_Direction at TRISA3_bit;
sbit LCD_D6_Direction at TRISA4_bit;
sbit LCD_D7_Direction at TRISA5_bit;

char keypadPort at PORTB;
//////////////////////////////////variable/////////////
char kp=0, number=0 , x=0 , pp=0 , state_password=255 ;
char check_password=255 , password=0 , choice=255, cont1=0 ;
unsigned int cont=0;
char my_txt[16], txt[3];
char master[]={1,1,2,2,3,3};
char master_code=0;
///////////////////////// message ///////////////////////////////
const char check_pass[]            ="check password  ";
const char correct_pass[]          ="correct password" ;
const char input_pass[]            ="input password  ";
const char new_pass[]              ="new password    ";
const char uncorrect_pass[]        ="vaild password  ";
const char old_password[]          ="old password    ";
const char change_password[]       ="change password ";
const char enter[]                 ="   press enter  ";
/////////// define function /////////////////////////////
char keypad();
char function_password();
void test_password(char address);
void message(const char *rom);
void master_password_test();
void input_password_test();
void new_password_test();
void master_password();
void change_password_test();
//////////////////////////////////////////////////////////

void init()
{
  ansel=0;
  anselh=0;
  GIE_BIT=1;//Global Interrupt Enable bit
  T0IE_bit=1;//Timer0 Overflow Interrupt Enable bit
  T0IF_bit=0;// Timer0 Overflow Interrupt Flag bit
  T0CS_bit=0; // Internal instruction cycle clock (FOSC/4)
  PSA_bit=0; // Prescaler is assigned to the Timer0 module
  PS2_bit=1;PS1_bit=1;PS0_bit=1; //1 : 256
  Lcd_Init();
  lcd_cmd(_LCD_CURSOR_OFF);
  Keypad_Init();
  led_dir=output;
  led=off;
  ///// master code////
  eeprom_write(48,6);// write length for master code =6
  for(x=1;x<=6;x++)
      {
       eeprom_write(48+x,master[x-1]);
      }
}
//////////////////////////////////////////////////////////////////////////////
void interrupt()
{
 if( T0IF_bit == 1) cont1++;
 if(cont1 =256){ cont1=0;cont++;}
 T0IF_bit=0;
}
void main()
{
 init();
 while(1)
    {
      lcd_out(1,1,"led off");
      function_password();
      if (state_password is 1)
              {
               lcd_out(1,1,"led ON ");
               for(x=0;x<10;x++)
                     {
                      led=~led;
                      delay_ms(1000);
                     }
                 state_password=255;
                   lcd_cmd(1);

              }

    }
}
///////////////////////// show message ////////////////////
void message(const char *message)
{
 for(x=0;x<16;x++) my_txt[x]=message[x];
 lcd_out(1,1,my_txt);
}

////////////////////////char keypad()///////////////////////////////////

char keypad()
{
 kp=0;number=0;
 while(1)
  {
    while( kp is 0)
          { cont=0;cont1=0; // clear timer
           kp=Keypad_Key_Click();
          }
    if( kp is 1 )       number=1;
    else if( kp is 2  ) number=4;
    else if( kp is 3  ) number=7;
    else if( kp is 5  ) number=2;
    else if( kp is 6  ) number=5;
    else if( kp is 7  ) number=8;
    else if( kp is 8  ) number=0;
    else if( kp is 9  ) number=3;
    else if( kp is 10 ) number=6;
    else if( kp is 11 ) number=9;
    else if( kp is 12 ) kp=12;// inter  (#)
    else if( kp is 4  ) kp=4;// (*): delete number if writing worng number
                          // more 5 sec for change password
    return kp;
   }

}

////////////////////////////////////////////////////////////////////////////////

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;
            }

   }

}
//////////////////////////////////////////////////////////////////////////////
void test_password(char address)
{
 if(kp is 4 && pp>0)// cancel password
        {
          pp--;
          eeprom_write(address,pp);
          lcd_chr(2,pp+1,' ');
        }
 else if(kp !=4 && kp!=255)
           {
              if(pp<15) // passaword length max. 15 can be change and one for store number of password
                   { 
                      pp++;
                      eeprom_Write(pp+address,number); //must be write pp for write address start from 1
                      lcd_chr(2,pp,'*');
                      eeprom_write(address,pp);
                    }
           }

}
///////////////////////////////////////////////////////////////////////////////
void  master_password()
{
 lcd_out(1,1,"master code");
 for(x=1;x<=6;x++)
   {
    bytetohex((eeprom_read(48+x)+100),txt);

    lcd_chr(2,x+6,txt[1]);
    lcd_chr(2,x,txt[0]);

   }

}
void input_password_test()
{
 if(kp !=12 )// password before change
          {
           test_password(16);
          }
     //////////// test password input with original password//////////

 while(kp is 12  && eeprom_read(16)>0) // if switch(#) enter  is pressed
         {
             message( input_pass);
             for(x=0;x<=eeprom_read(16);x++)
                     {
                      if( (eeprom_read(x+16)is eeprom_read(x)) ) state_password=1;
                       else { state_password=0; break;}// password vaild and exit from for
                     }
             if(  state_password is 1)
                     {
                      lcd_cmd(1);
                      message(correct_pass);
                      delay_ms(1000);
                     }

            else if ( state_password is 0 )
               {
                state_password=255;// random value but not equal 0 or 1
                lcd_cmd(1);
                message(uncorrect_pass);
                delay_ms(1000);
                message( input_pass);
               }
            pp=0;
            kp=255; // exit from  while because now kp=12
          }
}
void new_password_test()
{
 if(kp !=12 && password is 0)// password before change
          {
           test_password(16);
          }
     //////////// test password input with original password//////////

 while(kp is 12 && password is 0 && eeprom_read(16)>0) // if switch(#) enter  is pressed
    {
         for(x=0;x<=eeprom_read(16);x++)
             {
               if( (eeprom_read(x+16)is eeprom_read(x)) ) password=1;
               else { password=0; break;}// password vaild and exit from for
             }

         if( password is 0)// check master code
              {
               for(x=0;x<=eeprom_read(16);x++)
                   {
                     if( (eeprom_read(x+16)is eeprom_read(48+x)) ) master_code=1;
                     else { master_code=0; break;}// password vaild and exit from for
                    }

              }
         if ( password is 0&& master_code is 0 )
             {
              state_password=255;// random value but not equal 0 or 1
              lcd_cmd(1);
              message(uncorrect_pass);
              delay_ms(1000);
              lcd_cmd(1);
              message(old_password);
             }
       if( password is 1 ||  master_code is 1 )
           {
            check_password =0;
            lcd_cmd(1);
            message(new_pass);
            delay_ms(1000);
            master_code=2;//this using for exit form condition  if( (password is 1 ||  master_code is 1)&&  check_password is 0)
            password=2;// this using for exit form condition  if( (password is 1 ||  master_code is 1)&&  check_password is 0)
           }
       kp=255;// because now kp=12 and condition if( kp is 12 && password is 2) password=3; is active
       pp=0;
     }
 if(kp !=12 && kp !=255 && password is 2)
             {
               test_password(16);
             }
 if(kp is 12 && password is 2 )
            {
              lcd_cmd(1);
              message(check_pass); //check password message
              delay_ms(1000);
              check_password=1;
              kp=255;// because now kp=12 and condition if( kp is 12 && password is 2) password=3; is active
              pp=0;
            }
}
void change_password_test()
{
 if(kp !=12 && password is 2 )// check password if true password change
             {
               test_password(32);
             }

 if( kp is 12 && password is 2  ) // if switch(#) enter  is pressed
            {

             for(x=0;x<=eeprom_read(16);x++)

                   {
                     if( eeprom_read(x+16) is eeprom_read(32+x)   )password=3;

                     else {
                           lcd_cmd(1);
                           check_password=0;// back to function new password and start form if(kp !=12 && kp !=255 && password is 2)
                           message(uncorrect_pass);// vaild password message
                           delay_ms(1000);
                           message(new_pass);// new password message
                           pp=0;
                          }
                   }
            }
 if(password is 3)
        {
            for(x=0;x<=eeprom_read(16);x++)eeprom_write(x,eeprom_read(x+16));
            lcd_cmd(1);
            message(change_password);// change password message
            delay_ms(1000);
            state_password=255;
            lcd_cmd(1);
            return ;
        }
}


شرح كود
===========================
هذه مجرد تعاريف
كود:
#define led             portc.f0
#define led_dir         trisc.f0
#define input           1
#define output          0
#define on              1
#define off             0
#define is              ==
وهذا تعريف الشاشه وكيبورد
كود:
// LCD module connections
sbit LCD_RS at RA0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RA2_bit;
sbit LCD_D5 at RA3_bit;
sbit LCD_D6 at RA4_bit;
sbit LCD_D7 at RA5_bit;

sbit LCD_RS_Direction at TRISA0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISA2_bit;
sbit LCD_D5_Direction at TRISA3_bit;
sbit LCD_D6_Direction at TRISA4_bit;
sbit LCD_D7_Direction at TRISA5_bit;

char keypadPort at PORTB;
مجموعه من متغيرات مع ماستر كي
كود:
char kp=0, number=0 , x=0 , pp=0 , state_password=255 ;
char check_password=255 , password=0 , choice=255, cont1=0 ;
unsigned int cont=0;
char my_txt[16], txt[3];
char master[]={1,1,2,2,3,3};
char master_code=0;
دوال فرعيه التي تم استخدامها
كود:
char keypad();
char function_password();
void test_password(char address);
void message(const char *rom);
void master_password_test();
void input_password_test();
void new_password_test();
void master_password();
void change_password_test();
رسائل العرض على شاشه وتم خزنها كلها في روم لكون روم كبيره حجم مقارنه لرام وهذا يعني توفير مساحه في رام وهذه طريقه مفضله في عرض رسائل لانك اذا استخدمت رام بكثره قد يعلق مايكرو
كود:
const char check_pass[]            ="check password  ";
const char correct_pass[]          ="correct password" ;
const char input_pass[]            ="input password  ";
const char new_pass[]              ="new password    ";
const char uncorrect_pass[]        ="vaild password  ";
const char old_password[]          ="old password    ";
const char change_password[]       ="change password ";
const char enter[]                 ="   press enter  ";
================================================
هذه داله تم تجميع فيها كل معلومات التي يتم تعريف بها للمايكرو كتعريف شاشه وكيبورد ومداخل ومخارج وتصفير الاخراج وكذلك تفعيل تايمر زيرو
بالسبه للكود
كود:
///// master code////
  eeprom_write(48,6);// write length for master code =6
  for(x=1;x<=6;x++)
      {
       eeprom_write(48+x,master[x-1]);
      }
تم من خلالها خزن ماستر كود في ايبروم طبعا يمكنك خزن هذا رقم طبعا اي رقم يتم اختياره في ذاكره ايبروم في اعدادات برنامج عن طريق eeprom edditer او اثناء برمجه مايكرو
لكني استخدمته هنا لكي يعمل معاي بروتيس فقط

كود:
void init()

{
  ansel=0;
  anselh=0;
  GIE_BIT=1;//Global Interrupt Enable bit
  T0IE_bit=1;//Timer0 Overflow Interrupt Enable bit
  T0IF_bit=0;// Timer0 Overflow Interrupt Flag bit
  T0CS_bit=0; // Internal instruction cycle clock (FOSC/4)
  PSA_bit=0; // Prescaler is assigned to the Timer0 module
  PS2_bit=1;PS1_bit=1;PS0_bit=1; //1 : 256
  Lcd_Init();
  lcd_cmd(_LCD_CURSOR_OFF);
  Keypad_Init();
  led_dir=output;
  led=off;
  ///// master code////
  eeprom_write(48,6);// write length for master code =6
  for(x=1;x<=6;x++)
      {
       eeprom_write(48+x,master[x-1]);
      }
}


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 17-08-2013 الساعة 03:21 AM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 03:44 AM المشاركة 3   
افتراضي


كود ادناه خاص بانتربت وهنا تم تفعيل تايمرزيرو وتم اختيار نسبه تقسيم 1/256 وتردد كرستاله 4MHZ اي زمن = 1us ولكني محتاج في مشروع 5 ثواني كيف احصل عليها
اقصى قيمه ممكن ان يصل لها تايمرزيرو 256x256=65536us
ولكني محتاج 5 ثواني وتساوي 5000000us بقسمه على اقصى رقم يصل اليه تايمرزيرو نحصل على 77 لذلك وضعت متغيرين الاول يعد كلما طفح tmr0 اي كل 256 نبضه وسميته cont1 اما متغير cont فهذا يعد عندما يصل tmr0 الى حدود قصوى لغرض الحصول على زمن اكبر

كود:
void interrupt()

{
 if( T0IF_bit == 1) cont1++;
 if(cont1 =256){ cont1=0;cont++;}
 T0IF_bit=0;
}
=================================================
ناتي الان الى داله رئيسيه
طبعا اولا مايشتغل مايكرو ينفذ هذه داله وبعدها ينتقل الى دوال فرعيه حسب ماموجود في داله الرئيسيه
طبعا لابد وضع داله تعريف مايكرو لكي يتم تعرف على كل ماربط في بورتات وهل ادخالات ام هي خرج
بعدها سيدخل في لوب مستمر وسيعرض بالبدايه ان ليد مطفي وبعدها يدخل في داله باسورد نترك شرحنا الان
بعد خروج من داله باسورد اذا كانت شفره صحيحه
كود:
state_password is 1
يشتغل ليد وينطفئ 10 مرات بزمن 1 ثانيه لاطفاء و1 ثانيه للتشغيل طبعا يمكن وضع اي شي مكان لهذا ليد
اما اذا كانت شفره غير صحيحه فلا ينفذ شي
ملاحظه كتبت بنهايه الامر
كود:
 state_password=255;
حتى يوقف عمل ليد لكون هذا ليد مشروط بامر
كود:
if (state_password is 1)


كود:
void main()
{
 init();
 while(1)
    {
      lcd_out(1,1,"led off");
      function_password();
      if (state_password is 1)
              {
               lcd_out(1,1,"led ON ");
               for(x=0;x<10;x++)
                     {
                      led=~led;
                      delay_ms(1000);
                     }
                 state_password=255;
                   lcd_cmd(1);

              }

    }
}


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 04:15 AM المشاركة 4   
افتراضي


كود:
void message(const char *message)
{
 for(x=0;x<16;x++) my_txt[x]=message[x];
 lcd_out(1,1,my_txt);
}
هذا داله مسؤوله عن عرض رسائل تلاحظون ان متغير داخل داله message من نوع ثابت ومن نوع pointer اي متغير ياخذ مصفوفه وسبب لان رسائل مخزونه في روم
طريقه العمل هو استدعاء هذه داله ويتم كتايه بين الاقواس اسم رساله
هذه طريقه ستخفض حجم كود كما تريحك من كتابه عده كواد علاوه على ذلك تعطي للكود فهم اكبر لانك فقط تخبره اعرض رساله فلانيه على سبيل مثال
كود:
message(input_pass);
في هذا كود استدعيت داله message وخبرته اعرض رساله ادخل باسورد فالمتغير داخل message راح يؤشر على عنوان مصفوفه
كود:
const char input_pass[]            ="input password  ";
لكن الان اريد عرضها على شاشه هل يمكن عرضها مباشره اكيد لابد من نقل الرساله الى رام
لاحظوا كود اعلاه ستجدون فقط امر تحويل رساله الى رام ثم عرضها على شاشه
وهكذا كلما اريد اعرض رساله مجرد ان اضع مؤشر على هذه رساله وداله message ستحول هذه رساله الى رام لتعرضها على شاشه
طبعا اقصد بمؤشر اقصد متغير ثابت موجود في داله message هو نوع pointer اي مؤشر لاني كتبت امامه علامه *
=================================================
اما داله keypad فمهمتها هي قراءه مفاتيح بشكل صحيح اي مثلما مكتوب على كيباده لاحظوا الكود
كود:
char keypad()
{
 kp=0;number=0;
 while(1)
  {
    while( kp is 0)
          { cont=0;cont1=0; // clear timer
           kp=Keypad_Key_Click();
          }
    if( kp is 1 )       number=1;
    else if( kp is 2  ) number=4;
    else if( kp is 3  ) number=7;
    else if( kp is 5  ) number=2;
    else if( kp is 6  ) number=5;
    else if( kp is 7  ) number=8;
    else if( kp is 8  ) number=0;
    else if( kp is 9  ) number=3;
    else if( kp is 10 ) number=6;
    else if( kp is 11 ) number=9;
    else if( kp is 12 ) kp=12;// inter  (#)
    else if( kp is 4  ) kp=4;// (*): delete number if writing worng number
                          // more 5 sec for change password
    return kp;
   }

}
نقاط مهمه في كود
كود:
kp=0;number=0;
هنا لابد من جعل kp=0 حتى استطيع قراءه مفاتيح لماذا انظر كود
كود:
while( kp is 0)
          { cont=0;cont1=0; // clear timer
           kp=Keypad_Key_Click();
          }
تلاحظون انه لايمكن دخول الى لوب مستمر الى اذا كانت kp=0 هو يمكن جعل kp=0 قبل استدعاء داله keypad ولكن وضع kp=0 في داله keypad نفسها يعطي ضمان اكثر
كما تلاحظون( وهذا مهم جدا ) اني وضعت cont=0;cont1=0; قبل قراءه اي مفتاح
لاحظو كود مره اخرى
كود:
while( kp is 0)
          { cont=0;cont1=0; // clear timer
           kp=Keypad_Key_Click();
          }
لماذا وضعت cont=0;cont1=0; قبل () kp=Keypad_Key_Click
جواب طالما انا لم اضغط على مفتاح راح يختبر باستمرار وبنفس وقت راح يصفر cont1 , cont لان tmr0 يعمل باستمرار وليس له علاقه بعمل مايكرو
وعندما يتم ضغط على اي مفتاح سيبقى مايكرو مشغول بتنفيذ الامر القراءه
اي
كود:
kp=Keypad_Key_Click();
واكيد cont1 , cont اصبح لهما قيم تعبر عن زمن استمرار ضغطه مفاتيح كما ستصبح قيمه kp لاتساوي صفر وهنا
سيخرج من لوب لان شرط اصبح غير متحقق
ولكن لايجوز ان اضع cont , cont1 بعد الامر القراءه اقصد التالي
كود:
 while( kp is 0)
          {
           kp=Keypad_Key_Click();
           cont=0;cont1=0; // clear timer
          }
لماذا كود خطأ لان مايكرو ينفذ امر قراءه ثم ينفذ cont=0;cont1=0 وهكذا
وعندما يتم ضغط على لوحه مفاتيح وعند انتهاء من تنفيذه قبل ان يخرج من لوب راح ينفذ cont=0;cont1=0 لان مايكرو ينفذ الاوامر بتسلسل اي من اعلى الى الاسفل

كما ايضا لايجوز وضع cont=0;cont1=0 في بدايه اي لاحظ كود
كود:
char keypad()
{
 kp=0;number=0;
 cont=0;cont1=0; // clear timer
 while(1)
  {
    while( kp is 0)
          {
           kp=Keypad_Key_Click();

          }
    if( kp is 1 )       number=1;
    else if( kp is 2  ) number=4;
    else if( kp is 3  ) number=7;
    else if( kp is 5  ) number=2;
    else if( kp is 6  ) number=5;
    else if( kp is 7  ) number=8;
    else if( kp is 8  ) number=0;
    else if( kp is 9  ) number=3;
    else if( kp is 10 ) number=6;
    else if( kp is 11 ) number=9;
    else if( kp is 12 ) kp=12;// inter  (#)
    else if( kp is 4  ) kp=4;// (*): delete number if writing worng number
                          // more 5 sec for change password
    return kp;
   }

}
لماذا انه count1 , count هما عدادان لقراءه زمن فعند استدعاء داله keypad يتم تصفير هذه عدادات في بدايه فقط ويبقى مايكرو كما قلنا مشغول بتنفيذ الامر قراءه من لوحه لوحه مفاتيح هنا ستبقى العدادات مستمره في حساب زمن فالبتاكيد
حساب زمن اصبح خاطئا وهذا يؤثر على برنامج


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 17-08-2013 الساعة 04:46 AM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 06:02 AM المشاركة 5   
افتراضي


ناتي الان لشرح داله 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 فان عمليه تغير كانت ناجحه


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 17-08-2013 الساعة 06:46 AM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 07:49 AM المشاركة 6   
افتراضي


قبل شرح دوال ادخال شفره وتغير شفره لابد من شرح داله مهمه وهي مسؤوله عن خزن الشفره التي تم ادخالها
ملاحظه
شفره الاصليه مخزونه في ايبروم بتدءا من العنوان 0 الى 16 العنوان 0 تم خزن فيه طول شفره وبقيه 15 تمثل شفره طبعا يمكنك جعلها اكثر من ذلك ولكن اكتفيت بذلك لكون طول شاشه عرض هي 16 حرف
اما العنوان 17 الى 31 يتم فيها خزن شفره موقته وبعد اعمل مقارنه بين بيانات مخزونه في ايبروم من عنوان 0 الى 16 مع بيانات مخزونه من عنوان 17 الى 31
طبعا اولا مقارنه تبدا بطول شفره وهي ليست لها علاقه برمز يعني شفره اذا كانت 6 ارقام وقمت بادخال 5 ارقام اوتوماتيكي راح يخبرك شفره غير صحيحه خصوصا ان هذا برنامج لايحدد طول شفره فانت لاتعرف كم هو طولها
ام في حاله تغير شفره فانا محتاج مصفوفتين الاولى تخزن شفره الاولى والمصفوفه الثانيه تخزن شفره التاكيد طبعا هنا لم استخدم مصفوفات وانما استغليت ذاكره ايبروم
لغرض توفير مساحه في رام
خزنت شفره الاولى في اي ايبروم من عنوان 17 الى 31 والثانيه من عنوان 32الى 47 طبعا لايجوز خزن بايبروم من عنوان 0 الى 16 لانها محجوزه لشفره الاصليه او من عنوان 48 الى 64 لانها محجوزه لـــ master key

الان لاحظو كود
كود:
void test_password(char address)
{
 if(kp is 4 && pp>0)// cancel password
        {
          pp--;
          eeprom_write(address,pp);
          lcd_chr(2,pp+1,' ');
        }
 else if(kp !=4 && kp!=255)
           {
              if(pp<15) // passaword length max. 15 can be change and one for store number of password
                   { 
                      pp++;
                      eeprom_Write(pp+address,number); //must be write pp for write address start from 1
                      lcd_chr(2,pp,'*');
                      eeprom_write(address,pp);
                    }
           }

}
متغير pp هو عداد للشفره كلما ادخلت رقم ازداد بواحد
في بدايه تخبرك هل تم ضغط على * وكان عداد اكبر من صفر اذا كان كذلك نقص هذا عداد بواحد ومسح رقم على شاشه عن طريق طباعه فراغ مكان رقم مراد مسحه
لاحظو كود وهو مسؤول عن مسح الارقام في حاله كتابه رقم خطأ او رقم زائد
كود:
if(kp is 4 && pp>0)// cancel password
        {
          pp--;
          eeprom_write(address,pp);
          lcd_chr(2,pp+1,' ');
        }
كما اخبرتكم تتفعل هذا شرط بالضغط على * وقد قمت بكتابه رقم واحد على اقل لان عداد pp يشترط بان يكون اكبر من 0
بعدها سيتم نقصان عداد
كود:
 pp--;
هنا لابد من خزن قيمه طول شفره بالعنوان الاول
كود:
eeprom_write(address,pp);
تلاحظون ان العنوان الخزن طول شفره اسمه address ياخذ ام 16 او 32 كما ذكر سابقا
اما امر مسح رقم
كود:
 lcd_chr(2,pp+1,' ');
تلاحظون انه كتبه في الامر شاشه pp+1 لماذا لانك انت تريد مسح رقم ولكن لوتلاحظ ببرنامج انه تم كتابه الامر نقصان عداد لابد ان اعيد عداد الى وضعه سابق
مثال كتبت كود وصلت الى 5 ارقام اكيد pp=5 وردت امسح رقم اخير راح اضغط على * وطالما pp>0 راح يتحقق شرط راح يتم نقصان عداد بواحد وراح يصبح 4 وراح يتم خزنها في ايبروم ولكن لما اصل لمرحله مسح على شاشه هنا pp=4 اكيد راح يمسح رقم 4 وهذا مو صحيح ايضا اعيد عداد الى وضعه عن طريق pp+1 وبالتالي راح يمسح رقم 5
وهكذا
=====================
اما اذا لم يتم ضغط على *
كود:
else if(kp !=4 && kp!=255)
           {
              if(pp<15) // passaword length max. 15 can be change and one for store number of password
                   { 
                      pp++;
                      eeprom_Write(pp+address,number); //must be write pp for write address start from 1
                      lcd_chr(2,pp,'*');
                      eeprom_write(address,pp);
                    }
           }
هنا تم تحديد طول شفره اقل من 15 لماذا لم اكتب pp<=15 لان عداد يبدا من صفر ويبدا زياده بمقدار 1
ويبدا بخزن number في عنوان address +pp
اما طول شفره سوف تخزن في address
مثلا ارد ان اكتب شفره 156 و address=16
بالبدايه pp=0 طالما هي اقل من 15 وضغطت على 1
راح يزداد عداد بواحد pp=1 وراح يخزن رقم 1 في عنوان address+pp=16+1=17
وبعدها راح يخزن pp=1 في عنوان 16
ويظهر على شاشه في العمود2 وفي صف pp راح يظهر علامه *

بعد ذلك تم ضغط على رقم 5
اصبح عداد 2 (pp=2) راح يخزن رقم 5 في عنوان 16+2=18
ويخزن طول شفره الان اصبحت 2 اي (pp=2) في عنوان 16
ويظهر رقم بشكل * في عمود 2 وفي سطر ثاني
وهكذا يتم خزن الارقام في ايبروم وكذلك خزن عدد الارقام شفره في عنوان address
وكذلك كيفيه اظهار علامه * في كل سطر كله هذا تعتمد على عداد pp
ملاحظه مهمه يجب عند استدعاء هذه داله جعل التاكد من pp=0 يمكنك وضع هذا الامر عند ضغط على enter لانها تعتبر نهايه كتابه شفره
واذا لم تكتب الامر pp=0 فانه راح يخزن شفره في مكان خطأ ولاتحصل ابد على شفره صحيحه


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 17-08-2013 الساعة 09:12 AM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 10:00 AM المشاركة 7   
افتراضي


ناتي الان لشرح داله ادخال شفره لاحظو كود طبعا يتحقق ذلك عند ضغط على # وهنا سوف يجعل متغير choice =255
كود:
void input_password_test()
{
 if(kp !=12 )// password before change
          {
           test_password(16);
          }
     //////////// test password input with original password//////////

 while(kp is 12  && eeprom_read(16)>0) // if switch(#) enter  is pressed
         {
             message( input_pass);
             for(x=0;x<=eeprom_read(16);x++)
                     {
                      if( (eeprom_read(x+16)is eeprom_read(x)) ) state_password=1;
                       else { state_password=0; break;}// password vaild and exit from for
                     }
             if(  state_password is 1)
                     {
                      lcd_cmd(1);
                      message(correct_pass);
                      delay_ms(1000);
                     }

            else if ( state_password is 0 )
               {
                state_password=255;// random value but not equal 0 or 1
                lcd_cmd(1);
                message(uncorrect_pass);
                delay_ms(1000);
                message( input_pass);
               }
            pp=0;
            kp=255; // exit from  while because now kp=12
          }
}
كود
كود:
if(kp !=12 )// password before change
          {
           test_password(16);
          }
هنا يختر طالما لم يتم ضقط على # راح يستدعي داله
كود:
test_password(16);
حيث تم تزويدها بالعنوان 16
حيث تم خزن طول شفره بالعنوان 16 ومن 17 الى 31 يتم خزن الارقام
عند ضغط على #
كود
كود:
while(kp is 12  && eeprom_read(16)>0) // if switch(#) enter  is pressed
         {
             message( input_pass);
             for(x=0;x<=eeprom_read(16);x++)
                     {
                      if( (eeprom_read(x+16)is eeprom_read(x)) ) state_password=1;
                       else { state_password=0; break;}// password vaild and exit from for
                     }
             if(  state_password is 1)
                     {
                      lcd_cmd(1);
                      message(correct_pass);
                      delay_ms(1000);
                     }

            else if ( state_password is 0 )
               {
                state_password=255;// random value but not equal 0 or 1
                lcd_cmd(1);
                message(uncorrect_pass);
                delay_ms(1000);
                message( input_pass);
               }
            pp=0;
            kp=255; // exit from  while because now kp=12
          }
سيدخل في لوب مستمر ولكنه فيه شروط ان تم فعلا خزن الارقام وتم ضغط على #
انظر كود
كود:
while(kp is 12  && eeprom_read(16)>0)
بعدها يتم مقارنه بين شفره الاصليه وشفره التي تم خزنها تلاحظ ان قائمه for اقصى قيمه لها لاختبار هو طول شفره حيث اذا تلاحظ انه اولا يتم اختبار طول شفره فشفره الاصليه طولها مخزون في عنوان 0 وشفره التي تم ادخالها طولها تم خزنها في عنوان 16
كما تلاحظون انه يتم اختبار رقم رقم واذا كان هناك رقم غير متساوي سوف يوقف مقارنه ويعتبر شفره خاطئه انظرو الى الكود
كود:
 for(x=0;x<=eeprom_read(16);x++)
                     {
                      if( (eeprom_read(x+16)is eeprom_read(x)) ) state_password=1;
                       else { state_password=0; break;}// password vaild and exit from for
                     }
اذا كانت شفره صحيحه راح يصبح متغير state_password=1 وعندها يكتب لك شفره صحيحه كود
كود:
if(  state_password is 1)
                     {
                      lcd_cmd(1);
                      message(correct_pass);
                      delay_ms(1000);
                     }
ام اذا كانت شفره خاطئه state_password=255 راح يكتب لك شفره خاطئه
كود:
message(uncorrect_pass);
وبعد ذلك يعيدك من بدايه وتظهر لك رساله
كود:
 message( input_pass);
تخبرك ادخل شفره من جديد ولكن كيف نبدأ من جديد
لاحظ تالي اولا كتبت كود
كود:
 pp=0;
            kp=255; // exit from  while because now kp=12
حتى اخرج من لوب وبالتالي راح يخرج من داله
كود:
void input_password_test()
لان مايكرو ينفذ الاوامر بتسلسل ولكن كيف يعيد نفسه
لنلقي نظره مره اخرى على داله function_password
لما يخرج من داله void input_password_test()
راح يرجع الى مكان الذي تم فيه استدعاء داله
اي راح يرجع الى هنا ( طبعا ضمن كود داله char function_password())
كود:
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;
            }

   }
وهنا لايزال هناك شرط متحقق وهو
كود:
if(choice !=0 )
ومن هنا سوف تعاد عمليه ادخال شفره من جديد
اما اذا كانت شفره صحيحه سوف يخرج من لوب عن طريق الامر
كود:
pp=0;
            kp=255; // exit from  while because now kp=12
ولما يخرج راح يعود الى نفس مكان ولكن هنا يوجد الامر تم تحقيق شرط فيه
انظر كود
كود:
if(state_password is 1)
              {
               lcd_cmd(1);
               return state_password;
              }
وهنا الامر return راح يرجعني الى داله الرئيسيه لان داله
كود:
char function_password()
تم استدعائها من قائمه الرئيسيه


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 17-08-2013, 11:20 AM المشاركة 8   
افتراضي


ناتي الان لشرح داله
كود:
void new_password_test()
كود هذه داله
كود:
void new_password_test()
{
 if(kp !=12 && password is 0)// password before change
          {
           test_password(16);
          }
     //////////// test password input with original password//////////

 while(kp is 12 && password is 0 && eeprom_read(16)>0) // if switch(#) enter  is pressed
    {
         for(x=0;x<=eeprom_read(16);x++)
             {
               if( (eeprom_read(x+16)is eeprom_read(x)) ) password=1;
               else { password=0; break;}// password vaild and exit from for
             }

         if( password is 0)// check master code
              {
               for(x=0;x<=eeprom_read(16);x++)
                   {
                     if( (eeprom_read(x+16)is eeprom_read(48+x)) ) master_code=1;
                     else { master_code=0; break;}// password vaild and exit from for
                    }

              }
         if ( password is 0&& master_code is 0 )
             {
              state_password=255;// random value but not equal 0 or 1
              lcd_cmd(1);
              message(uncorrect_pass);
              delay_ms(1000);
              lcd_cmd(1);
              message(old_password);
             }
       if( password is 1 ||  master_code is 1 )
           {
            check_password =0;
            lcd_cmd(1);
            message(new_pass);
            delay_ms(1000);
            master_code=2;//this using for exit form condition  if( (password is 1 ||  master_code is 1)&&  check_password is 0)
            password=2;// this using for exit form condition  if( (password is 1 ||  master_code is 1)&&  check_password is 0)
           }
       kp=255;// because now kp=12 and condition if( kp is 12 && password is 2) password=3; is active
       pp=0;
     }
 if(kp !=12 && kp !=255 && password is 2)
             {
               test_password(16);
             }
 if(kp is 12 && password is 2 )
            {
              lcd_cmd(1);
              message(check_pass); //check password message
              delay_ms(1000);
              check_password=1;
              kp=255;// because now kp=12 and condition if( kp is 12 && password is 2) password=3; is active
              pp=0;
            }
}
متى تعمل عندما يتم ضغط على * لاكثر من 5 ثواي ويتم ضغط بعدها على # كما تم شرحها سابقا
الان الكود
كود:
if(kp !=12 && password is 0)// password before change
          {
           test_password(16);
          }
تم شرحها سابقا في داله ادخال شفره
كود
كود:
while(kp is 12 && password is 0 && eeprom_read(16)>0)
وعند ضغط على # وهناك فعلا تم ادخال شفره وهناك امر مهم وهو password=0
فائده هو عند نجاح عمليه دخول شفره راح يطلب مني ادخال شفره جديده وبعدما ادخلت شفره جديده راح يطلب مني التاكيد اذا اخطات في ادخال شفره التاكيد بدون الامر password=0 راح يرجعني من بدايه
عند ادخال شفره اذا كانت صحيحه نستطيع قول password=0 مهمته هو منع تنفيذ الاوامر من جديد كما نستطيع قول
ان تغير شفره فيها ثلاث مراحل
1- ادخال شفره قديمه اذا كانت صحيحه نتقل الى فقره 2 (password=0)
2- ادخال شفره جديده وهنا لاتحتاج لمقارنه وهنا password=1 اذا كانت شفره صحيحه بعدها ادخل شفره جديده ليصبح password=2 لكي اخرج من لوب ومن داله
هذه فقرتين مهمه داله
كود:
void new_password_test()
3- ادخال شفره التاكيد ومقارنتها مع شفره جديده اذا كانت صحيحه يتم تغير شفره
هذه مهمه داله
كود:
void change_password_test()
ام لا سوف نعود من جديد ولكن الى فقره 2 ولانعود الى فقره 1
في البرمجه ماهو الامر الذي يسمح لنا بتنفيذ فقرات 3 هو متغير password
======================================
كود
كود:
 for(x=0;x<=eeprom_read(16);x++)
             {
               if( (eeprom_read(x+16)is eeprom_read(x)) ) password=1;
               else { password=0; break;}// password vaild and exit from for
             }
وهو يخص مقارنه بين ماتم ادخاله من شفره ومع شفره الاصليه كما تم شرحه سابقا وهنا ام password=1 وشفره صحيحه واما password=0 وشفره خاطئه
======================================
كود:
 if( password is 0)// check master code
              {
               for(x=0;x<=eeprom_read(16);x++)
                   {
                     if( (eeprom_read(x+16)is eeprom_read(48+x)) ) master_code=1;
                     else { master_code=0; break;}// password vaild and exit from for
                    }

              }
هنا اذا كانت شفره خاطئه او انه تم ادخال ماستركي master key هنا سيتم ادخال رقم باسورد راح يتم مقارنته مع ماستر كي فاذا كانت مقارنه صحيحه
master_code=1 ام اذا كانت خاطئه master_code=0
كما تلاحظون انه هناك مقارنتين للكود الاول مع كود الاصلي او قديم
اذا فشلت مقارنه وكان شفره خاطئه يذهب للتحقق مره اخرى ولكن مقارنه مع ماستركي
===============================================

اذا كانت مقارنه كلها اعطت نتيجه شفره خاطئه يتم تنفيذ كود التالي
كود:
 if ( password is 0&& master_code is 0 )
             {
              state_password=255;// random value but not equal 0 or 1
              lcd_cmd(1);
              message(uncorrect_pass);
              delay_ms(1000);
              lcd_cmd(1);
              message(old_password);
             }
=================================================
اما هذا كود ادناه يتنفذ بتحقيق اما انك ادخلت شفره وكانت صحيحه password=1
او انك ادخلت شفره ماستركي وكانت صحيحه master_code=1 وهنا تلاحظون جعلت password=2 وبالتالي تجاوزنا مرحله مقارنه مع شفره الاصليه او مع ماستركي وهنا سيتم تنفيذه الاوامر ادخال شفره جديده
كود
كود:
if( password is 1 ||  master_code is 1 )
           {
            check_password =0;
            lcd_cmd(1);
            message(new_pass);
            delay_ms(1000);
            master_code=2;//this using for exit form condition  if( (password is 1 ||  master_code is 1)&&  check_password is 0)
            password=2;// this using for exit form condition  if( (password is 1 ||  master_code is 1)&&  check_password is 0)
           }
======================================
وهنا بعد ظهور رساله new password سيطلب منك ادخال شفره جديده
كود
كود:
if(kp !=12 && kp !=255 && password is 2)
             {
               test_password(16);
             }
نفس ماتم شرحه سابقا
وعند ضغط على # وهذا الامر يتنفذ فقط بعد تحقيق شروط سابقه وهنا وضعنا password=2 ليخبره انه تم تجاوز او سماح بتغير شفره سيظهر على شاشه check password كما اصبح check_password=1 وهذا متغير راح يسمح لي دخول الى داله فقط
كود:
void change_password_test()
كود
كود:
if(kp is 12 && password is 2 )
            {
              lcd_cmd(1);
              message(check_pass); //check password message
              delay_ms(1000);
              check_password=1;
              kp=255;// because now kp=12 and condition if( kp is 12 && password is 2)
              pp=0;
            }
وانتم تعرفون انه من ينهي مايكرو من داله فرعيه يعود من مكان الذي تم استدعائه فيها لاحظو كود موجود ضمن داله function_password
كود:
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;
            }

   }


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 17-08-2013 الساعة 11:28 AM
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 10:33 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025