اطلاعیه

Collapse
No announcement yet.

راهنمایی در تصحیح کد قفل رمز دیجیتال

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    راهنمایی در تصحیح کد قفل رمز دیجیتال

    سلام
    یه برنامه برای میکرو اتمگا 16 نوشته شده که قفل رمز هست یه مشکل داره اونم اینه که رمزش رو که میخوام تغییر بدم و عدد رو وارد میکنم و دکمه # رو میزنم در متغییر pass ذخیره نمیشه و همش طبق رمز قبلی کار میکنه. لطفا راهنمایی کنید ببینید مشکلش کجاست تو برنامه
    کد:
    [CPP]
    /*******************************************************
    Project : lock 2 
    Date    : 09/30/2017
    Chip type              : ATmega16
    AVR Core Clock frequency: 1.000000 MHz
    
    
    *******************************************************/
    
    
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL]  <mega16.h>
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL]  <delay.h>
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL]  <stdlib.h>
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL]  <string.h>
    
    
    // Alphanumeric LCD functions
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL]  <alcd.h>
    
    
    
    
    
    
    unsigned char  data,co1[20],co2[20];
    eeprom long int pass=120;
    long int a;
    
    
    
    
    flash unsigned char c0[]="0";
    flash unsigned char c1[]="1";
    flash unsigned char c2[]="2";
    flash unsigned char c3[]="3";
    flash unsigned char c4[]="4";
    flash unsigned char c5[]="5";
    flash unsigned char c6[]="6";
    flash unsigned char c7[]="7";
    flash unsigned char c8[]="8";
    flash unsigned char c9[]="9";
    
    
    
    
    void coding(unsigned char data){
    switch (data)
    {
    case 1:
    *strcatf(co1,c1); 
    break;
    //******************
    case 2:
    *strcatf(co1,c2); 
    break;
    //******************
    case 3:
    *strcatf(co1,c3); 
    break;
    //******************
    case 4:
    *strcatf(co1,c4); 
    break;
    //******************
    case 5:
    *strcatf(co1,c5); 
    break;
    //******************
    case 6:
    *strcatf(co1,c6); 
    break;
    //******************
    case 7:
    *strcatf(co1,c7); 
    break;
    //******************
    case 8:
    *strcatf(co1,c8); 
    break;
    //******************
    case 9:
    *strcatf(co1,c9); 
    break;
    //******************
    case 10:
    *strcatf(co1,c0); 
    break;
    
    
    //******************
    }
    }
    void ref_key(void){
    DDRC=0x0f;
    //******************************
    PORTC=0xff;
    PORTC.0=0;
    delay_ms(15);
    if(PINC.4==0)data=1;
    if(PINC.5==0)data=2;
    if(PINC.6==0)data=3;
    
    
    //*******************************
    PORTC=0xff;
    PORTC.1=0;
    delay_ms(15);
    if(PINC.4==0)data=4;
    if(PINC.5==0)data=5;
    if(PINC.6==0)data=6;
    
    
    //****************************
    PORTC=0xff;
    PORTC.2=0; 
    delay_ms(15);
    if(PINC.4==0)data=7;
    if(PINC.5==0)data=8;
    if(PINC.6==0)data=9;
    
    
    //****************************
    PORTC=0xff;
    PORTC.3=0;
    delay_ms(15);
    if(PINC.4==0)data=20;
    if(PINC.5==0)data=10;
    if(PINC.6==0)data=21;
    
    
    //****************************
    }
    void chek_pass(void)
    {
    ref_key();
    if(a==pass)
    {
    
    
    if(data==20){
    lcd_clear();
    PORTD.0=1;
    lcd_gotoxy(0,0);
    lcd_putsf("pass correct");
    
    
    
    
    }
    }
    else if(a!=pass)
    {
    if(data==20)
    {
    lcd_clear();
    PORTD.0=0;
    lcd_gotoxy(0,0);
    lcd_putsf("pass invalid");
    }
    }
    }
    
    
    
    
    void change_pass(void)
    {
     
    if(data==21 && a==pass )
    {
    strcpy(co1,co2);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("pass new:");
    
    
    
    
    if(data==20)
    {
    
    
    ref_key(); 
    coding(data);
    pass=atol(co1);
    
    
    chek_pass();
    
    
    }
    
    
    }
     }
    
    
    
    
    void main(void)
    {
    eeprom;
    ref_key(); 
    DDRD.0=1;
    DDRC=0x0f;
    lcd_init(16);
    lcd_clear();
    
    
    lcd_gotoxy(0,0);
    lcd_putsf("please pass :");
    
    
    
    
    
    
    while(1){
    
    
    chek_pass();
    change_pass();
    
    
    coding(data);
    a=atol(co1);
    lcd_gotoxy(0,1);
    lcd_puts(co1);
    data=0;
    delay_ms(200);
    
    
    
    
    
    
    }
    
    
     }[/CPP]
    جدیدترین ویرایش توسط اشکان غفارزاده; ۰۱:۴۱ ۱۳۹۶/۰۷/۱۳.

    #2
    پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

    با سلام
    بنظرم متغیر a و pass از نوع unsigned char بذارید تا حافظه کمتری اشغال کنه. بجای تبدیلات هم از تابع sprintf استفاده کنید. درضمن برای بالا رفتن عمر eeprom ، در لحظه شروع برنامه ، ابتدا متغییر pass را داخل رم بریزید تا در صورت چندین بار خواندن این متغییر، هربار به eeprom مراجعه نشود (چون این حافظه عمر خیلی کمتری نسبت به رم دارد با توجه به دیتا شیت)
    یک توضیح کلی درمورد خطوط برنامه بدید چون جلوی خطوط توضیح نداره

    Sent from my HUAWEI P7-L10 using Tapatalk
    انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

    دیدگاه


      #3
      پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

      نوشته اصلی توسط hamedtaran نمایش پست ها
      با سلامبنظرم متغیر a و pass از نوع unsigned char بذارید تا حافظه کمتری اشغال کنه. بجای تبدیلات هم از تابع sprintf استفاده کنید. درضمن برای بالا رفتن عمر eeprom ، در لحظه شروع برنامه ، ابتدا متغییر pass را داخل رم بریزید تا در صورت چندین بار خواندن این متغییر، هربار به eeprom مراجعه نشود (چون این حافظه عمر خیلی کمتری نسبت به رم دارد با توجه به دیتا شیت)یک توضیح کلی درمورد خطوط برنامه بدید چون جلوی خطوط توضیح ندارهSent from my HUAWEI P7-L10 using Tapatalk
      چیزی نداره یه وارد کردن رمز ساده هست تو ایپرام و تغییر رمز ... رمزش رو که میخوام تغییر بدم و عدد رو وارد میکنم و دکمه # رو میزنم در متغییر pass ذخیره نمیشه و همش طبق رمز قبلی کار میکنه. الان باید رمزش 120 باشه و در eeprom میکرو ذخیره بشه اما ذخیره نمیشه

      دیدگاه


        #4
        پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

        قسمتی که در eeprom ذخیره میکنه دقیقا کجای کد هستش؟

        Sent from my HUAWEI P7-L10 using Tapatalk
        انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

        دیدگاه


          #5
          پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

          نوشته اصلی توسط hamedtaran نمایش پست ها
          قسمتی که در eeprom ذخیره میکنه دقیقا کجای کد هستش؟
          unsigned char data,co1[20],co2[20];eeprom long int pass=120;long int a;
          void change_pass(void){ if(data==21 && a==pass ){strcpy(co1,co2);lcd_clear();lcd_gotoxy(0,0);lcd_ putsf("pass new:");if(data==20){ref_key(); coding(data);pass=atol(co1);chek_pass();}

          دیدگاه


            #6
            پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

            خب اینجا که شما دقیقا عدد 120 را در eeprom میریزید، خب اینجوری با هر بار اجرای تابع تغییر رمز، دوباره عدد 120 ذخیره میشه

            Sent from my HUAWEI P7-L10 using Tapatalk
            انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

            دیدگاه


              #7
              پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

              نوشته اصلی توسط hamedtaran نمایش پست ها
              خب اینجا که شما دقیقا عدد 120 را در eeprom میریزید، خب اینجوری با هر بار اجرای تابع تغییر رمز، دوباره عدد 120 ذخیره میشه

              Sent from my HUAWEI P7-L10 using Tapatalk
              اخه همین هم ذخیره نمیشه

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              مهندس یه کد ساده میتونید برای ذخیره بدین بهم که تو ایپرام بشه ذخیره کرد

              دیدگاه


                #8
                پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                چون ابتدای برنامه متغیر pass از نوع eeprom تعریف شده، در بقیه خطوط برنامه نیازی به استفاده از کلمه eeprom نیست

                Sent from my HUAWEI P7-L10 using Tapatalk
                انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                دیدگاه


                  #9
                  پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                  در خطوط اول برنامه ، فقط متغیر pass را تعریف کنید، مقدار دهی نکنید،
                  در برنامه شما، در هربار اجرا، فقط عدد 120 در pass ذخیره میشه، پس شما هرچقدر هم عدد را عوض کنید، دوباره در شروع برنامه 120 ذخیره میشه!

                  Sent from my HUAWEI P7-L10 using Tapatalk
                  انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                  دیدگاه


                    #10
                    پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                    چون یک بار این عدد که پیشفرض دستگاه شماست در eeprom ذخیره شده، میتونید این متغییر را بدون مقداردهی تعریف کنید و در موقع پروگرم کردن دوباره میکرو، حافظه eeprom را بدون دستکاری بذاذید و پروگرم کنید و تمام

                    Sent from my HUAWEI P7-L10 using Tapatalk
                    انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                    دیدگاه


                      #11
                      پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                      نوشته اصلی توسط سمیراا نمایش پست ها
                      اخه همین هم ذخیره نمیشه

                      دلیل: ادغام دو پست برای جلوگیری از اسپم

                      مهندس یه کد ساده میتونید برای ذخیره بدین بهم که تو ایپرام بشه ذخیره کرد
                      کد خاصی نداره!
                      چون متغییر pass در ابتدای برنامه بعنوان eeprom تعریف شده، در جاهای دیگر برنامه فقط کافیه مقدار جدید بدید بهش، همین
                      pass=new

                      Sent from my HUAWEI P7-L10 using Tapatalk
                      انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                      دیدگاه


                        #12
                        پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                        شما فقط کاری که میکنید اینه:
                        عدد رمز جدید که کاربر وارد کرده را در تابع change pass در pass بریزید. البته درصورتی که pass در ابتدای برنامه مقدار دهی نکرده باشید
                        موفق باشید

                        Sent from my HUAWEI P7-L10 using Tapatalk
                        انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                        دیدگاه


                          #13
                          پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                          ضمناً برای راحتی کار، یک تابع با مقدار برگشتی برای صفحه کلید بسازید تا مثلا کل عدد 321 را برگشت دهد، نه تک تک کلید هارا
                          اینجوری کدتون خواناتر میشه و همه میتونن بخونن و حرفه ای تر میشه
                          البته این کار سلیقه ای هستش

                          Sent from my HUAWEI P7-L10 using Tapatalk
                          انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                          دیدگاه


                            #14
                            پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                            الان 120 رو که میزنم و دکمه * باید پسورد صحیح باشه اما وقتی * رو میزنم و چک میکنه پسورد اشتباهه
                            من 120 رو در برنامه در eeprom ذخیره کردم
                            اما نمیدونم چرا متغییر pass رو نمیخونه

                            در هر صورت از نو مینویسم طبق فرمایش شما و تست میزنم ..ممنون مهندس و خبر میدم

                            دیدگاه


                              #15
                              پاسخ : راهنمایی در تصحیح کد قفل رمز دیجیتال

                              نوشته اصلی توسط سمیراا نمایش پست ها
                              الان 120 رو که میزنم و دکمه * باید پسورد صحیح باشه اما وقتی * رو میزنم و چک میکنه پسورد اشتباهه
                              من 120 رو در برنامه در eeprom ذخیره کردم
                              اما نمیدونم چرا متغییر pass رو نمیخونه

                              در هر صورت از نو مینویسم طبق فرمایش شما و تست میزنم ..ممنون مهندس و خبر میدم
                              خواهش میکنم
                              موفق باشید

                              Sent from my HUAWEI P7-L10 using Tapatalk
                              انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                              دیدگاه

                              لطفا صبر کنید...
                              X