اطلاعیه

Collapse
No announcement yet.

تبدیل عدد به کد اسکی در MPLAB

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

    تبدیل عدد به کد اسکی در MPLAB

    سلام
    آقا من LCD رو راه اندازی کردم حالا تابعی رو نوشتم که اعداد رو (مثلا 123)بگیره و هر عدد(مثلا 1 و 2 و3) رو با 48 (عدد صفر اسکی) جمع کنه و هر عدد رو در خروجی ظاهر کنه (مثلا 49 و 50 و 51)، تابع برنامه به این صورت هست
    کد:
    void numtostring(char *s)
    {
      char i;
      i=0;
      while(s[i])
      {
      writedata(s[i]+'0');
      Delay10KTCYx(30);
      i=i+1;
      }
    }

    تابع writedata هر کارکتری رو که بهش بدین چاپ می کنه مثلا اگر 'M' بدین M رو چاپ می کنه و اگر 65 بدین کارکتر A رو چاپ می کنه ، اما وقتی به تابع دستور زیر رو ارسال می کنم
    numtostring(123);

    همش عدد 8 چاپ می شه با :
    مشکل کجاست؟
    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

    #2
    پاسخ : تبدیل عدد به کد اسکی در MPLAB

    سلام

    راستش من چندین مشکل در برنامه میبینم که با بر طرف کردنشون به جواب نزدیک تر میشین

    شما در تابع numtostring یک اشاره گر تعریف کردین , چه نوع متغیری رو به این اشاره گر نسبت میدین ؟ آیا یک رشته کاراکتری هست ؟ یا مثلا عدد صدوبیست و سه

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

    این کار به این خاطره که اگر شما برای مثال یک رشته کاراکتری رو به LCD ارسال میکنید تابع متوجه بشه که کی کار تمام هست و باید کار نوشتن بر روی LCD به پایان برسه , این کار به وسیله یک while انجام میشه که وقتی به کاراکتر تهی ( عدد صفر باینری یا اعشاری ) میرسه از تابع خارج میشه

    آیا این اتفاق در تابع شما رخ میده ؟ :question:

    در کل یکی از ساده ترین و پر کاربرد ترین توابع تبدیل اعداد اعشاری و صحیح به کد های اسکی تابع sprintf هست , که البته این تابع فضای زیادی در میکرو اشغال میکنه و گاهی وقتا بهتر از توابعی مثل itoa استفاده کنیم
    نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
    تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

    دیدگاه


      #3
      پاسخ : تبدیل عدد به کد اسکی در MPLAB

      سلام آقای رمضانی
      مثل همیشه ازتون ممنونم
      منم مستندات خیلی جاها رو مطالعه کردم همه جا می گن از این دستور sprintf تا حد امکان استفاده نکنم

      تابع رو به این صورت تصحیح کردم و جواب هم گرفتم

      کد:
      void numtostring(unsigned char s)
      {
        unsigned char i;
        unsigned char i1[16];
        i=0;
        while(s!=0)
        {
          i=i+1;
          i1[i]=s%10+48;
          s=s/10;
        }
        for(i=i;i>0;i--)
        {
          writedata(i1[i]);
          Delay1KTCYx(40);
        } }
      ورودی این تابع یک عدد هست و اعداد رو تک به تک به اسکی تبدیل و روی ال سی دی نشون می ده
      آقا یه مشکل اساسی دارم

      توابع راه اندازی ال سی دی رو به صورت کانفیگ 8 بیت نوشتم

      کد:
      #include <p18f452.h>
      #include <delays.h>
      #include <stdio.h>
      
      
      #pragma config OSC=HSPLL
      #pragma config DEBUG=OFF
      #pragma config WDT=OFF
      #pragma config BOR=OFF
      #pragma config LVP=OFF
      #pragma config PWRT=ON
      
      #define LED PORTDbits.RD3
      #define rs PORTDbits.RD0
      #define en PORTDbits.RD1
      #define datas LATB
      
      
      
      //////////////////////////LCD function//////////////////
      void writedata(unsigned char s){
        rs=1;
        en=0;
        datas=s;
        en=1;
        Delay10TCYx(10);
        en=0;
        Delay10TCYx(10);
      }
      void writecommand(unsigned char s){
        rs=0;
        en=0;
        datas=s;
        en=1;
        Delay10TCYx(10);
        en=0;
        Delay10TCYx(10);
      }
      void lcdinit()
      {
        en=0;
        Delay10KTCYx(100);
        writecommand(0x38);
        Delay1KTCYx(1);
        writecommand(0x0E);
        Delay1KTCYx(1);
        writecommand(0x0C);
        writecommand(0x01);
      }
      void numtostring(unsigned char s)
      {
        unsigned char i;
        unsigned char i1[16];
        i=0;
        while(s!=0)
        {
          i=i+1;
          i1[i]=s%10+48;
          s=s/10;
        }
        for(i=i;i>0;i--)
        {
          writedata(i1[i]);
          Delay1KTCYx(40);
        }
      }
      //////////////////////////LCD function//////////////////
        unsigned char i;
         unsigned char i1;
      
      void main(void)
      {
        TRISDbits.RD3=0;
        TRISB=0;
        TRISDbits.RD0=0;
        TRISDbits.RD1=0;
        LED=1;
        lcdinit();
        i=0;
        while(1)
        {
          if (i>10)
          {
           i=0;
          writecommand(0x02);
          writecommand(0x01);
          }
          Delay10TCYx(10);
          writedata('M');
          numtostring(123);
          writedata('N');
          Delay10KTCYx(1000);
          LED=~LED;
          i=i+1;
        }
      }
      مشکل اصلی این هست که در راند اول چاپ کردن وقتی کامند 01 که بیانگر پاک کردن ال سی دی هست رو ارسال می کنم دو کارکتر اولی روی ال سی دی نشون داده نمی شه(یعنی 23N رو به جای M123N نشون می ده و بقیه هم M123N نشون می ده )
      بعد از دستور پاک کردن کامند ابتدای خط و خانه رو ارسال کردم اما در شبیه سازی 123N و در واقعیت اولین رشته 23N نشون داده می شه.مشکل از کجاست؟

      البته در برنامه بالا ابتدا صفحه رو به خانه اشاره کردم و بعد پاک در برنامه های قبلی ابتدا پاک می کردم و بعد خانه اما بازم بی جواب!!!!
      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

      دیدگاه


        #4
        پاسخ : تبدیل عدد به کد اسکی در MPLAB

        سلام
        مشکلم رو با قرار دادن یه تاخیر 2.5 میلی ثانیه ای حل شد چیزی که فهمیدم زمان اجرای پاک کردن از همه دستورات بیشتر هست.فقط یه سوال دیگه این تابعی که من نوشتم فقط اعداد رو می تونه نشون بده حالا اگر بخوام مثلا چاپ کنم 10P باید چی کار کنم؟آرگومان و نحوه ارسال این رشته باید به چه صورت باشه؟
        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

        دیدگاه


          #5
          پاسخ : تبدیل عدد به کد اسکی در MPLAB

          :biggrin: بعد از نوشتن پاسخ زیر , پیام شما رو دیدم , گفتم بزارم باشه شاید مفید باشه :smile:
          من به کد های شما دقت کردم , مطمئن نیستم اما فکر میکنم بعد از ارسال دستور به LCD باید بیشتر از 10 سیکل صبر کنید , من فکر میکنم زمان ارسال کاراکتر های M و 1 ال سی دی مشغول هست و نمیتواند این دو کاراکتر رو دریافت کنه

          من الآن خاطرم نیست اما فکر میکنم این lcd ها یک بیت وضعیت داشتن کا با خوندن اون میشه متوجه شد که آیا LCD مشغول هست یا نه

          نوشته اصلی توسط baby_1
          سلام
          مشکلم رو با قرار دادن یه تاخیر 2.5 میلی ثانیه ای حل شد چیزی که فهمیدم زمان اجرای پاک کردن از همه دستورات بیشتر هست.فقط یه سوال دیگه این تابعی که من نوشتم فقط اعداد رو می تونه نشون بده حالا اگر بخوام مثلا چاپ کنم 10P باید چی کار کنم؟آرگومان و نحوه ارسال این رشته باید به چه صورت باشه؟
          من فکر میکنم بهتره همه چیز از هم جدا بشه مثلا شما یک تایع داشته باشین که اعداد صحیح رو به اسکی تبدیل کنه و اون رو در یک رشته کاراکتری ذخیره کنه و بعد این رشته کاراکتری رو به یک تابع که فقط کار اون چاپ کردن یک رشته بر روی LCD هست ارسال کنید

          اینجوری در تابع تبدیل عدد صحیح به اسکی تمرکز بیشتری دارین
          نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
          تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

          دیدگاه


            #6
            پاسخ : تبدیل عدد به کد اسکی در MPLAB

            سلام و ممنونم آقای رمضانی
            شرمنده وقتتون هم می گیرم، من سعی کردم بدون اصراف در پین های میکرو :eek: و تنها با تاخیر زمانی کاری که اکثرا انجام می دن این کار رو انجام بدوم
            من دو تا تابع مشکل رو حل می تونم کنم که به کارکترهای دیگه مقدارهای اسکیشون رو تبدیل بهم کنه، اما دیدم بهتره از همون دستور sprintf استفاده کنم که هم مشکلاتش کمتره هم حجمش نسبت به برنامه ی من کمتر در می یاد(برعکس همه جا شدم دیگه )

            یه سوال دیگه :
            در این تابع برای نمایش اعداد اعشاری باید چی کار کرد این دو تا دستور اصلا کار نمی کردن و فقط عبارت hello رو نمایش می دادن

            float x;
            x=159.1852;
            sprintf(i1,"Hello%4f",x);

            یا

            sprintf(i1,"Hello%4f",159.1852);
            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


              #7
              پاسخ : تبدیل عدد به کد اسکی در MPLAB

              یه سوال دیگه :
              در این تابع برای نمایش اعداد اعشاری باید چی کار کرد این دو تا دستور اصلا کار نمی کردن و فقط عبارت hello رو نمایش می دادن

              float x;
              x=159.1852;
              sprintf(i1,"Hello%4f",x);

              یا

              sprintf(i1,"Hello%4f",159.1852);
              راستش این هم یکی از مشکلات این تابع هست ,من هم مدتی پیش قصد انجام این کار رو با این تایع داشتم اما هر کاری کردم نشد , راستش من خاستم از ftoa استفاده کنم , اما متوجه نشدم مشکل کجاست چون اون هم نشد

              البته من وقت زیادی روی آزمایش این تابع ها نزاشتم , با ftoa کار کنید حتما جواب میده , وبعد از اون با sprintf ترکیبش کنید

              و اما من دیدم که بعضی ها بعد از استفاده از ftoa با استفاده از ساختار ( struct ) ها و بدون استفاده از sprintf این کار رو انجام میدن


              نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
              تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

              دیدگاه

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