اطلاعیه

Collapse
No announcement yet.

تبدیل اعداد جدا به صورت رمز به زبان c

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

    تبدیل اعداد جدا به صورت رمز به زبان c

    سلام
    یک پروژه dtmf دارم درست میکنم تا به حال موفق شدم که میکرو تشخیص میده که چه عددی گرفته شده
    اما نمی تونم این اعداد رو به صورت یک رمز در بیازم
    اگه میشه راهنماییم کنید
    --------------متن زیر بعد از به جواب رسیدن مشکل بالا ویرایش شده ---------------------------------------------------
    اون مشکل بالا بعد از 8 ساعت کار تونستم حل کنم
    همین طور که دوست عزیزم در پایین گفتن (ShahiMV) باید از رشته استفاده می کردم اما یک مشکلی هست اونم تو مقدار دادن رشته ها به خاطر dtmf که استفاده میکنیم
    اما به جاش باید از کدهای زیر استفاده کنم
    new=bcd_h[bcd];

    itoa(new,input);
    strcat(input2,input);
    new=atoi(input2);

    #2
    پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

    نوشته اصلی توسط ramin20007
    سلام
    یک پروژه dtmf دارم درست میکنم تا به حال موفق شدم که میکرو تشخیص میده که چه عددی گرفته شده
    اما نمی تونم این اعداد رو به صورت یک رمز در بیازم
    اگه میشه راهنماییم کنید
    منظورتون از "بصورت رمز در بیارم" چیه؟

    دیدگاه


      #3
      پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

      خوب اینطوری میگم
      وقتی با تلفن زنگ میزنین و به avr متصل میشین برای فعال کردن رله ها باید یک رمز 4 رقمی بدین حالا من میتونم رقم ها رو شناسایی کنم اما نمیتونم 4 عدد متفاوت رو به صورت یک رمز در بیارم مثلا همه عدد هارو رو بریزم تو رشته بعد فراخوانیشون کنم
      امیدوارم منظورم رسونده باشم انشام همیشه بد بوده :angry: :angry:

      دیدگاه


        #4
        پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

        سلام دوست عزیز میتونی به شکل زیر کار کنی
        متغییری با نام int num تعریف کن تا عدد کد وارد شده را در آن بریزی و ابتدا آن را مساوی صفر قرار بده
        شماره ی اول را ازdtmf بگیر و این شماره را ضرب در ۱۰۰۰ کن و با آن چه در متغیر num است جمع کن و دوباره در num بریز یعنی به شکل زیر
        num+=dtmf*1000
        این بار عدد دوم را بگیر و ضرب در ۱۰۰ کن و در num بریز
        num+= dtmf*100
        عدد سوم را بگیر و ضرب در ۱۰ کن و در num بریز
        num+= dtmf*10
        و بالاخره عدد چهارم را بگیر و ضرب در ۱ کن و در num بریز
        num+= dtmf*1
        حالا میتوانی این عدد را با کد مورد نظرت مقایسه کنی و غیره

        دیدگاه


          #5
          پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

          ولی این کار زیاد قشنگ نیست و میتونی به روش زیر عمل کنی
          متغییر char num[3] را تعریف کن یعنی متغییر رشته ای با چهار درایه
          هر عدد dtmf را که میگیری در یکی از این درایه ها میریزی به هر روش که دوست داری که من با حلقه رو ترجیح میدم
          حالا یک رشته ی با چهار عدد داری
          و با دستور atoi اون را به عدد صحیح تبدیل کنی
          #include<stdlib.h>
          int num2
          char num1[3 = "1234"]

          num2 atoi (num1)

          فقط ببخشید به خاطر فونت بدش
          پیروز و سر بلند باشی

          دیدگاه


            #6
            پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

            اگر از روش اول استفاده کنی به قول بچه ای کامپیوتر میشی تایپیست
            ولی اگر از روش دوم استفاده کنی میشی یک برنامه نویس ماهر و کسی ازت خورده نمیگیره

            دیدگاه


              #7
              پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

              مرسی دوست عزیز از راهنماییتون
              من یک کد دارم که برای صفحه کلیده و فراخوانیش خیلی خوبه چون کافی به هش مقدار بدم و بگم چند رقم زمز بگیره یا رمزو نمایش بده یا نه و ... اما حر کاری میکنم برای این کار جواب نمیده یعنی زمانی که رمز رو مثلا 5 رقم تعیین میکنم زمانی که عددو میگیره تمام 5 رقم همون عدد جایگزین میشه حالا من هم کد اصلی و کدی دستکاری شده خدم میزارم
              مرسی[
              کد:
              signed char get_key(unsigned char wait){
                unsigned char r=0,c=0,k=0;
                unsigned int i=0,l=0;
                DDRB=0X0F;
                PORTB=0XFF; 
                l=(wait*1000)+1000;
                
                 for (i=0; i<l; i++){
                  if(wait==0) i=0; // infinite Loop !
                   
                  for (r=0; r<4; r++){
                   c=4;
                   PORTB=scan[r];
                   delay_us(3);
                   if(c1==0) c=0;
                   else if(c2==0) c=1;
                    else if(c3==0) c=2;
                    else if(c4==0) c=3;
                     
                   if (c!=4){
                    k=arrkey[(r*4)+c];
                    while(c1==0 || c2==0 || c3==0 || c4==0);
                    delay_ms(1);
                    return k;
                   }
                  }
                  delay_ms(1);
                 } 
                
               // return -1; //time out "Not press any key" 
               }
               
               
               //MAX 9 Digit
               float keypad(unsigned char wait,unsigned char digit,unsigned char show,unsigned char x,unsigned char y){ 
                float number_out=0;
                signed char in_key=0;
                char i=0,d=0,temp[1];
                 signed long int zarib[9]={
                 1,
                 10,
                 100,
                 1000,
                 10000,
                 100000,
                 1000000,
                 10000000,
                 100000000,
                };
              
                 
                if(show){
                  lcd_gotoxy(x,y);
                  _lcd_write_data(0X0F);
                }
                
                
                i=0;
                for (d=0; d<digit; d++){ // Max 9 digit 
                  in_key = get_key(wait);
                  
                  if(!(in_key==10 || in_key==11)){ 
                  input[d]=in_key;
                    if(show){
                     sprintf(temp,"%d",input[d]);
                     lcd_puts(temp);
                    }
                  } 
                 i++;  
                }
                
                // Calculate and unit arry
                d=digit; digit --;
                for (i=0; i<d; i++){
                  number_out += zarib[digit]*input[i];
                  digit --;
                }
                
                delay_ms(1);
                return number_out; 
               }
              و کد خودم
              کد:
               signed char get_key(unsigned char wait){
                unsigned char r=0,k=0;
                unsigned int i=0,l=0;
              
                l=(wait*1000)+1000;
                
              
                    k=num;
                    delay_ms(1);
                    return k; 
                   
                   }
                  
                 
                
               
               
               
               //MAX 9 Digit
               float keypad(unsigned char wait,unsigned char digit,unsigned char show,unsigned char x,unsigned char y){ 
                float number_out=0;
                signed char in_key=0;
                char i=0,d=0,temp[1];
                 signed long int zarib[9]={
                 1,
                 10,
                 100,
                 1000,
                 10000,
                 100000,
                 1000000,
                 10000000,
                 100000000,
                };
                
                 
                if(show){
                while(PINA.0==0); 
                delay_ms(20);
                  lcd_gotoxy(x,y);
                  _lcd_write_data(0X0F);
                }
                 
                
                i=0;
                for (d=0; d<digit; d++){ // Max 9 digit 
                  in_key = get_key(wait);
                  
                  if(!(in_key==10 || in_key==11)){ 
                  input[d]=in_key;
                    if(show){
                     sprintf(temp,"%d",input[d]);
                     lcd_puts(temp);
                    }
                  } 
                  
                }
                
                // Calculate and unit arry
                d=digit; digit --;
                for (i=0; i<d; i++){
                  number_out += zarib[digit]*input[i];
                  digit --;
                }
                
                delay_ms(1);
                return number_out; 
               }

              دیدگاه


                #8
                پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

                منظورتون اینه که اولین عدد رو که میزنید مثلا ۹ همه ی عددهاتون پشت سر هم همش ۹ میشه دزسته
                برای رفع این مشکل بهتره یک برنامه ی جدا گونه بسازی که فقط کیبرد باشه و میکرو
                بعد برنامه رو اجرا کنی
                البته ناگفته نماند که اول هاش که داشتم با کیپد کار میکردم به مشکل شما هم برخوردم
                مشکل من این بود که حلقه تند تند کیپد رو چک میکرد در حد میلی ثانیه ای
                و قبل از اینکه حتی وقت کنی دستت رو برداری دوباره چک میکرد و عدد قبلی رو نمایش رو میداد
                شاید مشکل شما هم همین باشه اگر این باشه میتونید یک وقفه ی یک میلی ثانیه بگذاری تا مشکلت حل بشه

                دیدگاه


                  #9
                  پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

                  حالا میتونید این کدتون را صحیح کنید یا
                  از کتابخونه هایی که وجود داره استفاده کنید

                  دیدگاه


                    #10
                    پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

                    نه تو کیپد درست کار میکنه (ماه)
                    دستکاریش کردم برای dtmf
                    که تند تن اعدادو چک میکنه و مثلا 5 که میزنی همه رقمها میشه 5

                    دیدگاه


                      #11
                      پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

                      اگر بیشتر توضیح بدی بهتره
                      هنوز نفهمیدم کجا مشکل داری
                      اگر کیپد جایی دیگه درست کار میکنه که مشکلی نداری
                      منظور از برای dtmf چیه یعنی این دستگاهت dtmf تولید میکنه
                      و از این قبیل سوالات توضیح بدید ممنون میشم

                      دیدگاه


                        #12
                        پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

                        1. کد اصلی که بالا گذاشتم برای کی پد هست که درست کار میکنه
                        2. اما از آنجایی که خیلی کد باحالیه خواستم تغییرش بدم که بجای این که بیاد اعداد رو از صفحه کلید بخونه بیاد و از dtmf بخونه
                        3. کد صفحه کلید به این شکله که فقط کافی فراخوانیش کنی keypad(10,5,1,5,1); که عدد اول مربوط به مدت زمان عدد دوم مربوط به اینکه چند عدد میخواهی بگیری عدد سوم دو حالت داره 1-0 که با اون میتونی بگی رمز وارد شده نمایش داده بشه یا نه و دو عدد آخر هم مکان نمایش بر روی lcd مشخص میکنه
                        حالا به خاطر این مزیتش کد تغییر دادم که این کار منجر میشه به اینکه هر عددی که در dtmf وارد میشه به جای تمام اعداد قرار میگیره مثلا عدد 6 فشرده شده البته در dtmf و مثلا عدد 5 را در تابع فراخوانی کردم چیزی که به من نمایش میده و مدام عدد رو میخونه اینه 66666
                        این روند مدام ادامه داره چون اگر بیام و دوباره یک عدد دیگه بزنم همش با هم تغییر میکنه
                        اینم کل برنامم
                        کد:
                        #include <mega16.h>
                        #include <delay.h>
                        #include <stdio.h>
                        
                        #include <lcd.h>
                        #asm
                        .equ __lcd_port=0x15
                        #endasm
                          
                        unsigned char num,new,c,s;
                        float outic;
                        //char s[16];
                        signed char get_key(unsigned char wait) ;
                        float keypad(unsigned char wait,unsigned char digit,unsigned char show,unsigned char x,unsigned char y);
                        
                         char input[9];
                        
                        
                        //--------------------------------------------------
                        interrupt [EXT_INT0] void ext_int0_isr(void){
                        
                        
                        outic=PINB;
                        c=0;
                        
                           if (outic==0x01)  num=1;
                        //else if (outic==0x00)  num=;
                        else if (outic==0x02)  num=2; 
                        else if (outic==0x03)  num=3; 
                        else if (outic==0x04)  num=4; 
                        else if (outic==0x05)  num=5; 
                        else if (outic==0x06)  num=6; 
                        else if (outic==0x07)  num=7; 
                        else if (outic==0x08)  num=8; 
                        else if (outic==0x09)  num=9; 
                        else if (outic==0x0A)  num=0; 
                        else if (outic==0x0B)  num=10; 
                        else if (outic==0x0C)  num=12;
                        s=1;
                        
                        
                        
                        
                        } 
                        //----------------------------------------------
                        
                        void main(){
                        
                        
                        
                        PORTB=0x00;
                        DDRB=0x00;
                        PORTA=0x00;
                        DDRA=0x00;
                        
                        
                        GICR|=0x40;
                        GIFR=0x40;
                        MCUCR=0x03;
                        //MCUCSR=0x00;
                        lcd_init(16);
                        #asm("sei");
                        
                        
                        
                        while (1){
                        
                        //lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_puts("2.ENTER PASSWORD");
                        new = keypad(10,5,1,5,1);
                        //sprintf(s,"num =%3d",num);
                        //lcd_puts(s);
                        //delay_ms(40);
                         }
                        
                         }
                        
                        //-----------------------------------
                          signed char get_key(unsigned char wait){
                          unsigned char r=0,k=0;
                          unsigned int i=0,l=0;
                        
                          l=(wait*1000)+1000;
                          
                           for (i=0; i<l; i++){
                            if(wait==0) i=0; // infinite Loop !
                             
                            for (r=0; r<1; r++){
                             
                             
                            
                             if(c==0) c=1;
                             
                               
                             if (c!=4){
                              while(PINA.0==1); 
                              k=num;
                              delay_ms(1);
                              return k; 
                              c=4;
                             }
                            }
                            delay_ms(1);
                           } 
                          
                         // return -1; //time out "Not press any key" 
                         }
                         
                         
                         //MAX 9 Digit
                         float keypad(unsigned char wait,unsigned char digit,unsigned char show,unsigned char x,unsigned char y){ 
                          float number_out=0;
                          signed char in_key=0;
                          char i=0,d=0,temp[1];
                           signed long int zarib[9]={
                           1,
                           10,
                           100,
                           1000,
                           10000,
                           100000,
                           1000000,
                           10000000,
                           100000000,
                          };
                          
                           
                          if(show){
                          while(PINA.0==0); 
                          delay_ms(20);
                            lcd_gotoxy(x,y);
                            _lcd_write_data(0X0F);
                          }
                           
                          
                          i=0;
                          for (d=0; d<digit; d++){ // Max 9 digit 
                            in_key = get_key(wait);
                            if(s==1){
                            
                            
                            if(!(in_key==10 || in_key==11)){ 
                            input[d]=in_key;
                              if(show){
                               sprintf(temp,"%d",input[d]);
                               lcd_puts(temp);
                              } }
                            }   
                            
                          }
                          
                          // Calculate and unit arry
                          d=digit; digit --;
                          for (i=0; i<d; i++){
                          if(s==1){
                          s=0;
                            number_out += zarib[digit]*input[i];
                            digit --;
                          }
                          
                          delay_ms(1);
                          return number_out; 
                         }}

                        دیدگاه


                          #13
                          پاسخ : تبدیل اعداد جدا به صورت رمز به زبان c

                          حللللللللللللللللللللللل شد مرسی ShahiMV

                          راه حلشم استفاده از تابع های itoa و strcat و بعدش از این تابع atoi است که در درخواست کمک اولیه ویرایش کردم و کامل نوشتم
                          مرسییییییییییییییییی :wow: :wow: :wow: :wow:

                          دیدگاه

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