سون سگمنت را با میکروکنترلر AVR چگونه راه اندازی کنیم؟
![](https://nirasystem.com/blog/wp-content/uploads/2021/05/photo_2021-05-19_14-16-09.jpg)
بسیاری از مواقع احتیاج داریم اطلاعاتی که حین اجرای برنامه نیاز به دیدنشون داریم رو روی یک نمایشگری نشونش بدیم . حالا اون نمایشگر میتونه خیلی چیزا باشه ! “سون سگمنت” یکی از ابزار متداول ترین ابزار برای این کاره که عموما اعداد رو میایم روش نمایش میدیم.
(البته میتونیم با گذاشتن اونا کنار هم یک کلمه رو هم بسازیم . خودتون بعضی جاها دیدید!)
* حالا این سون سگمنت چیه ؟
هفت تا ” LED ” در کنار هم گذاشته شده و بهش گفتن “هفت قسمتی” یا “۷segment” .
دیود های نورانی یا LED ها چون جای کمی میگیرن در این نمایشگر ازشون استفاده شده !
دیود هارو تقریبا همه میدونید چجوری کار میکنن . اونا یک پایه آند(ANODE) دارند و یک پایه (CATHODE).
اگه ولتاژ آند از کاتد بیشتر باشه دیود اصطلاحا “هدایت” میکنه.
بیشتر بخوانید : دیود
پس الان یک چیزایی مشخص شد ، اینکه توی سون سگمنتا دیودا به دو شکل میتونن قرار بگیرن پس ما دو نوع سون سگمنت داریم !
آند مشترک(Common anode) و کاتد مشترک (Common cathode) .
اول شماتیک یک سون سگمنتو ببینیم :
این نوع کاتد مشترکش هست ، همونجور که مشخصه پایه های کاتد همگی به زمین وصلن
پس کافیه ما به ورودیامون یک ولتاژی رو بیشتر از صفر اعمال کنیم تا دیود هدایت کنه
( حالا اینجا چون توضیحات ما با میکرو avr هست این ولتاژ ورودی ۵ ولته یا اصلاحا “یک منطقی”هست).
نوع آند مشترک هم که با معکوس کردن جملات بالایی من مشخص میشه ، سر های آند به ۵ ولت وصلن و کافیه ما به ورودی ها صفر اعمال کنیم !
* بررسی truth table و ورودی به سون سگمنت در ۲ نوع آند و کاتد مشترک
طبق شکل ما هفت پایه ورودی به ۷سگمنت داریم ، پس هفت پایه میکرو رو هم میخوایم ( من دارم با mega16 توضیحات رو میدم) .
این سون سگمنت تک بیتی هست ، در چند بیتی ها تعداد ورودی ها فرقی نمیکنه فقط پایه آند مشترک یا کاتد مشترک به ازای هر بیت اضافه میشه.
قبل نوشتن کد یک جدولی رو هم برای ورودیا بررسی کنیم که وضعیت صفر و یک هارو برای هر عدد ببینیم :
این یک truth table برای نوع کاتد مشترک هست .
برای آند مشترک کافیه جای صفر و یک هارو عوض بکنیم.
وارد محیط کد ویژن بشیم :
اول بیایم به ساده و مبتدی ترین شکل ممکن عدد صفر رو نمایش بدیم :
توضیح راجب این کد :
خب اولش کتابخونه های مورد نیازمونو میایم تعریف میکنیم توی برنامه .
من PORTC رو برای ورودی های نمایشگر انتخاب کردم و با دستور DDR اونارو خروجی کردم و بعد مقدار اولیه پورت رو صفر کردم بعد دونه دونه مقادیر پورت رو بهش دادم :/
این کار فکر نکنم اصلا عاقلانه باشه !
این اعداد رو پشت سر هم اگر بنویسیم همون ۰۰۱۱۱۱۱۱ یا 0x3F . پس اگه من بنویسم PORTC = 0x3F کارمون راحتتر میشه تقریبا !
حالا طبق truth table بیایم همه اعداد رو به شکل هگز بنویسیم و یک ثانیه یک ثانیه بالا بریم تا به عدد ۹ برسیم و دوباره از اول بشمریم :
دقت کنید که با دستور delay_ms من تاخیر های ۱ ثانیه ای ایجاد کردم بین هر عدد . باید اول برنامه کتابخانه delay.h رو تعریف بکنید.
بازم اینکار عاقلانه نیست . بهتره که تمام این هگز هارو داخل یک آرایه تعریف کنیم و اون هارو با یک for ساده به PORTC اعمال کنیم :
یک آرایه تعریف شد که تمام هگز ها درونش وجود داره و با یک for هر ۱ ثانیه اون هارو روی PORTC اعمال میکنیم ?
لینک همین برنامه ای که نوشتم(آخری) : ۷segment
برای یادگیری غیر حضوری زبان برنامه نویسی Embedded c مقدماتی میتونید اینجا کلیک کنید.
نمیشد انقد پایه از میکرو رو استفاده نکنیم؟؟؟؟
بله میشه ! با استفاده از آی سی های شیفت رجیستر و bcd to seven segment
مثل SN74LS47 و ۷۴HC595
دیتاشیت SN74LS47
دیتاشیت ۷۴hc595
با این آی سی ها میتونید توی استفاده از پایه های میکروتون صرفه جویی بکنید!
موفق باشید.