Hesam Fard

Hesam Fard

www.hesamfard.ir
Hesam Fard

Hesam Fard

www.hesamfard.ir

نمایش اعداد اعشاری در کدویژن

در بسیاری از پروژه ها نیاز است تا یک یا چند عدد را به صورت اعشاری بر روی LCD نمایش دهیم. همانطور که می دانید در codevision اعداد اعشاری با نوع float ذخیره می شوند. اما ممکن است هنگام نمایش اعداد اعشاری روی lcd با مشکلاتی مواجه شده باشید. برای نمایش اعداد اعشاری در avr به زبان C چندین راه وجود دارد. یکی از راه های پیش رو که استفاده از آن بسیار ساده است ، استفاده از تابع sprintf برای تبدیل اعداد اعشاری به رشته است.


 

 برای استفاده از تابع sprintf کافیست تا هدر فایل stdio.h را با دستور زیر به برنامه اضافه نمایید.

<include <stdio.h#

حالا می توانید در هر جای برنامه از این تابع استفاده کنید. پیشنهاد من اینست که اگر قصد نمایش عدد اعشاری روی lcd متنی را دارید یک متغیر بافر برای lcd ایجاد کنید. فرض کنید lcd 16 کارکتری در اختیار دارید. یک متغیر آرایه ای از نوع unsigned char با طول بیش از ۱۶ مثلا ۱۸ ( ۲ کارکتر برای overflow در نظر میگیریم ) ایجاد می کنیم.

unsigned char lcd_buff[18];

حالا با دستور sprintf می توانیم محتوای هر خط lcd را تولید و درون متغیر lcd_buff بریزیم و سپس محتوای این متغیر را با دستور lcd_puts روی lcd قرار دهیم.

فرمت استفاده از دستور sprintf به شکل زیر می باشد :

Standard C Input/Output Functions

int sprintf(char *str, char flash *fmtstr [ , arg1, arg2, …])
همانطور که می بینید اولین پارامتر این تابع ، نام متغیری است که میخواهید خروجی در آن ذخیره شود. سپس یک متغیر فلش که محتوای دلخواه درون این متغیر قرار داشته باشد ، این متغیر می تواند دارای قسمت هایی باشد که با سایر متغیر ها تکمیل شود ( arg1 , arg 2 و … ) . اگر کمی پیچیده شد ، سخت نگیرید در ادامه متوجه منظورم خواهید شد.
فکر کنید یک متغیر به نام temp و از نوع float داریم که مقدار دما را درون آن ذخیره کرده ایم. فرض کنید مقدار دما دارای ۲ رقم صحیح و ۲ رقم اعشار است و مقدار آن برابر ۳۰٫۴۴ درجه سانتی گراد است. حالا میخواهیم این متغیر را بر روی lcd و به صورت اعشاری با استفاده از تابع sprintf نمایش دهیم.
فرض کنید میخواهیم روی LCD دما با فرمت زیر نمایش داده شود :
Temp: 30.44 °C
برای اینکه خروجی به شکل بالا باشه ، از دستورات زیر استفاده می کنیم.
;(sprintf(lcd_buff,”Temp: %4.2f \xdfC”,temp
پارامتر اول ( lcd_buff ) محل ذخیره خروجی تابع sprintf رو مشخص می کنه . پارامتر دوم ، خروجی تابع رو مشخص میکنه ، در این قسمت این امکان هست که یک رشته شامل مقادیر ثابت و مقدار متغیر ها ایجاد کرد. \xdfCC برای نمایش °C هست و کارکتر درجه با کد \xdf روی lcd متنی قابل نمایش است. برای نمایش عدد اعشاری که شامل ۲ رقم صحیح و ۲ رقم اعشاری باشد باید از دستور %۴٫۲f استفاده نمود که فرمت استفاده از این دستور به شکل زیر است:
%[width].[precision]f
در فرمت بالا width طول کل عدد و precision تعداد ارقام اعشاری را مشخص می کند. برای مثال عدد مد نظر ما که دارای ۲ رقم صحیح و ۲ رقم اعشار است ، دارای طول ۴ و تعداد ارقام اعشاری ۲ است که به صورت زیر در می آید.
%۴٫۲f
دستور sprintf می تواند فرمت های دیگری مانند %u  اعداد صحیح بدون علامت ، %d و %i اعداد صحیح علامت دار ، %e اعداد علمی ، %x اعداد به فرمت هگزادسیمال ، %c کارکتر ، %s پوینتر رشته در رم و %p برای پوینتر رشته در فلش را در دومین پارامتر قبول کند. در حقیقت این علامت ها مانند یک جای خالی در پارامتر دوم است که پارامتر سوم و پارامتر های بعدی به ترتیب این جاهای خالی را پر میکنند.
در مثال بالا نیز یک جا خالی از نوع float با %f ایجاد شده است که پارامتر سوم یعنی temp آن را پر می کند.
حالا با دستور lcd_puts می توانیم خروجی را بر روی LCD نمایش دهیم .
lcd_puts(lcd_buff);
اما صبر کنید . ممکن است مشکلی در نمایش اعداد اعشاری روی LCD روی دهد و شما به جای %۴٫۲f تنها جای خالی روی LCD مشاهده کنید!
شاید بپرسید چرا این مشکل اتفاق می افتد اما پاسخ آن ساده و به تنظیمات کدویژن باز می گردد . زمانی که بخواهید اعداد اعشاری را از طریق sprintf به صورت متنی تبدیل کنید باید تنظیمات کدویژن را به صورت زیر تنظیم نمایید.
ابتدا از منوی project ، بر روی Configure کلیک کنید.


حالا در پنچره ای که باز شده با تب C Compiler بروید ، در این تب به صورت پیشفرض قسمت Code Generation را مشاهده می نمایید که در قسمت سمت چپ پنجره یکی از لیبل ها عبارت sprintf Features را نمایش می دهد و یک جعبه کشویی در زیر آن قرار دارد که مقدار پیشفرض آن int , width می باشد اما برای تبدیل اعداد اعشاری به متن توسط sprintf باید از جعبه کشویی گزینه float , width , precision را انتخاب کنیم.

با انجام این تنظیمات ، حالا پروژه شما آماده کامپایل و تست هست و به سادگی میتونید اعداد اعشاری رو در محیط کدویژن بر روی LCD نمایش بدید.
اگر بخواهید تنها عدد اعشاری رو به متن تبدیل کنید ، کافیه به شکل زیر عمل کنید.
sprintf(lcd_buff,”%4.2″,temp);
با انجام این کار عدد اعشاری temp به صورت متن در خواهد آمد و در قالب یک عدد ۴ رقمی شامل ۲ رقم صحیح و ۲ رقم اعشار داخل متغیر lcd_buff ( آرایه کارکتری ) ذخیره خواهد شد.



نظرات 2 + ارسال نظر
جواد چهارشنبه 26 خرداد 1400 ساعت 02:26

سلام و تشکر.برا atmega8 دوستان باید علاوه بر این کارها اون عدد RAM ر ا از 256 به 512 تغییر دهید.

سجاد پنج‌شنبه 15 تیر 1396 ساعت 14:44

سلام به کسایی که این مطلب رو نوشتن....
شاید باورتون نشه من کلی دنباله همین مطلبه اعداد اعشاری با %d یا %f و.... بودم ولی تا حالا اینقدر قشنگو روون کسی توضیح نداده بود...
واسه کسایی مثله من که تازه کارن خییییییلی حال می ده این مطالب. بازم ممنون و خدا بهتون همت بده تا بازم ازین مطالب بزارین.

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد