اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام
    این برنامه ماشین حساب مهندسی از کتاب آقای الوندی که قبلا ساختم و جواب داده اما الان موقع کامپایل کردن ارور میده(undefined symbol) . متاسفانه به سی دی اون کتاب هم دسترسی ندارم که فایل اصلی رو کپی کنم.
    اگه ممکنه دوستان محبت کنن راهنمایی کنن که مشکل رو چطوری حل کنم.
    ممنون میشم اگه کسی فایل اصلی این پروژه رو داره برام بذاره.
    لینک برنامه:
    calculator.rar -

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

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

    /************************************************** ***
    Project : caculator
    Version : 1.1
    Date : 1386/3/1
    Author :
    Company :

    Chip type : ATmega16
    Program type : Application
    Clock frequency : 16.000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega16.h>
    #include <delay.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x18 ;PORTB
    #endasm
    #include <lcd.h>


    bit a1,a2;
    float ans,ans1,ans2;

    char w,a,c;
    char data,ha[18],co[18],ss1[18];

    unsigned char c1[]="1";
    unsigned char c2[]="2";
    unsigned char c3[]="3";
    unsigned char c4[]="4";
    unsigned char c5[]="5";
    unsigned char c6[]="6";
    unsigned char c7[]="7";
    unsigned char c8[]="8";
    unsigned char c9[]="9";
    unsigned char c10[]="0";
    unsigned char c11[]=".";

    void coding(unsigned char ba){
    switch (ba)
    {
    case 1:
    *strcat(ha,c1);
    break;
    //******************
    case 2:
    *strcat(ha,c2);
    break;
    //******************
    case 3:
    *strcat(ha,c3);
    break;
    //******************
    case 4:
    *strcat(ha,c4);
    break;
    //******************
    case 5:
    *strcat(ha,c5);
    break;
    //******************
    case 6:
    *strcat(ha,c6);
    break;
    //******************
    case 7:
    *strcat(ha,c7);
    break;
    //******************
    case 8:
    *strcat(ha,c8);
    break;
    //******************
    case 9:
    *strcat(ha,c9);
    break;
    //******************
    case 10:
    *strcat(ha,c10);
    break;
    //******************
    case 23:
    *strcat(ha,c11);
    break;
    //******************
    case 20:
    c=strlen(ha);
    ha[c-1]=0;
    break;
    //******************
    }
    }

    void ref_key(void){
    DDRC=0x0f;
    //******************************
    PORTC=0xff;
    PORTC.0=0;
    delay_ms(15);
    if(PINC.4==0)data=15;
    if(PINC.5==0)data=7;
    if(PINC.6==0)data=8;
    if(PINC.7==0)data=9;
    if(PIND.7==0)data=11;
    //*******************************
    PORTC=0xff;
    PORTC.1=0;
    delay_ms(15);
    if(PINC.4==0)data=20;
    if(PINC.5==0)data=4;
    if(PINC.6==0)data=5;
    if(PINC.7==0)data=6;
    if(PIND.7==0)data=12;
    //****************************
    PORTC=0xff;
    PORTC.2=0;
    delay_ms(15);
    if(PINC.4==0)data=21;
    if(PINC.5==0)data=1;
    if(PINC.6==0)data=2;
    if(PINC.7==0)data=3;
    if(PIND.7==0)data=13;
    //****************************
    PORTC=0xff;
    PORTC.3=0;
    delay_ms(15);
    if(PINC.4==0)data=22;
    if(PINC.5==0)data=23;
    if(PINC.6==0)data=10;
    if(PINC.7==0)data=16;
    if(PIND.7==0)data=14;
    //****************************
    }





    tanzimat(void){
    if(data==15){
    lcd_clear();
    ans=0;
    ans1=0;
    ans2=0;
    a=0;
    w=0;
    a1=0;
    a2=0;
    }

    if(data==21){
    ans=atof(ha);
    if(ans==0){
    ans1=pow(ans1,2);
    a1=1;
    strcpy(ha,co);
    w=0;
    a2=0;
    }else{
    ans1=pow(ans,2);
    a1=1;
    strcpy(ha,co);
    w=0;
    a2=0;
    }
    }

    if(data==22){
    ans=atof(ha);
    if(ans==0){
    ans1=isqrt(ans1);
    a1=1;
    strcpy(ha,co);
    w=0;
    a2=0;
    }else{
    ans1=isqrt(ans);
    a1=1;
    strcpy(ha,co);
    w=0;
    a2=0;
    }
    }


    if(data==11){ // /
    ans=atof(ha);
    if(ans==0) goto ex1;
    if(a==0) ans1=ans;
    if(a==1) ans1=(ans1*ans);
    if(a==2) ans1=(ans1/ans);
    if(a==3) ans1=(ans1-ans);
    if(a==4) ans1=(ans1+ans);
    ex1:
    a1=1;
    a=2;
    strcpy(ha,co);
    w=0;
    a2=0;
    }

    if(data==12){ // *
    ans=atof(ha);
    if(ans==0) goto ex2;
    if(a==0) ans1=ans;
    if(a==1) ans1=(ans1*ans);
    if(a==2) ans1=(ans1/ans);
    if(a==3) ans1=(ans1-ans);
    if(a==4) ans1=(ans1+ans);
    ex2:
    a1=1;
    a=1;
    strcpy(ha,co);
    w=0;
    a2=0;
    }


    if(data==13){ // -
    ans=atof(ha);
    if(ans==0) goto ex3;
    if(a==0) ans1=ans;
    if(a==1) ans1=(ans1*ans);
    if(a==2) ans1=(ans1/ans);
    if(a==3) ans1=(ans1-ans);
    if(a==4) ans1=(ans1+ans);
    ex3:
    a1=1;
    a=3;
    strcpy(ha,co);
    w=0;
    a2=0;
    }

    if(data==14){ // +
    ans=atof(ha);
    if(ans==0) goto ex4;
    if(a==0) ans1=ans;
    if(a==1) ans1=(ans1*ans);
    if(a==2) ans1=(ans1/ans);
    if(a==3) ans1=(ans1-ans);
    if(a==4) ans1=(ans1+ans);
    ex4:
    a1=1;
    a=4;
    strcpy(ha,co);
    w=0;
    a2=0;
    }



    if(data==16){ // =
    ans=atof(ha);
    if(ans==0 && a==2){
    lcd_clear();
    lcd_putsf(" !!eroor!!"
    delay_ms(2000);
    a=0;
    a1=0;
    a2=0;
    goto ex5;
    }
    if(a==1) ans1=(ans1*ans);
    if(a==2) ans1=(ans1/ans);
    if(a==3) ans1=(ans1-ans);
    if(a==4) ans1=(ans1+ans);
    lcd_gotoxy(15,0);
    lcd_putsf(" "
    a=5;
    a2=1;
    a1=1;
    ex5:
    strcpy(ha,co);
    w=0;
    }
    }


    void main(void)
    {
    DDRC=0x0f;
    lcd_init(16);
    while (1)
    {
    delay_ms(200);
    lcd_clear();
    data=0;
    ref_key();
    tanzimat();
    if(data>=1 && data<=10 && a2==0) a1=0;
    if(!a1){
    w=strlen(ha);
    if(w<14){
    coding(data);
    }
    lcd_puts(ha);
    }else{
    ftoa(ans1,3,ss1);
    lcd_clear();
    lcd_puts(ss1);
    }
    lcd_gotoxy(15,0);
    if(a==1)lcd_putsf("*"
    if(a==2)lcd_putsf("/"
    if(a==3)lcd_putsf("-"
    if(a==4)lcd_putsf("+"
    };
    }
    سید محمد خدادادی
    الکترونیک هوشمند

    دیدگاه


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

      اصل برنامه کتاب مورد نظر

      //<<<<<> Author: Jaber Alvandi <<<<>>>> Book: Microcontrollers AVR
      //>>>>>>>>>>>>&g t;>>>>>>>> www.microAVR.iranblog.com <<<<<<<<<<<<&l t;<<<
      #define pp 3.1415927
      #define SIN PINC.0
      #define COS PINC.1
      #define TAN PINC.2
      #define LOG PINC.3
      #define SHIFT PINC.4
      #include <mega16.h>
      #include <delay.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <math.h>
      #asm
      .equ __lcd_port=0x1B ;PORTA
      #endasm
      #include <lcd.h>
      #include "keypad.h"
      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[32];
      sprintf(lcd_buf,"%f",number1);
      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 == '.&#039|| ((key >= '0&#039 && (key <= '9&#039)) 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=='.&#039&&(count!=1)){count=1;data_in--;lcd_putchar(key);goto start;}
      if(key=='.&#039 {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 != '=&#039
      last_key = key;
      else
      last_key = 0;
      }
      }
      }
      //-------------------------------------------------------------------
      void main()
      {
      setting();
      calculator();
      while(1){
      };
      }

      زیر برنامه کی پد
      #define c1 PIND.4
      #define c2 PIND.5
      #define c3 PIND.6
      #define c4 PIND.7
      #define SIN PINC.0
      #define COS PINC.1
      #define TAN PINC.2
      #define LOG PINC.3
      #define SHIFT PINC.4
      flash char row[]={~1,~2,~4,~8};
      flash char data_key[]={'7','8','9',' %','4','5','6', '*','1','2','3& #039;,'-','.','0','=',& #039;+'};
      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);
      }

      هدر کی پد

      //******************************************
      unsigned char keypad();
      //************************************
      void setting();
      //************************************

      سید محمد خدادادی
      الکترونیک هوشمند

      دیدگاه


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

        دوستان که سورس رو گذاشتن
        من فقط یک جمله بگم اون هم اینکه وقتی کامپایلر ارور undefined symbol رو میده
        یعنی اینکه شما از یک متغییری استفاده کردید که اون رو قبلا تعریف نکرده اید
        یا قبل از تعریف از اون استفاده کردید
        مثلا توی خط 20 متغییر رو تعریف کردید ولی در خط 10 از اون استفاده شده
        یا اینکه اصلا متغییر تعریف نشده و شما ازش استفاده کردید
        در کل تعریف متغییر جزء مباحث اولیه در سی هست
        و برخلاف چیزی که عموما فکر می کنن مسئله بسیار مهم و حیاتی هست اگر متغییرها درست و بجا تعریف بشن بسیاری از مشکلات برنامه نویسی و البته برنامه ها حل میشه

        دیدگاه


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

          نوشته اصلی توسط golabi2
          سلام
          این برنامه ماشین حساب مهندسی از کتاب آقای الوندی که قبلا ساختم و جواب داده اما الان موقع کامپایل کردن ارور میده(undefined symbol) . متاسفانه به سی دی اون کتاب هم دسترسی ندارم که فایل اصلی رو کپی کنم.
          اگه ممکنه دوستان محبت کنن راهنمایی کنن که مشکل رو چطوری حل کنم.
          ممنون میشم اگه کسی فایل اصلی این پروژه رو داره برام بذاره.
          لینک برنامه:
          calculator.rar -
          لینکت دانلود نمیشه.....! :angry: :angry: :angry:
          اللهم صل علي محمد و ال محمد و عجل فرجهم
          >>> www.DMF313.ir <<<
          اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
          در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
          است.

          دیدگاه


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

            نوشته اصلی توسط حمید زارع
            لینکت دانلود نمیشه.....! :angry: :angry: :angry:
            دانلود شد که :icon_razz: :icon_razz: :icon_razz: :icon_razz:
            دادا لصفا کل کد های برنامتو قرار بده و نه فقط....
            اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

            دیدگاه


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

              با تشکر از همه دوستان ولی مشکل هنوز پا برجاست!
              اینم کل کدهای برنامه :
              calculator.rar -

              دیدگاه


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

                نوشته اصلی توسط golabi2
                با تشکر از همه دوستان ولی مشکل هنوز پا برجاست!
                اینم کل کدهای برنامه :
                calculator.rar -
                داداش من نمیتونم دانلودش کنم یه کاریش کن؛برام ایمیلش کن تا ببینم مشکل چیه؟
                اللهم صل علي محمد و ال محمد و عجل فرجهم
                >>> www.DMF313.ir <<<
                اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
                در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
                است.

                دیدگاه


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

                  براتون ایمیل کردم.

                  دیدگاه


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

                    دادا بیا اینم از پروژه شما که درست شد(البته امید وارم :biggrin

                    http://cld.persiangig.com/download/mym7WRy4QY/dmf313.zip/dl


                    اوضاششششششششششششش خیلیییییییییی داغوووووووووون بوددددددددددددددد.

                    همه فایل ها رو کردم یه فایل


                    موفق باشی دادا
                    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                    دیدگاه


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

                      ممنونم ولی این هم همون مشکل رو داره

                      دیدگاه


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

                        تو کدویژن من که نه اروری داد و نه وارنینگی.... :surprised: :surprised: :surprised:
                        اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                        دیدگاه


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

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

                          دیدگاه


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

                            دوست عزیز مشکل حل شد.
                            مشکل اینجا بود که توی اون هدر فایلها هم باید
                            کد:
                            #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);
                            }
                            اللهم صل علي محمد و ال محمد و عجل فرجهم
                            >>> www.DMF313.ir <<<
                            اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
                            در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
                            است.

                            دیدگاه


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

                              نوشته اصلی توسط md3848
                              تو کدویژن من که نه اروری داد و نه وارنینگی.... :surprised: :surprised: :surprised:
                              برای من همون Error قبلی رو میده! :eek:

                              دیدگاه

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