ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 7 از 7
  1. #1
    2008/10/29
    2,098
    219

    تبدیل عدد به کد اسکی در 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. #2
    2009/02/18
    تهران
    270
    1

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

    سلام

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

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

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

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

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

    در کل یکی از ساده ترین و پر کاربرد ترین توابع تبدیل اعداد اعشاری و صحیح به کد های اسکی تابع sprintf هست , که البته این تابع فضای زیادی در میکرو اشغال میکنه و گاهی وقتا بهتر از توابعی مثل itoa استفاده کنیم
    نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
    تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه
  3. #3
    2008/10/29
    2,098
    219

    پاسخ : تبدیل عدد به کد اسکی در 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. #4
    2008/10/29
    2,098
    219

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

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

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

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

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

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

    اینجوری در تابع تبدیل عدد صحیح به اسکی تمرکز بیشتری دارین
    نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
    تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه
  6. #6
    2008/10/29
    2,098
    219

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

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

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

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

    یا

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

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

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

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

    یا

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

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

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


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

موضوعات مشابه

  1. تبدیل باینری به اسکی
    توسط yadegari در انجمن میکروکنترلرهای PIC
    پاسخ: 2
    آخرين نوشته: 2013/05/24, 11:06
  2. تبدیل اسکی به اینتیجر در بسکام
    توسط naser134 در انجمن میکروکنترلرهای AVR
    پاسخ: 1
    آخرين نوشته: 2013/01/15, 06:02
  3. تبدیل 32 بیتی به اسکی
    توسط samin20 در انجمن میکروکنترلرهای AVR
    پاسخ: 2
    آخرين نوشته: 2011/10/21, 10:12
  4. تبدیل کد اسکی به رشته
    توسط balabe در انجمن میکروکنترلرهای AVR
    پاسخ: 1
    آخرين نوشته: 2011/06/07, 12:26
  5. تبدیل کد اسکی به هگز و برعکس با iar
    توسط dariush_abbasi868 در انجمن میکروکنترلرهای AVR
    پاسخ: 2
    آخرين نوشته: 2009/09/08, 16:28

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •