خانه > آموزش > آموزش شمارنده با استفاده از سون سگمنت و LCD کاراکتری با BASCOM AVR

آموزش شمارنده با استفاده از سون سگمنت و LCD کاراکتری با BASCOM AVR

دراین پروژه ساده می خواهیم با نحوه را اندازی سون سگمنت و LCD کاراکتری با استفاده از کامپایلر BASCOM آشنا شویم.

قطعات مورد نیاز:

میکروکنترلر ATmega32: 1عدد

up-down-counter-with-7segment-LCD-bascom-1

سون سگمنت کاتد مشترک: 2عدد

up-down-counter-with-7segment-LCD-bascom-2

Lcd کارکتری:1عدد

up-down-counter-with-7segment-LCD-bascom-3

مقاومت 10 کیلواهم: 2عدد

سوئیچ :2عدد

شرح عملکرد: دو عدد سوئیچ، عملکرد ورودی را برای این برنامه دارند یکی برای شمارش افزایشی(UP) و دیگری برای شمارش کاهشی(DOWN).  در ابتدا با وصل تغذیه میکرو یک پیغام اولیه روی lcd نمایش داده می شود. بعد از مدت کمی هم سون سگمنت و هم LCD مقدار صفر را نمایش می دهند.

با فشردن سوئیچ UP مقدار نمایش داده شده روی سون سگمنت و LCD یکی افزایش می یابد. و برعکس با فشردن سوئیچ DOWN مقدار شمارنده یکی کاهش می یابد.

سقف شمارش این شمارنده تا 30 می باشد. و همزمان با نمایش شمارش روی LCD یک بارگراف نیز روند افزایش کاهش را نمایش می دهد.

up-down-counter-with-7segment-LCD-bascom-4

مدار رسم شده در پروتئوس به صورت زیر است:

up-down-counter-with-7segment-LCD-bascom-5

نمایش بارگراف روی LCD کاراکتری

برای نمایش بارگراف از ابزار LCD Designer نرم افزار بسکام استفاده می کنیم. این ابزار برای نمایش کاراکترهای غیرمتعارفی که در صفحه کلید موجود نیستند به کارمی رود:

up-down-counter-with-7segment-LCD-bascom-6

با این ابزار 5 طرح مورد نیاز برای ایجاد بارگراف را به صورت زیر ایجاد می کنیم:

up-down-counter-with-7segment-LCD-bascom-7

با ایجاد این طرح ها و کلیک برروی ok کامپایلر بسکام به صورت اتوماتیک دستوری به صورت زیر ایجاد می کند:

که باید طبق پیامی که خود نرم افزار به صورت اتوماتیک تولید می کند علامت سوال را با عددی بین صفر تا هفت جایگزین کنیم: برای مثال دستور فوق مربوط به طرح شماره 1 می باشد که به جای علامت سوال عدد 0 را می گذاریم:

حال می توانیم در هر یک از خانه های LCD که مکان نما به آن اشاره می کند با استفاده از دستور LCD CHR(0) طرح 1 را ایجاد کنیم.(مثل خانه آخر در شکل 2 بالا.) حال باید ببینیم که برای هر شماره چه تعداد از خانه های LCD باید نمایش داده شوند.

برای LCD 2 در 16 هر سطر تعداد 16 خانه 5 در 7 دارد. یعنی هر سطر 5*16(80) ستون کوچک دارد. اگر مقدار شمارنده به 30 برسد همه این خانه ها لازم است که روشن شوند و در حالتی که این مقدار صفر باشد همه این خانه ها خاموش می شوند. برای اعداد دیگر چطور؟ ادامه مثال را با یک مثال توضیح می دهیم:

