خانه > آموزش > کاربرد define# در برنامه نویسی میکروکنترلرها

کاربرد define# در برنامه نویسی میکروکنترلرها

یکی از دستورالعمل های پیش پردازنده پرکاربرد در زبان برنامه نویسی c دستورالعمل define# می باشد. دستورالعمل پیش پردازنده define# در زبان برنامه نویسی c معمولا برای تعریف ثوابت به کار می روند. کاربردهای این دستور را با ذکر یک مثال شرح می دهیم. فرض کنید می خواهیم برنامه ای بنویسیم که شعاع دایره را از کاربر گرفته و محیط و مساحت آن را در خروجی چاپ کند. برنامه ساده زیر این کار را انجام می دهد:

در این مثال دقت عدد π را تا دو رقم اعشار در نظر گرفتیم. حال اگر بخواهیم این دقت را تا 4 رقم افزایش دهیم باید چه کار کنیم؟ طبیعی است باید تمام 3.14ها را در برنامه پیدا کرده و با 3.1415 جایگزین نماییم. کار مشکلی نیست. حال اگر برنامه ساده ما تبدیل به یک برنامه مثلا 1000 خطی شود که در 20 جای آن از عدد  π استفاده کرده باشیم چطور؟ اینجا کار کمی سخت تر می شود! اما با استفاده از دستورالعمل پیش پردازنده define# این کار خیلی ساده می شود.

نحوه استفاده از define# :

استفاده از define#  خیلی ساده است! با استفاده از define# شما برای 3.14 یک اسم انتخاب می کنید و در داخل برنامه به جای خود 3.14 از اسم آن استفاده می کنید. انتخاب اسم دلخواه است. PI مناسب ترین اسم برای π می باشد! خیلی ساده:

با استفاده از این دستور برنامه قبلی را می توان به صورت زیر نوشت:

مزیت این برنامه این است که برای تغییر 3.14 کافیست فقط تعریف آن را در خط  define# عوض کنیم. دقت کنید که define# دستور نیست بنابراین نباید بعد از آن از سمی کالن(;) استفاده کرد. define# یک دستورالعمل پیش پردازنده است یعنی قبل از پردازش برنامه کامپایلر تمام PIهایی که در برنامه وجود دارند را با 3.14 جایگزین کرده و بعد برنامه را کامپایل می کند.

کاربرد define# در برنامه نویسی میکروکنترلرها:

مزیت define# در برنامه نویسی میکروکنترلرها فراتر از برنامه نویسی C معمولی است به طوری که به جرات می توان گفت هیچ برنامه پیشرفته میکروکنترلری را نمی توان یافت که در آن از define# استفاده نشده باشد. برای نشان دادن مزیت های define# در برنامه نویسی میکروکنترلرها باز هم از مثال استفاده می کنیم. مثال زیر را که در مطلب کنترل LED توسط سوئیچ با LPC1768 توضیح داده شد در نظر می گیریم:

در این برنامه با استفاده از یک سوئیچ که به پایه p1.8 متصل شده است یک LED که به پایه P1.29 متصل شده است را کنترل می کنیم به این صورت که با هر بار فشردن سوئیچ وضعیت LED معکوس می گردد. این برنامه به درستی کار می کند اما دچار برخی مشکلاتی است که به آن اشاره می کنیم:

1- برنامه فوق در اصطلاح خیلی خوانا نیست. یعنی چی؟! یعنی اگر کسی به این برنامه نگاه کند نمی فهمد مثلا در دستور

که وضعیت پایه P1.8 را چک می کنیم به این پایه چه چیزی وصل شده است؟ سوئیچ؟ سنسور؟ یا چیز دیگر(البته دقت کنید که در اینجا برنامه دارای توضیحات است اما همه برنامه ها که توضیح ندارند!). همین طور در دستور

که وضعیت پایه P1.29 را معکوس می کنیم به این پایه خروجی، رله وصل شده است یا موتور یا LED یا چیز دیگر؟

2- گاهی اوقات که روند نوشتن یک برنامه عملی مدت زمان طولانی طول می کشد(مثلا چند ماه) خود برنامه نویس هم در این بین فراموش می کند که سخت افزارهای مختلف به کجا وصل شده اند و یادآوری این مسئله با مراجعه مکرر به شماتیک امکان پذیر می شود.

3-یا حتی در حین برنامه نویسی فرض کنید در یک خط از برنامه بخواهیم برای مثال LED را روشن کنیم. برای این کار ابتدا باید به شماتیک مراجعه کرده تا ببینیم LED به کدام پایه متصل شده است بعد از آن، آن پایه را 1 منطقی کنیم.

4- گاهی اوقات در حین برنامه نویسی لازم می شود که اتصالات سخت افزاری تغییر کنند. برای مثال فرض کنید در یک پروژه 6 ماهه بعد از 3 ماه برنامه نویسی متوجه می شویم که باید یک LED به سخت افزار ما اضافه شود(مثال LED برای درک راحت تر مطلب است!) در این صورت بنا به ملاحظات سخت افزاری لازم می شود تا پایه ای که به LED قبلی متصل بوده تغییر کند(مثلا با این کار برد مدار چاپی پروژه ساده تر می شود). وقتی سخت افزار تغییر می کند طبیعی است که باید برنامه هم متناسب با آن تغییر کند. برای این کار باید در کل برنامه به دنبال خط هایی بگردیم که وضعیت LED قبلی را تغییر داده ایم و آن خطوط را اصلاح نماییم.

با استفاده از define# می توان از این مشکلات را حل نمود. برای مثال برنامه فوق را می توان به صورت زیر نیز نوشت:

با این برنامه اگر LED به جای پایه 29 از پورت 1 به پایه 2 وصل شود فقط کافیست خط define# مربوط به LED را تغییر دهیم. اما اگر بخواهیم به پورت دیگری مثلا پورت 2 وصل کنیم باید بازهم برگردیم و در خطوط مربوط به LED و LPC_GPIO1->FIOPIN را با LPC_GPIO2->FIOPIN جایگزین نماییم(یعنی مشکل 4 به طور کامل حل نشده است). برای جلوگیری از این مشکل می توانیم برنامه را به صورت زیر اصلاح نماییم:

با این کار هم برنامه بسیار خوانا می شود و هم اینکه هر تغییری بخواهیم در محل اتصالات سخت افزار انجام دهیم کافیست در خطوط ابتدایی define# ها را تغییر دهیم.

دقت کنید که با نگاه کردن به define# هایی که در ابتدای برنامه صورت گرفته می توان درک خوبی از سخت افزارهای مورد استفاده و نحوه اتصال آن ها به میکرو پیدا کرد.

امیدواریم این مطلب جهت روشن شدن کاربردdefine# در برنامه نویسی میکروکنترلرها مفید بوده باشد.

موفق باشید.

درباره ی مدیر سایت

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *