اطلاعیه

Collapse
No announcement yet.

نمایش عدد اعشاری روی lcd توسط MPLABE

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

    نمایش عدد اعشاری روی lcd توسط MPLABE

    سلام دوستان

    یه مدتی گرفتار بودم نرسیدم سر بزنم

    دوتا سوال داشتم

    1- چه طوری میشه اعداد عشاری رو روی LCD نشون داد منظورم اینه که دستوری داره که بشه اونومستقیم نشون داد ؟؟؟ نخوایم خودمون برنامه بنویسیم

    2- یه مشکل دیگه مثلا وقتی یه عدد 4 رقمی رو داخل سطر 1 نشون بدیم بعد همون جا یه عدد دو رقمی نشون بدیم دوتا از رقمای عدد چهار رقمی باقی

    میمونه که نباید باشه داخل CODE VISION وقتی میخواستیم این کارو بکنیم این دستورو مینوشتیم sprintf(buff,"20%C",0) 3

    اینجا جواب نمیده باید چی کار کرد ؟؟؟
    عامل کليدي تمام موفقيتها " عمل کردن" است

    #2
    پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

    با سلام خدمت جناب alimohammad_sh


    پاسخ دو سوال شما در فراگیری کامل دستور sprintf میباشد
    به وسیکه این دستور میتوانید تمامی این مشکلات را حل کنید


    فرض کنید یک شمارنده دو بایتی به نام cont دارید و اعداد بین 0 تا 50000 تغییر میکنند , پس تعداد کاراکتر های اعداد بین 1 تا 5 عدد هست

    حال به دستور زیر دقت کنید


    sprintf(buf,"cont = %5d ", cont);

    شناسه %5d پنج کاراکتر را برای شمارنده شما رزرو میکند

    در دستورالعمل این دستور آمده است که شما میتوانید اعدادی با ممیز شناور را نیز به کاراکتر تبدیل کنید , که برای اطلاعات بیشتر دستور sprintf را در هلپ mplab سرچ کنید

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

    دیدگاه


      #3
      پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

      با سلام
      با تشکر از قای رمضانی

      اقا من توضیحات sprintf رو نگاه کردم ولی عدد اعشاری نتونستم روی lcd نشون بدم

      باید از دستوری دیگه ای هم استفاده کنم ؟؟
      عامل کليدي تمام موفقيتها " عمل کردن" است

      دیدگاه


        #4
        پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

        نوشته اصلی توسط alimohammad_sh
        سلام دوستان

        یه مدتی گرفتار بودم نرسیدم سر بزنم

        دوتا سوال داشتم

        1- چه طوری میشه اعداد عشاری رو روی LCD نشون داد منظورم اینه که دستوری داره که بشه اونومستقیم نشون داد ؟؟؟ نخوایم خودمون برنامه بنویسیم

        2- یه مشکل دیگه مثلا وقتی یه عدد 4 رقمی رو داخل سطر 1 نشون بدیم بعد همون جا یه عدد دو رقمی نشون بدیم دوتا از رقمای عدد چهار رقمی باقی

        میمونه که نباید باشه داخل CODE VISION وقتی میخواستیم این کارو بکنیم این دستورو مینوشتیم sprintf(buff,"20%C",0) 3

        اینجا جواب نمیده باید چی کار کرد ؟؟؟
        1-طول میدان مقادیر اعشاری به صورت w.df% بیان میشه که در اون w طول کل میدان و d طول قسمت اعشاره.
        به عنوان مثال وقتی میدان رو به صورت 4.1f% بیان میکنیم یعنی دو رقم صحیح و یک رقم برای کاراکتر"." و یک رقم برای اعشار داریم. توجه کنید که برای رقم اعشار حتما باید از کارکتر کنترلی F استفاده کنید نه C.

        2- برای حل مشکل اعداد باقیمانده راحت ترین کار اینه که به تعداد کل ارقام حد اکثر عددی که میخواهیم نمایش بدیم منهای یک رقم از کارکتر space ( خالی) استفاده کنیم. مثلا چنانچه عدد شما عدد صحیح باشه و از 0 الی 9999 تغییر میکنه باید بعد از کارکتر کنترلی، 3 بار space قرار بدید، این عمل معادل تعیین طول میدان( تعداد حداکثر ارقام ) است:

        کد:
        sprintf(buff,"%d  ",var1)
        راه حل دیگه اینه که قبل از نمایش رقم جدید ابتدا صفحه LCD رو پاک کنید ، ولی چنانچه سرعت تغییرات عدد زیاد باشه صفحه LCD هم باید مکررا پاک بشه که به صورت چشمک زن در میاد.

        دیدگاه


          #5
          پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

          نوشته اصلی توسط Perfect
          1-طول میدان مقادیر اعشاری به صورت w.df% بیان میشه که در اون w طول کل میدان و d طول قسمت اعشاره.
          به عنوان مثال وقتی میدان رو به صورت 4.1f% بیان میکنیم یعنی دو رقم صحیح و یک رقم برای کاراکتر"." و یک رقم برای اعشار داریم. توجه کنید که برای رقم اعشار حتما باید از کارکتر کنترلی F استفاده کنید نه C.

          2- برای حل مشکل اعداد باقیمانده راحت ترین کار اینه که به تعداد کل ارقام حد اکثر عددی که میخواهیم نمایش بدیم منهای یک رقم از کارکتر space ( خالی) استفاده کنیم. مثلا چنانچه عدد شما عدد صحیح باشه و از 0 الی 9999 تغییر میکنه باید بعد از کارکتر کنترلی، 3 بار space قرار بدید، این عمل معادل تعیین طول میدان( تعداد حداکثر ارقام ) است:

          کد:
          sprintf(buff,"%d  ",var1)
          راه حل دیگه اینه که قبل از نمایش رقم جدید ابتدا صفحه LCD رو پاک کنید ، ولی چنانچه سرعت تغییرات عدد زیاد باشه صفحه LCD هم باید مکررا پاک بشه که به صورت چشمک زن در میاد.
          با تشکر

          من این رو نوشتم ولی جواب نگرفتم

          cont=45.2;
          while( BusyXLCD() );
          sprintf(buf,"%4.1f",cont);
          putsXLCD(buf);
          عامل کليدي تمام موفقيتها " عمل کردن" است

          دیدگاه


            #6
            پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

            سلام

            ببخشید که دیر پاسخ میدم , بدجوری سرم شلوغه :redface:

            طبق کتاب خانه های C استاندارد این دستور باید بدون مشکل این کار رو انجام بده

            http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

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

            mplab c18 با دستور sprintf مشکل داره :surprised:

            تا انجا که من متوجه شدم کلا متغیر های بیش از 16 بیت رو نمیتونه به کاراکتر تبدیل کنه :sad: من نمیدونم این مشکل یک باگ نرم افزاری هست یا اینکه چاره ی خاصی داره ؟!

            با استفاده از کتاب خانه stdlib.h مشکل کامل حل میشه , اما C18 به صورت کامل از این کتاب خانه پشتیبانی نمیکنه
            با استفاده از دستور ftoa در کتاب خانه stdlib.h میتوان این کار رو انجام داد , اما ظاهرا فقط کامپایلر HI-TECH از این دستور پشتیبانی میکنه

            دستور ftoa را در هلپ mplab سرچ کنید

            به لینک زیر دقت کنید

            http://www.cplusplus.com/reference/clibrary/cstdlib/


            البته ممکنه ابن مشکل در سری XC کامپایلر های میکروچیپ حل شده باشه

            من فرصت نکردم این موضوع رو در فروم میکروچیپ سرچ کنم , اما فکر میکنم باید راه حل خاصی داشته باشه , و درکل نوشتن این چنین کتاب خانه ای کار مشکلی نیست

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

            دیدگاه


              #7
              پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

              نوشته اصلی توسط ramezani.t


              mplab c18 با دستور sprintf مشکل داره :surprised:

              تا انجا که من متوجه شدم کلا متغیر های بیش از 16 بیت رو نمیتونه به کاراکتر تبدیل کنه :sad: من نمیدونم این مشکل یک باگ نرم افزاری هست یا اینکه چاره ی خاصی داره ؟!
              البته ممکنه ابن مشکل در سری XC کامپایلر های میکروچیپ حل شده باشه
              یک نکته اساسی رو باید مورد توجه قرار بدید: تقریبا در همه کامپایلر های C به صورت پیشفرض فرمت دستور sprintf و printf رو به صورت integer ( در بعضی دیگه به صورت small یا medium هست) تعریف شده. به دلیل اینکه استفاده از دستور sprintf حجم زیادی از رم و حافظه کد رو اشغال میکنه و اگر برای اعداد اعشاری ممیز شناور استفاده بشه این حجم اشغالی چند برابر میشه. بنا بر این با این تنظیمات پیشفرض کامپایلر نمیتونه عدد اعشاری رو به درستی به صورت کارکتر در بیاره. در این مورد باید در قسمت Options کامپایلر اولا تنظیمات مربوط به فرمت دستور sprintf رو به صورت float ( یا Large و یا Auto ) قرار بدید. و ثانیاً مقدار حافظه های CSTACK و RSTACK و همینطور Heap Size رو حد اقل دو برابر کنید.

              دیدگاه


                #8
                پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

                نوشته اصلی توسط Perfect
                یک نکته اساسی رو باید مورد توجه قرار بدید: تقریبا در همه کامپایلر های C به صورت پیشفرض فرمت دستور sprintf و printf رو به صورت integer ( در بعضی دیگه به صورت small یا medium هست) تعریف شده. به دلیل اینکه استفاده از دستور sprintf حجم زیادی از رم و حافظه کد رو اشغال میکنه و اگر برای اعداد اعشاری ممیز شناور استفاده بشه این حجم اشغالی چند برابر میشه. بنا بر این با این تنظیمات پیشفرض کامپایلر نمیتونه عدد اعشاری رو به درستی به صورت کارکتر در بیاره. در این مورد باید در قسمت Options کامپایلر اولا تنظیمات مربوط به فرمت دستور sprintf رو به صورت float ( یا Large و یا Auto ) قرار بدید. و ثانیاً مقدار حافظه های CSTACK و RSTACK و همینطور Heap Size رو حد اقل دو برابر کنید.

                میشه بگید از کجا باید این تنظیماتو تغییر بدم پیدا نکردم ؟؟
                عامل کليدي تمام موفقيتها " عمل کردن" است

                دیدگاه


                  #9
                  پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

                  سلام
                  من قبلا با این دستور گیر افتادم و از چندین تن از اشخاص اصلی میکروچیپ این سوال رو مطرح کردن جوابشون کامل رد پشتیبانی sprintf از دستورات اعشاری بوده هست و همشون از این دستور به عنوان با تاخیرترین و کندترین دستور یاد کردن ، پس کلی بگم از طرف غول های برنامه نویسی میکروچیپ رد شده و امکان پذیر نیست و استفاده از این دستور برای جاهایی با به چشم اوردن تاخیر این تابع قابل استفاده هست
                  حتی در سایت اثبات شده است برای تبدیل یک عدد به کد اسکی تابع نوشته شده ریاضی با کلی شرط از این دستور 190 بار سریعتر عمل کرده است(80 سیکل در مقابل 15156 برای تبدیل یک عدد دو رقمی)

                  برای این کار تابع رو به صورت زیر می تونین اصلاح کنین (در صورت تمایل)
                  sprintf(msg, "%ld.%ld", (long) i, (long) fabs((i - (long) i)*100));
                  که متغییر i متغییر اعشاریتون و عدد 100 بیانگر دو رقم بعد از اعشار هست که تبدیل رو براتون در متغییر آرایه ای msg می نویسد.
                  و برای این منظور می تونین از تابع ftoa استفاده کنین
                  هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                  دیدگاه


                    #10
                    پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

                    نوشته اصلی توسط baby_1

                    برای این کار تابع رو به صورت زیر می تونین اصلاح کنین (در صورت تمایل)
                    sprintf(msg, "%ld.%ld", (long) i, (long) fabs((i - (long) i)*100));
                    که متغییر i متغییر اعشاریتون و عدد 100 بیانگر دو رقم بعد از اعشار هست که تبدیل رو براتون در متغییر آرایه ای msg می نویسد.
                    و برای این منظور می تونین از تابع ftoa استفاده کنین
                    میشه یه توضیحی در موردش بدید ؟؟

                    ممنون
                    عامل کليدي تمام موفقيتها " عمل کردن" است

                    دیدگاه


                      #11
                      پاسخ : نمایش عدد اعشاری روی lcd توسط MPLABE

                      سلام
                      در ابتدا

                      کد:
                      (long)i

                      عمل cast رو در سی برای گرفتن مقدار صحیح از عدد اعشاری به کار می رود یعنی با این کار با توجه به صحیح بودن دیتاتایپ long قسمت اعشاری حذف می شه و قسمت صحیح باقی می ماند و در متغییر msg ریخته می شود(مثلا از عدد 123.45 عدد 123 جدا می شود )

                      کد:
                      i - (long) i


                      از مقدار متغییر اعشاری i مقدار صحیح اون کسر می شه یعنی باقی مانده برای عدد مثال زده شده می شه .45
                      حالا برای اینکه این عمل برای اعداد مثبت و منفی جواب بده از عبارت قدر مطلق گرفته می شود حالا عدد باقی مانده رو با توجه به دقت عدد بعد از اعشار در ده به توان دقت اعشار (که در اینجا 2 هست ) ضرب می کنیم که می شه 45 حالا این مقدار هم توسط sprintf به رشته تبدیل و در متغییر msg ذخیره می شود
                      یادتون باشه fabs مربوط به کتابخانه math.h هست
                      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                      دیدگاه

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