فرض کنید مقدار شمارنده 8 باشد. چه تعداد از این 80 خانه لازم است که روشن شوند؟ این محاسبه را در دو مرحله انجام می دهیم: مرحله اول تعداد خانه هایی از LCD را حساب می کنیم که باید به طور کامل(هر 5 ستون) روشن شوند. مرحله دوم : محاسبه تعداد خانه های کوچکی که لازم است در خانه آخر روشن شود(در شکل 2 این تعداد یکی از 5 تاست) مثلا در شکل 2 9 خانه به طور کامل روشن شده اند(مرحله1) و یک  خانه کوچک نیز در خانه آخر روشن شده است(مرحله 2).

مرحله یک:

مقدار شمارنده برابر 8 است.

با یک نسبت تناسب ساده counter را بر 30 تقسیم کرده و در 16 ضرب می کنیم تا مقدار 4.2667 را بدست می آوریم. با صرفنظر از مقدار اعشاری 4 بیانگر تعداد خانه هایی است که به طور کامل باید روشن شوند.

مرحله دو:

باقیمانده تقسیم مرحله یک را می یابیم:

up-down-counter-with-7segment-LCD-bascom-8

از این مقدار باقیمانده که بین صفر تا 29 می باشد برای یافتن تعداد خانه های کوچک که باید روشن شوند استفاده می کنیم. بازهم با یک تناسب ساده با توجه به اینکه اگر این باقیمانده به فرض محال برابر 30 باشد باعث روشن شدن هر 5 خانه می شود باقیمانده را تقسیم بر 30 و ضرب در 5 می کنیم که مقدار  1.3333 را بدست می آوریم که با صرفنظر از مقدار اعشاری 1 خانه کوچک نیز در خانه آخر باید روشن شود.

نمایش مقدار شمارنده روی سون سگمنت ها

برای نمایش مقدار شمارش شده همچنین از دو سون سگمنت نیز استفاده شده است. این دو سون سگمنت می توانند به طور جداگانه به دو پورت از میکرو متصل گردند اما این کار باعث به کارگیری دو پورت از میکرو می شوند که معقول و به صرفه نمی باشد.

راه بهتر استفاده از یک پورت مشترک برای هر دو سون سگمنت و اتصال پایه ی مشترک هر کدام به یکی از پین های خروجی دیجیتال میکرو(به جای زمین) جهت کنترل می باشد. به این صورت که برای نمایش روی هر سون سگمنت  پینی از میکرو که به پایه مشترک همان سون سگمنت متصل می باشد را صفر منطقی کرده و پایه مشترک سون سگمنت دیگر را یک می کنیم(تا چیزی نمایش ندهد) و مقدار مورد نظر که می خواهیم نمایش دهیم را روی پورت مشترک می ریزیم.

اما این کار زمانی کاربردیست که بخواهیم در یک لحظه فقط یک سون سگمنت مقداری را نمایش دهد. در این پروژه برای نمایش اعداد 0 تا 30 لازم است تا هردو سون سگمنت به طور همزمان مقداری را نمایش دهند. برای غلبه بر این مشکل نیز سون سگمنت ها را به ترتیب  و با سرعت بالا روشن و خاموش می کنیم که در هر لحظه فقط یکی از سون سگمنت ها مقداری را نمایش می دهند اما چون سرعت روشن و خاموش شدن زیاد می باشد برای چشم انسان قابل درک نیست.

حال برنامه نوشته شده را به طور خط به خط توضیح می دهیم:

در ابتدای برنامه حتما باید نوع میکروکنترلری که استفاده می کنیم را به کامپایلر بسکام معرفی کنیم. با این کار بسکام رجیسترها، فضای حافظه، سخت افزارهای میکرو را می شناسد و آنها را مدیریت می کند. برای مثال اگر میکرو را از نوع 32 معرفی کرده و بخواهید مثلا PORTE را به صورت خروجی پیکربندی کنید با پیغام خطا مواجه می شوید چون میکرو 32 فقط چهار پورتA،B،C و D دارد(امتحان کنید!) یا اینکه مثلا با انتخاب میکرو 32 چون 32 کیلوبایت فضا برای برنامه نویسی دارید در هر بار کامپایل کردن برنامه مقدار فعلی حافظه فلش مصرف شده را به شما اعلام می کند.

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

