بازدیدها: 4156
همانطور که قول داده بودم یه ماشین حساب ساده به زبان سی C با میکروکنترلر AVR و کامپایلر CodeVisionAVR V2.04.4a نوشتم نسبت به زبان بیسیک کمی پیچیده و بیشتر شده اما من طوری نوشتم که اگر از خط اول شروع به خوندن کنید تا آخر متوجه خواهید شد که من چه کردم.
این ماشین حساب قادر است است تا عملیات های (OP) جمع، ضرب، تقسیم، تفریق، جذر و درصد را انجام دهید همچنین دارای یک حافظه برای ذخیره کردن جواب می باشد و یک کلید برای پاک کردن این حافظه و کلید On/c برای صفر کردن ماشین حساب.
من برای برنامه را به سه قسمت تقسیم کردم و هر کدام در داخل یک فایل جداگانه نوشته شده است که این کار باعث می شود شما دچار سردرگمی نشوید و به راحتی به تحلیل برنامه بپردازید. نکته: برنامه به گونه ای نوشته شده که به راحتی می توانید توابع عملیاتی دیگری مانند sin,cos… به آن اضافه کنید. توضیح فایل ها:
فایل اصلی برنامه calculator-avr-c.c :
این فایل C که توسط خود کامپایلر ایجاده شده و من برنامه های عملیاتی و پیکره بندی میکرو رو توی اون نوشتم. ابتدا توابع کتابخانه ای و سایر تنظیمات توی اون نوشه شده و دو فایل الحاقی دیگر (هدر) نیز به برنامه اصلی اضافه شده تا کامپایلر متوجه شود که ما سایر دستورات مربوط به پروژه را در این دو فایل دیگر نوشته ایم که در ادامه توضیح خواهیم داد.
در ابتدا یک سری متغیر به صورت سراسری تعریف کردم تا بتوانیم از آنها در سایر توابع نیز استفاده کنیم. متغیر a برای دخیره کردن عدد اولی استفاده شده و متغیر b برای ذخیره کردن عدد دومی و از متغیر ans هم برای ذخیره کردن نتیجه نهایی استفاده شده. توابع display1 تا display4 وظیفه آنها نمایش اطلاعات به گونه های مختلفی روی LCD می باشد.
تابع equal :
اگر بعد از وارد کردن عدد اولی بلافاصله کلید = را بزنید این تابع اجرا شده و متغیر ans برابر a خواهد شد و روی LCD نمایش داده خواهد شد.
تابع may_error :
زمانی که نتیجه یک عملیات بی نهایت شود از این تابع برای نمایش این پیغام خطا استفاده شده.
تابع clear_var :
از این تابع برای صفر کردن متغیر های اصلی و همچنین پاک کردن LCD و آماده کردن آن می باشد. نکته کد 0x0f که در دیتاشیت LCD ها هم موجود می باشد باعث چشمک زدن نویسه می شود.
تابع calculat_add :
در این تابع مجدد یک بار دیگر برای دریافت عدد دوم از کاربر تابع input_digit فراخوانی شده و بعد a,b با هم جمع شده و نتیجه آن روی LCD نمایش داده می شود.
تابع calculat_min و calculat_mul و calculat_div :
این سه تابع عملکردی مشابه تابع جمع دارد که فقط در تابع تقسیم برای زمانی که b=0 می شود یه شرط گذاشتیم تا خطای بی نهایت را نمایش بدهد.
تابع calculat_squ :
این تابع از متغییر a در صورتی که منفی نباشد جذر خواهد گرفت و نتیجه نمایش داده خواهد شد. نکته کد 0xE8 برای نمایش علامت جذر می باشد. (دیتاشیت lcd)
تابع inc_memory و dec_memory:
از این تابع برای ذخیره محاسبه در در متغییر M استفاده شده که متغیر M با مقدار جدید جمع خواهد شد. و تابع dec همین کار را نجام می دهید با این تفاوت که به جای جمع تفریق خواهد شد.
تابع calculat_percent :
از این تابع برای گرفتن درصد استفاده شده به این صورت که با نوشتن 2%50 میکرو 2 درصد عدد 50 را گرفته و روی lcd نمایش می دهد.
تابع memory_clear:
از این تابع برای پاک کردن متغییر سراسری M که بع عنوان حافظه استفاده شده.
تابع main :
تابع اصلی برنامه که در آن lcd به صورت ستون 20 تایی پیکره بندی شده و تابع صفر کردن فراخوانی می شود و در نهایت وارد حلقه بی نهایت شده که در این حلقه ابتدا عدد اولی a همراه با نوع عملیات op از کیبورد دریافت شده و با استفاده از دستور switch نوع عمل تشخیص داده می شود و یکی از توابع بالا فراخوانی می شود. برای محاسبه بعدی در انتها op=0 خواهد شد.
فایل inputNum.h :
وظیفه دستوارت نوشته شده در این فایل الحاقی این است که اعداد را به صورت تک رقمی از کیبورد دریافت نماید و درون آرایه ذخیره کرده و در آخر این ارقام را به صورت یک عدد صحیح integer تبدیل کرده و درون متغییر n قرار دهد و در نهایت این متغییر را برگشت دهد. در این فایل الحاقی تابع input_digit از نوع برگشتی تعریف شده که دستورات آن را در ادامه توضیح می دهیم:
در این قسمت متغییر های سراسری تعریف شده در فایل C که در این تابع مورد نیاز می باشند دوباره نوشته می شوند. (دلیل این کار این است که تابع در یک فایل هدر می باشد)
درون تابع یک سری متغییر محلی تعریف تعریف کرده ایم که در زیر وظیفه هر کدام را شرح خواهیم داد:
از دستور if(op) lcd_putchar(op); برای گرفتن عدد دوم استفاده شده که در صورتی op داشته باشیم آن op روی lcd نمایش داده می شود. در ادامه lable داریم که از این برچسب صرفا برای گرفتن قسمت اعشاری عدد مورد نظر استفاده شده. متغییرهای مورد نیاز برای گرفتن عدد صفر می شود و وارد حلقه بی نهایت شرطی می شویم.
شرط این حلقه مخالت با op است یعنی تا زمانی که ما op=0 داریم در حلقه ماندگاریم و به محضی که یکی از کلید های عملیاتی فشار داده شوند op دراری یک مقدار خواهد شد و شرط این حلقه از بین خواهد رفت و منجر به خروج از آن خواهد شد. ابتدا تابع keypad فراخوانی شده و مقدار کلید فشار داده شده مورد سنجش قرار خواهد گرفت اگر key اعداد 0 تا 9 بود با توجه به مقدار متغییر count رقم مورد نظر درون آریه قرار می گیرد و برای مرحله بعدی یک واحد به count اضافه می شود و مقدار count در count2 برای مراحل پایانی کپی می شود. در صورتی که اعداد 0 تا 9 نباشد مطمئنا یکی از کلید های عملیاتی فشار داده شده است پس این عمل در متغییر مربوطه op قرار می گیرد.
در صورتی که کلید +- فشرده شده باشد neg=1 می کنیم و op را صفر می کنیم تا همچنان شرط حلقه برقرار باشد و عدد را دریافت کنیم و همچنین علامت – نمایش داده شود. برای کلید اعشاری هم همین وضعیت را داریم.
در پایان بعد از خروج از حلقه از متغییر count در صورتی که صفر نباشد یک واحد کم می شود و یک کپی از آن را هم در t قرار می دهیم. حالا با استفاده از یک حلقه شمارشی for آرایه ارقام را به هم چسبانده و درون متغییر n قرار می دهیم که در آن i از صفر شروع شده و تا t ادامه می یابد با استفاده از قانون ضرب ارقام و جمع آنها با هم ارقام تکی تکی را به یک عدد صحیح تبدیل می کنیم.
در صورتی که ashar=1 شده باشد شرط if برقرار می شود و دوباره عدد 2 را به ashar نسبت می دهیم و به طور موقت مقدار صحیح را در n2 ذخیره کرده و به آدرس lable پرش می کند تا این بار مقدار ارقام اعداد اعشاری را دریافت کند و در آخر چون ما قبلا ashar=2 کردیم این بار شرط if مربوطه برقرا شده و با توجه به آخرین مقدار متغییر i ما n را بر ضریبی که توسط i تعیین می شود تقسیم می کنم و تا قسمت اعشاری بدست آید و حالا با n2 قبلا مقدار صحیح در آن بود جمع می کنیم و تا عدد اعشاری ورودی ما ایجاد شود و در نهایت در n کپی می کنیم تا برگشت داده شود.
در صورتی که مقدار count2=0 باشد یعنی اینکه تنها یکی از کلید های عملیاتی فشرده شده پس جواب آخرین محاسبه که در ans می باشد به عنوان عدد اولی در a قرار می گیرد و رشته Ans نیز روی نمایشگر نشان داده می شود.
فایل Keypad.h:
در این فایل دستوراتی نوشته شده که وظیفه آنها اسکن پورت و خواندن کلید فشرده شده می باشد که توضیحات آن را در صفحه کلید 4×4 داده ایم در زیر در قسمت مطالب مرتبط آورده شده که می تواند با مراجعه به این مطلب نحوی کار آن را بخوانید. دراینجا تنها تفاوتی که داریم این است که کیبورد ما از 16 کلید به 24 کلید افزایش داده شده و با اعمال تغییرات کوچک در آن که بیشتر اعداد 4 به 6 جایگزین شده است.
با تشکر فراوان سید محسن قاسمیان
ورژن نرم افزار ها: CodeVisionAVR V2.04.4a و Proteus 7.7 sp2 Professional
2 Comments
سلام وقت بخیر رمز فایل چیه؟
www.picpars.com