اطلاعیه

Collapse
No announcement yet.

راهنمایی برای حل مشکل این برنامه

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

    #16
    پاسخ : راهنمایی برای حل مشکل این برنامه

    نوشته اصلی توسط ajapyy
    من این فایلو دانلود کردم و دیدمش.
    اول از همه اینکه چرا اینقدر به هم ریخته و بدون کامنت نوشتید ؟ بعضی جاها هم یک خط فاصله بزارید تا کدتون خواناتر شه.
    دوم اینکه تو فایل اصلی یعنی calculator.c شما قبل از اینکه mega16.h رو فراخونی کنی اومدی از تعاریف اون مثل PINC استفاده کردی البته ممکنه اینجا و با define مشکل پیش نیاد، اما سعی کنید همه چی رو سر جای خودش استفاده کنید. همیشه اول کتابخانه ها رو اضافه کنید.
    سوم اینکه شما تو فایل keypad.c، وقتی که کتابخانه های mega16.h، delay.h و ... مثل LCD رو فراخونی نکردی چطور میخوای از دستوراتش استفاده کنی ؟ خب بنده خدا کدویژن حق داره ارور بده که دستورات تعریف نشدن !!! undefined symbol
    بعدشم شما یه سری تابع مثل log_10 و sin_DRG و ... استفاده کردی اما تعریفشون نکردی !!!
    ممنونم از کمکتون
    راستش این مدار رو من سال 89 از همین کتاب ساختم و اون موقع جواب داد بعد از اون اصلا از زبان C استفاده نکردم و این فایل هام گوشه هاردم مونده بود
    تو پست سوم برنامه درست رو دوستان گذاشتند ولی اون هم مشکل داشت

    دیدگاه


      #17
      پاسخ : راهنمایی برای حل مشکل این برنامه

      نوشته اصلی توسط حمید زارع
      دوست عزیز مشکل حل شد.
      مشکل اینجا بود که توی اون هدر فایلها هم باید
      کد:
      #include <mega16.h>
      رو اضافه میکردی تا پورت های ورودی خروجیت رو بشناسه.
      در کل چون داخل فایل های calculator.c از توابع keypad.h استفاده کرده بودی و داخل فایل keypad هم از توایع calculator.c استفاده کرده بود،توابع همدیگه رو نمیشناختن پس سه راه وجود داشت اینکه دو تا هدر فایل میساختی و توی هر کدوم اون یکی رو اینکلود میکردی که این کار درستی نبود و راه دوم اینکه همشو باهم ادغام میکردیم تو یه هدر فایل. که منم همشو ریختم داخل هدر فایل keypad.h و بقیه ماجرا...
      البته یه مشکلی که کد داشت دیفاین های مربوط به SIN و COS و... بود که دوبار دیفاین شده بودن.هم توی calculator.c و هم توی keypad که با ادغام کردنش دوتاش رفع شد.
      راه سوم هم اینکه یه هدر فایل واسط ایجاد میکردی و توابع مشترکو میریختی توش و از یکی میگرفت و به دیگری پاس میداد.
      سوالی بود درخدمتیم.
      اینم کد:
      فایل keypad.h
      کد:
      #include <mega16.h> 
      #include <delay.h>
      #include <stdlib.h> 
      #include <stdio.h> 
      #include <math.h>
      #include <string.h>
      
      #asm
        .equ __lcd_port=0x1B ;//PORTA
      #endasm
      #include <lcd.h> 
      
      //******************************************
      unsigned char keypad();
      //************************************
      void setting();
      //************************************
      void display();
      void config_number(float f_number);
      void sin_DRG();
      void arcsin_DRG();
      void cos_DRG();
      void arccos_DRG();
      void tan_DRG();
      void arctan_DRG();
      void log_10();
      signed char test_key (char key);
      void ack_opretion(char opretion);
      void calculator();
      //////////////////////////////////////////// ///////////////
      
      #define  pp  3.1415927  
      #define SIN  PINC.0 
      #define COS  PINC.1 
      #define TAN  PINC.2 
      #define LOG  PINC.3 
      #define SHIFT PINC.4 
      
      #define c1 PIND.4
      #define c2 PIND.5
      #define c3 PIND.6
      #define c4 PIND.7 
      
      
       
      float number1 =0; 
      float number2 =0;
      float result=0.0;  
      static char last_key;
      unsigned char mmz=0,count=0,num_dis=0;  //hasl momayez ra taeein mikonad  
      char *save_str=""; //reshteh asli baray zakhireh addad vared shodeh 
      //------------------------------------------------------------------
      void display()
      {
        char lcd_buf[16]; 
        char result_str[16];   
        ftoa(number1,3,result_str);
        sprintf(lcd_buf,"%s",result_str);    
        lcd_clear(); 
        lcd_gotoxy(0,0);
        lcd_puts(lcd_buf); 
        delay_ms(500); 
      }
      //------------------------------------------------------------------
      void config_number(float f_number)
      {
        static float divsion[]={1,10,100,1000,10000,100000,1000000}; 
        f_number=(f_number/divsion[mmz]);
        result=f_number; 
      }
      //------------------------------------------------------------------- 
      void sin_DRG()
      {
        number1 = atof(save_str);
        *save_str=NULL;        
        config_number(number1);
        number1=result; 
        number1=(number1*pp)/180;
        number1=sin(number1); 
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+';
        display(); 
        while(SHIFT==1 && SIN==0); 
      }
      //------------------------------------------------------ 
      void arcsin_DRG(){ 
        number1 = atof(save_str);
        *save_str=NULL;     
        config_number(number1);
        number1=result; 
        number1=asin(number1); 
        number1=(number1*180)/pp;
        display();
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+'; 
        while(SHIFT==0 && SIN==0); 
      }
      //------------------------------------------------------
      void cos_DRG()
      {
        number1 = atof(save_str);
        *save_str=NULL;        
        config_number(number1);
        number1=result; 
        number1=(number1*pp)/180;
        number1=cos(number1);
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+';
        display();
        while(SHIFT==1 && COS==0); 
      }  
      //------------------------------------------------------
      void arccos_DRG()
      { 
        number1 = atof(save_str);
        *save_str=NULL;        
        config_number(number1);
        number1=result; 
        number1=acos(number1); 
        number1=(number1*180)/pp;
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+';    
        display(); 
        while(SHIFT==0 && COS==0); 
      }
      //-------------------------------------------------------
      void tan_DRG()
      {  
        number1 = atof(save_str);
        *save_str=NULL;        
        config_number(number1);
        number1=result; 
        number1=(number1*pp)/180;
        number1=tan(number1); 
        number1=number1+0.0001; 
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+'; 
        display(); 
        while(SHIFT==1 && TAN==0); 
      } 
      //-------------------------------------------------------
      void arctan_DRG()
      { 
        number1 = atof(save_str);
        *save_str=NULL;        
        config_number(number1);
        number1=result; 
        number1=atan(number1); 
        number1=(number1*180)/pp;
        number1=number1+0.0001; 
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+'; 
        display(); 
        while(SHIFT==0 && TAN==0); 
      } 
      //-------------------------------------------------------
      void log_10()
      {
        number1 = atof(save_str);
        *save_str=NULL;        
        config_number(number1);
        number1=result; 
        number1=log10(number1); 
        num_dis=1;
        count=0;
        mmz=0;
        last_key='+'; 
        display();
        while(LOG==0); 
      }
      //-------------------------------------------------------------------
      signed char test_key (char key)
      { 
      if ((key == '.')|| ((key >= '0') && (key <= '9'))) return 1;
        else return 0;
       }
       
      //-------------------------------------------------------------------
      void ack_opretion(char opretion){
        signed char res = 0;
        switch (opretion)
        { case '+' : number1 += number2; break;
         case '-' : number1 -= number2; break;
         case '*' : number1 *= number2; break;
         case '%' : 
           if (number2 != 0) 
            number1 /= number2;
           else
            res = 2;
           break;   
         }
        if (res == 0){ 
         if ((number1 >= -999999999) && (number1 <= 999999999)) display(); 
         else {
         lcd_gotoxy(0,0);
         lcd_putsf("error number");
         delay_ms(1000);
         lcd_clear();
         lcd_gotoxy(0,0);   
         lcd_putchar('0');
         lcd_gotoxy(0,0);
         }
         }
        if (res == 2){ 
         lcd_clear();
         lcd_putsf("*ERROR*"); 
        } 
       }   
      //------------------------------------------------------------------- 
      void calculator(){
      unsigned char key=0;    //dadehi ke az keypad migirim
      char *helper="";    //reshteh komaki
      signed char data_in; 
        number1 = 0;
        number2 = 0;
        last_key = 0;  
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("0"); 
        data_in = 0; 
        lcd_gotoxy(0,0); 
        for (;;){ 
      start:  
         key = keypad();
         if (test_key(key)){ 
           if(num_dis==1) {lcd_clear();num_dis=0;}  
           if (data_in != 9){ 
            data_in++;
            if((key=='.')&&(count!=1)){count=1;data_in--;lcd_putchar(key);goto start;} 
            if(key=='.') {data_in--;goto start;}
            lcd_putchar(key); 
            if(count==1) mmz++;   
            helper=0; 
            key&=0x0f;
            itoa(key,helper);     
            strcat(save_str,helper); 
           }
          }
         else{ 
           if (data_in != 0){       
            if (last_key == 0){    
              number1 = atof(save_str);
              *save_str=NULL;        
              config_number(number1);
              number1=result;
              count=0;
              mmz=0;
              num_dis=1; 
              }
            else{      
              number2 = atof(save_str); 
              *save_str=NULL;               
              config_number(number2);
              number2=result; 
              count=0;
              mmz=0; 
              num_dis=1;            
              }
           }
           data_in = 0;   
           if (last_key != 0)
            ack_opretion(last_key);
           if (key != '=')
            last_key = key;
           else 
            last_key = 0; 
          }
        }
      } 
      //-------------------------------------------------------------------
      //////////////////////////////////////////// /////////////////////////////
      
      flash char row[]={~1,~2,~4,~8};
      flash char data_key[]={'7','8','9','%','4','5','6','*','1','2','3','-','.','0','=','+'};
      unsigned char ac,table;
      unsigned int r; 
      
      //**************** lcd_display keypad4*4 ******************************
      unsigned char keypad(){ 
      while (1){
       for (r=0;r<4;r++){
        ac=4;
        PORTD=row[r]; 
        DDRD=0x0f;   
        if (c1==0) ac=0; 
        if (c2==0) ac=1; 
        if (c3==0) ac=2;  
        if (c4==0) ac=3; 
        //*********************
        if (LOG==0) log_10(); 
        if (SHIFT==1 && SIN==0) sin_DRG();   
        if (SHIFT==1 && COS==0) cos_DRG(); 
        if (SHIFT==1 && TAN==0) tan_DRG();      
        if (SHIFT==0 && SIN==0) arcsin_DRG();   
        if (SHIFT==0 && COS==0) arccos_DRG(); 
        if (SHIFT==0 && TAN==0) arctan_DRG();    
        //*********************
        if (!(ac==4)){      
        table=data_key[(r*4)+ac];  
      //________________________________ 
        while (c1==0){} 
        while (c2==0){} 
        while (c3==0){} 
        while (c4==0){}  
        delay_ms(20);
        while (c1==0){} 
        while (c2==0){} 
        while (c3==0){} 
        while (c4==0){} 
        delay_ms(20); 
        return table; 
         }
       }
       };
      }
      //************************************
      void setting(){
      PORTD=0xff;
      DDRD=0x0f; 
      PORTC=0xFF;
      DDRC=0x00; 
      lcd_init(16);
      }
      فایل calculator.c
      کد:
      #include "keypad.h"  
      void main()
      { 
        setting();
        calculator();
        while(1);
      }
      آقای زارع بسیار از محبت و کمک بی دریغ شما ممنونم.
      این برنامه که زحمت کشیدید و اصلاح کردید رو تو کد ویژن اجرا کردم اما مشکل پا برچاست!!! :angry: :angry:
      به نظرتون ممکنه کد ویژن من ایراد داشته باشه؟
      امکانش هست فایل برنامه ای که خودتون ساختین رو برام بذارین؟

      دیدگاه


        #18
        پاسخ : راهنمایی برای حل مشکل این برنامه

        یه پروژه جدید ایجاد کن -- تو یه درایو دیگه ذخیره کن و بعد کد ها رو توش کپی کن ببین فرجی حاصل میشه...
        برا خودم چند بار این مشکل پیش اومده که با دو کار بالا مشکل حل شده....

        تو کد ویژن ون که مشکلی نداره ....ولی چرا برا شما..*&^%$#@!#$%^&*)(....
        اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

        اگه دوس دارید سریع به جواب برسید :
        1) قبل از پرسیدن سوال، بسرچید.
        2) سوالاتون رو با جزئیات کامل مطرح کنید.

        دیدگاه


          #19
          پاسخ : راهنمایی برای حل مشکل این برنامه

          به نظرتون ممکنه کد ویژن من ایراد داشته باشه؟
          امکانش هست فایل برنامه ای که خودتون ساختین رو برام بذارین؟
          براتون ایمیل کردم
          اگر ارور داد کدویژن رو از اول نصب کنید.
          اللهم صل علی محمد و ال محمد و عجل فرجهم
          >>> www.DMF313.ir <<<
          اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
          در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
          است.

          دیدگاه


            #20
            پاسخ : راهنمایی برای حل مشکل این برنامه

            با تشکر از همه دوستان به خصوص آقای زارع عزیز مشکل حل شد!

            دیدگاه

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