در این خط با استفاده از اپراتور  :  دو دستور را پشت سرهم نوشتیم. دستور اول پورت B را به عنوان خروجی تعریف می کند. این دستور معادل این است که هر 8 بیت رجیسترDDRB را یک منطقی کنیم. دستور بعدی برای رجیستر PORTB نام مستعار 7seg را انتخاب می کند و از این پس در هر جای از برنامه از کلمه 7seg استفاده کنیم گویی از PORTB استفاده کردیم. این کار باعث خوانایی بیشتر برنامه می شود و وقتی تعداد عناصر متصل به میکرو زیاد می شود استفاده از اسامی به طور هوشمندانه باعث کاهش احتمال اشتباهات می گردد. مثلا نام 7seg نشان می دهد که نمایشگر سون سگمنت قرار است به پورت B متصل گردد.

دستور اول PORTD را به عنوان ورودی تعریف می کند که معادل صفر کردن هر 8 بیت رجیستر جهت داده D می باشد. در دستورات بعدی نیز برای Pind.0 نام مستعار UP و برای pind.1 نام مستعار Down را انتخاب می کنیم. بدیهی است که به این پایه های میکرو، سوئیچ های شمارش افزایشی و کاهشی متصل شده است.

در این خط PORTA.7 به عنوان خروجی تعریف شده است و برای آن نام مستعار Control_right انتخاب شده است. این پایه به پایه مشترک سون سگمنت سمت راست باید رقم یکان را نمایش دهد متصل شده است. دستور زیر نیز همین کار را برای سون سگمنت چپ انجام می دهد:

دستورات زیر برای تعریف طرح های شماره 1 تا 5 می باشد:

دستورات زیر نیز برای تعریف متغیرهای مورد نیاز برای ذخیره داده های می باشد:

قابل ذکر است که با تعریف یک متغیر کامپایلر یک بخش از حافظه میکرو را با توجه به نوع متغیر برای آن در نظر می گیرد. مثلا با تعریف یک متغیر از نوع word کامپایلر دو بایت از حافظه RAM را به آن متغیر اختصاص می دهد. علاقه مندان(!) می توانند برای اینکه آدرس محل حافظه را متوجه بشوند که مثلا متغیر conter در کجا ذخیره شده است می توانند فایلی با پسوند rpt را که بعد از کامپایل کردن ایجاد می شود مشاهده کنند. این فایل اطلاعات خوبی به دست می دهد.

این دو دستور مربوط به پیکربندی نوع اتصالات lcd یعنی اینکه چه پایه ای از lcd به چه پایه ای از میکرو متصل می شود و دستور دوم ابعاد lcd را مشخص می کند.

در ابتدا قبل از ورود به حلقه اصلی lcd پاک می شود و مکان نما به سطر اول و ستون اول منتقل می شود(cls). با دستور Lcd “counter=” عبارت counter= روی lcd نمایش داده می شود و مکان نما به طور خودکار به سطر اول و ستون 9 منتقل می شود. با دستور Lcd Conter مقداری که در متغیر conter ذخیره شده(که در ابتدای برنامه صفر است) در محل فعلی مکان نما نمایش داده می شود(در حال حاضر عبارت counter=0 روی lcd نمایش داده می شود.) بعد از خاموش کردن مکان نما(Cursor Off) وارد حلقه اصلی برنامه(do……..loop)  می شویم. از این پس میکرو به طور مداوم دستورات داخل این حلقه را اجرا می کند.

در ابتدا فرض می کنیم که هیچ کدام از دو سوئیچ فشرده نشده اند.

تابع mod باقیمانده تقسیم را می دهد. فرض کنید اگر مقدار شمارنده(conter)  برابر 16 باشد باقیمانده تقسیم آن بر 10 مقدار 6 می شود یعنی عددی که سون سگمنت راست باید نمایش دهد. همچنین از تقسیم شمارنده بر 10 نیز عددی که شمارنده چپ باید نمایش داده شود بدست می آید.(چون متغیر ها از نوع بایت و کلمه هستند تقسیم صحیح انجام می شود و قسمت اعشاری حذف می شود)

دستور lookup به برچسب lable پرش کرده و  از جدول مربوطه مقدار مورد نظر را بر می گرداند.  مثلا اگر مثال شمارنده برابر 16 را در نظر بگیریم مقدار  left_digit برابر 1 می شود. در این صورت دستور فوق مقدار یکمین داده در جدول lable را که مقدار &H06 می باشد برمیگرداند(&H3F صفرمین داده می باشد) و آنرا برابر 7seg که خود نام مستعار Portb می باشد قرار می دهد. مقدار &H06 در مبنای باینری به صورت &B00000110 می شود که موجب می شود پورت b به صورت زیر صفر و یک شود:

up-down-counter-with-7segment-LCD-bascom-9

حال اگر PB1و PB2 به سگمنت های B وC متصل شده باشند سون سگمنت ها قابلیت نمایش عدد یک را دارند.

up-down-counter-with-7segment-LCD-bascom-10

اما کدام سون سگمنت؟

این دو دستور تعیین می کنند که کدام سون سگمنت مقدار ریخته شده در پورت b را نمایش دهد چون سون سگمنت از نوع کاتد مشترک می باشد و پین مشترک مربوط به سون سگمنت راست یک و سون سگمت چپ صفر شده است پس این مقدار توسط سون سگمنت چپ نمایش می دهد.

دستور اول یک مکث 1 میلی ثانیه ای ایجاد می کند که برای چشم انسان قابل تشخیص نمی دهد. بعد بیت کنترل هر دو سون سگمنت 1 می شود تا هر دو سون سگمنت غیرفعال شوند بهد مقداری که قرار است توسط سون سگمنت راست نمایش داده شود روی پورت B ریخته می شود. اگر قبل از اینکار بیت کنترل هر دو سون سگمنت را یک نمی کردیم برای یک لحظه عدد سون سگمنت راست را سون سگمنت چپ هم نمایش می داد(دقت شود!!) دستورات بعدی که واضح به نظر می رسند!!

حال اگر هیچ سوئیچی فشار داده نشوند شرط های مربوط به دستورات شرطی غلط بوده و فقط همین دستورات به صورت مداوم اجرا می شوند.

حال فرض کنید مثلا سویئچ up فشار داده شود. در اینصورت شرط :

درست بوده و دستورات داخل آن اجرا می شوند.

همانطور که از این دستورات مشخص است ابتدا conter یکی اضافه می شود و بعد چک می شود که اگر شمارش به 30 رسید به صفر برگردد. خوب حالا اگه گفتین الان رو lcd چی نوشته؟ احسنت الان نوشتهcounter=0. حال باید چی کار کنیم؟ باید چیزی که نوشته رو پاک کنیم و بنویسیم counter=1.

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

مکان نما به سطر دوم می رود.

شمارنده در 16 ضرب و  بر 30 تقسیم می شود تا تعداد خانه های کامل به دست آید. این تعداد در متغیر Temp1 ذخیره می شود.

باقیمانده تقسیم در 5 ضرب و بر 30 تقسیم می شود. تعداد خانه های کوچک هم در متغیر Temp4 ذخیره می شود.

با یک حلقه که شمارنده آن از یک تا Temp1 می شمارد به تعداد Temp1 تا خانه بزرگ را پر می کنیم. و مکان نما به طور اتوماتیک به Temp1+1 می رود. حالا در خانه آخر به تعداد خانه های کوچک پر می کنیم.

امیدوارم این آموزش برای شما مفید بوده باشد.

سوالات و نظرات خود را در قسمت پایین می توانید ارسال نمایید.

موفق و پیروز باشد.

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

یک دیدگاه

  1. سلام خسته نباشید
    چجوری میتونم با همین ic اما با یکدونه ۷segment مدار فوق رو درست کرد

پاسخ دهید

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