راه اندازی سون سگمنت چهار رقمی با میکروکنترلر AVR

راه اندازی سون سگمنت چهار رقمی با میکروکنترلر AVR

راه‌های زیادی برای کنترل یک نمایشگر سون‌سگمنت وجود دارد، ازجمله استفاده از یک آی‌سی شیفت رجیستر که به پایه‌های زیادی نیاز ندارد. همچنین می‌توان سگمنت‌ها را مستقیماً از پایه‌های میکروکنترلر کنترل کرد، به طوری‌که هر رقم (digit) با استفاده از یک ترانزیستور کنترل می‌شود. در ابتدای این آموزش به معرفی نمایشگر‌های سون‌سگمنت و انواع آن‌ها می‌پردازیم. پس از آن با راه اندازی سون سگمنت چهار رقمی با میکروکنترلر AVR آشنا می‌شویم. در نهایت با یک برنامه‌ی نمایش ساعت دیجیتال این آموزش را به پایان می‌رسانیم.

دیود نورافشان (LED) چیست؟

دیودهای ساطع کننده نور یا دیودهای نورافشان (LED) از پرکاربردترین نیمه هادی‌ها هستند که نور مرئی یا نور مادون قرمزِ نامرئی را هنگام بایاس مستقیم منتشر می‌کنند. دیود نورافشان یک ابزار بصری است که در صورت اعمال ولتاژ، انرژی الکتریکی را به انرژی نوری تبدیل می‌کند.

دیود نور افشان (LED) و شماتیک آن برای تعیین پایه‌ها

نمایشگر سون سگمنت چیست؟

نمایشگرهای سون‌سگمنت نوعی دستگاه نمایشگر خروجی هستند که اطلاعات را به صورت عکس، متن یا اعداد دسیمال نمایش می‌دهند و جایگزینی برای نمایشگرهای پیچیده‌­ی دات ماتریس به شمار می‌روند. این نمایشگرها به طور گسترده در ساعت‌های دیجیتال، ماشین‌حساب‌های ساده، مترهای اندازه‌گیری دیجیتال و سایر دستگاه‌های الکترونیکی که اطلاعات را به صورت عدد نمایش می‌دهند، به کار می‌روند. یک نمایشگر سون سگمنت متشکل از هفت دیود نورافشان (LED) است که هرکدام یک سگمنت نامیده می­شود و با حروف a تا g مشخص می‌شوند. نحوه­ی قرارگیری آن­‌ها کنارهم به گونه‌­ای است که ظاهری مانند عدد 8 انگلیسی دارند. گاهی اوقات از دیود نورافشان دیگری نيز برای نمايش ممیز اعشار استفاده می‌شود.

ساختار سگمنت‌های داخلی یک نمایشگر سون سگمنت

عملکرد نمایشگرهای سون سگمنت

با توجه به عدد دسیمالی که می­‌خواهیم روی سون‌سگمنت نشان دهیم، باید مجموعه مشخصی از سگمنت­‌ها را با هم روشن کنیم. برای مثال وقتی تمام سگمنت­‌ها را روشن کنیم، عدد 8 نمایش داده می­‌شود و اگر سگمنت ‘g’ را خاموش کنیم، عدد 0 نمایش داده می‌­شود. به این ترتیب با اعمال ولتاژ به صورت همزمان به پایه­‌های مختلف یک سون­ سگمنت، می­‌توانیم ارقام 0 تا 9 را طبق شکل زیر نمایش دهیم. علاوه‌­براین، می­‌توان حروف الفبای A، B، C، D، E و F را نیز با این نمایشگر نمایش داد.

نحوه نمایش اعداد مختلف پس از راه اندازی سون سگمنت

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

جدول صحت مقادیر باینری و هگزا برای نمایش حروف مختلف

بنابراین، اصطلاح Boolean برای هر رقم دسیمال که متناظر با دیودهای نورافشان مشخصی است، ON یا OFF می­باشد. تعداد سگمنت‌هایی که برای نمایش هر یک از ارقام 0، 1، 2، 3، 4، 5، 6، 7، 8 و 9 باید روشن شوند به ترتیب 6، 2، 5، 5، 4، 5، 6، 3، 7، و 6 سگمنت است. نمایشگرهای سون‌سگمنت باید توسط سایر دستگاه‌های خارجی مانند سوئیچ‌، صفحه‌کلید و حافظه کنترل ­شوند و میکروکنترلرهای مختلف نیز برای برقراری ارتباط با این دستگاه‌های خارجی به کار می‌روند.

انواع نمایشگرهای سون سگمنت

با توجه به نوع کاربرد، دو نوع نمایشگر سون‌سگمنت وجود دارد: آند مشترک و کاتد مشترک، قبل از راه اندازی سون سگمنت باید با آن‌ها آشنا باشید:

  • در نمایشگرهای سون‌سگمنت کاتد مشترک، پایه­­ کاتد همه‌ی ال­‌ای‌دی‌ها به یکدیگر و به منطق صفر یا زمین متصل ‌است. در این نوع نمایشگرها به منظور بایاس مستقیم ال‌ای‌دی‌ها، کافی­ است منطق یک را از طریق یک مقاومت محدودکننده جریان به پایه­ آند هر یک از سگمنت‌های a تا g اعمال کنیم.
نحوه عملکرد سون سگمنت کاتد مشترک

  • در نمایشگر سون‌سگمنت آند مشترک پایه­­‌ی آند همه­‌ی ال‌ای‌دی‌ها به یک‌دیگر و به منطق یک متصل‌ است. کافی­ است صفر منطقی را از طریق مقاومت محدودکننده جریان به پایه­ کاتد هر یک از سگمنت‌­های a تا g اعمال کنیم.
نحوه عمکلرد سون سگمنت آند مشترک


به‌طور كلی، استفاده از سون­سگمنت‌های آند مشترک متداول‌تر‌ است، زيرا اكثرا مدارات منطقی بيشتر از آن كه جريان الكتريكی را تأمین کنند، مصرف کننده هستند.

نکته‌ای که باید به یاد داشته باشید این است که یک سون­سگمنت‌ آند مشترک را به لحاظ سخت افزاری نمی‌توانید مستقيماً جایگزین یک سون­سگمنت كاتد مشترک کنید. اين كار دقیقاً مانند آن است كه يک ال‌ای‌دی را به‌صورت معكوس در مدار قرار دهیم که با این کار مسلماً ال‌ای‌دی‌­ روشن نخواهد شد!

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

از جمله کاربردهای متداول نمایشگرهای سون‌سگمنت می‌­توان به موارد زیر اشاره کرد:

  1. ساعت‌های دیجیتال
  2. رادیوهای ساعت‌دار
  3. ماشین‌حساب‌ها
  4. ساعت مچی‌ها
  5. سرعت‌سنج‌ها
  6. کیلومترشمار وسائل نقلیه موتوری
  7. فرکانس‌­مترهای دیجیتال

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

با یک نمایشگر سون‌سگمنت چهار رقمی حداکثر عدد قابل نمایش 9999 است. در شکل 7 می‌توانید اتصالات الکتریکی داخلی یک نمایشگر سون‌سگمنت 4 رقمی معمولی را مشاهده کنید. هر رقم از 7 سگمنت (ال‌ای‌دی) به علاوه‌­ی یک سگمنت مربوط به ممیز اعشار تشکیل شده­‌است. برخی از نمایشگرها دارای دو نقطه ‘:’ هستند که برای نمایش ساعت به کار می­‌رود. در این شکل اولین مدار، نمایشگر نوع آند مشترک را نشان می‌دهد و مدار زیرین آن یک نمایشگر کاتد مشترک است.

قابل توجه است که در سون ­سگمنت­‌های چند رقمی، تمام سگمنت‌های یک رقم به سگمنت‌های رقم­‌های دیگر متصل‌ است. برای مثال اگر می­‌خواستیم عدد 9 را روی رقم اول نمایش دهیم، این عدد در هر 3 رقم دیگر نیز نشان داده می‌­شد. به همین دلیل نمایشگرهای سون‌سگمنت چند رقمی مالتی‌پلکس شده­‌اند؛ به این معنی که در هر لحظه تنها یک رقم روشن می‌­شود و سایر ارقام خاموش خواهند بود. به این ترتیب اعداد هر رقم با سرعت بالا پشت سرهم نمایش داده می­شوند و به نظر می­‌رسد همه‌­ی ارقام همزمان روشن می­‌شوند. به عنوان مثال، همانطورکه در شکل 7 مشاهده می­‌کنید، هر یک از ارقام این سون ­سگمنت 4 رقمی از طریق پایه‌­های 6، 8، 9 و 12 قابل دسترس‌­اند و با استفاده از آن‌­ها می‌­توانید رقم مربوطه را خاموش و روشن کنید.

مدار معادل داخلی یک نمایشگر سون‌سگمنت
شکل 7: مدار معادل داخلی یک نمایشگر سون‌سگمنت طبق دیتاشیت OPD-Q5621LE-BW

راه اندازی سون سگمنت با میکروکنترلر AVR

برای راه اندازی سون سگمنت در این آموزش از سخت‌­افزارهای زیر استفاده شده­‌است، شما می‌توانید متناسب با پروژه­‌ی خود از سخت­‌افزارهای دیگری استفاده کنید.

سخت­‌افزارهای مورد نیاز جهت راه اندازی سون سگمنت

  • 1 عدد سون­ سگمنت چهار رقمی OPD-Q5621LE
  • ا عدد میکروکنترلر ATmega88PB-AU
  • 4 عدد ماسفت NX7002AK
  • 8 عدد مقاومت 150 اهم
  • 1 عدد مقاومت 1 کیلواهم

اتصال یک سون‌ سگمنت چهار رقمی به میکروکنترلر ATMEGA8

برای اتصال یک سون­‌سگمنت 4 رقمی به میکروکنترلر ATMEGA8 ، مطابق شماتیک نمایش داده شده در شکل 8، هشت پایه از میکروکنترلر (پورت D) برای کنترل 7 سگمنت a تا g و نیز سگمنت مربوط به ممیز اعشار (DP) و چهار پایه دیگر میکروکنترلر (پورت C) برای انتخاب اینکه کدام رقم فعال شود، استفاده شده­‌است. صرف‌نظر از اینکه نمایشگر چند رقم داشته باشد، تعداد پایه‌های میکروکنترلر که مورد استفاده قرار می‌گیرد، یکسان خواهد بود، فقط پایه‌های انتخاب ارقام، تغییر می­‌کند. برای مثال برای نمایش 2 رقم به 8 + 2 پایه و برای نمایش 4 رقم به 8 + 4 پایه نیاز داریم.

توجه داشته باشید که باید تمام پایه­‌های سون‌­سگمنت (a تا g) را به یک پورت از میکروکنترلر متصل کنید ولی پایه مربوط به سگمنت اعشار را می‌­توانید به پورت دیگری هم متصل کنید.

راه اندازی سون سگمنت با Atmega8
شکل 8: اتصال یک نمایشگر 4 رقمی کاتد مشترک به میکروکنترلر – OPD-Q5621LE-BW

انتخاب مقاومت‌های محدود‌کننده جریان برای راه اندازی سون سگمنت

همانطور که قبلاً اشاره کردیم، هر سگمنت یک ال‌ای‌دی است و تقریباً می‌تواند 20 میلی‌آمپر جریان بکشد. دیتاشیت جریان را 25 میلی‌آمپر و در حالت مالتی‌پلکس 90 میلی‌آمپر بیان می‌کند، اما حداکثر جریانی که می­‌توان از یک پایه میکروکنترلر گرفت، 20 میلی‌آمپر است. به منظور کنترل جریان و جلوگیری از آسیب دیدن ال‌ای‌دی‌ها باید از مقاومت‌­های محدودکننده جریان استفاده شود. بنابراین مقاومت‌ها برای 20 میلی‌آمپر محاسبه می‌شوند.

افت ولتاژ مستقیم یک ال‌ای‌دی قرمز حدود 2 ولت و برای ال‌ای‌دی‌های آبی و سفید 3.6 ولت است. مقدار مقاومت محدودکننده جریان برای یک سون‌­سگمنت قرمز در یک مدار منطقی 5 ولتی از رابطه زیر به دست می­‌آید:

مدار مقاومت(اهم) = جریان مصرفی ال‌ای‌دی (میلی‌آمپر) /  (افت ولتاژ مستقیم ال‌ای‌دی (ولت) – ولتاژ تغذیه (ولت))

(5V – 2V) / 0.02mA = 150ohm

دراینجا برای روشن و خاموش کردن هر یک از ارقام در هر لحظه، حالت مالتی‌پلکس، از 4 ماسفت NX7002AK که هم مقرون به صرفه است و هم دیودهای حفاظتی ESD دارد، استفاده می­‌کنیم. ماسفت‌­ها را مطابق مدار شکل 8، متصل کنید.

زمانی­‌که یک پایه­‌ی میکروکنترلر به عنوان ورودی تعریف می­‌شود، جریانی که به پایه وارد می­شود جریان سینک (sink) و زمانی که یک پایه به عنوان خروجی تعریف می‌­شود، جریانی که از آن گرفته می­‌شود، جریان سورس (source) نامیده می‌­شود. با توجه به اینکه از چه میکروکنترلری استفاده می‌کنید، می‌توان حداکثر 200 میلی‌آمپر از همه پایه‌های یک میکروکنترلر، حداکثر 20 میلی‌آمپر از هر پایه، جریان گرفت.

با در نظر گرفتن 7 سگمنت و سگمنت اعشار، هنگام نمایش عدد 8  حدود  8*20mA=160mA جریان از میکروکنترلر کشیده خواهد شد. چنانچه میکروکنترلر بتواند 200 میلی­‌آمپر جریان بدهد، از سایر پایه­‌ها نباید بیش از 200mA-160mA=40mA جریان کشید.

 در اینجا به ازای هر سگمنت 10 یا 14 میلی‌آمپر را پیشنهاد می‌­دهیم، زیرا امروزه ال‌ای‌دی‌ها‌ حتی به ازای جریان‌های کم نیز بسیار روشن هستند. اگر جریان بیشتری مورد نیاز است، از یک آی‌سی ترانزیستور دارلینگتون (مانند ULN2003A) استفاده کنید.

چرا نمی­‌توان مستقیماً سون­‌سگمنت‌­ها را به میکروکنترلر متصل و تنها یک مقاومت به پایه­‌ی درین ماسفت متصل کرد؟ این ایده­‌ی بدی است. زیرا با توجه به تعداد سگمنت‌هایی که روشن می‌شوند، جریان مصرفی متفاوت خواهد بود اما مقاومت ثابت است. اگر مقدار مقاومت برای 160 میلی‌آمپر محاسبه شده­‌باشد، هنگام نمایش عدد “1” ، از هر یک از دو سگمنت 80 میلی‌آمپر خواهد گذشت.

طبق دیتاشیت، اگر مالتی‌پلکسر به اندازه کافی سریع باشد، جریان مصرفی یک ال‌ای‌دی 90 میلی‌آمپر خواهد بود. اما اگر میکروکنترلر در یک حلقه گیر کند چه اتفاقی می‌افتد؟ دراین صورت ال‌ای‌دی‌ها خواهند سوخت. مطمئناً می‌توانید از یک تایمر نگهبان (watchdog) برای آن استفاده کنید. اما پس از آن روشنایی مطلوبی نخواهید داشت که بسته به تعداد سگمنت‌های روشن، تحمل مقاومت به ازای هر رقم، افت ولتاژ مستقیم هر ال‌ای‌دی و … متفاوت خواهد بود. بنابراین با توجه به قیمت ناچیز مقاومت‌ها، بهتر است. برای هر سگمنت از یک مقاومت استفاده شود.

مالتی‌پلکس کردن نمایشگر سون سگمنت

به سادگی نمی‌توان مقداری را همزمان روی همه ارقام یک نمایشگر سون­ سگمنت چندرقمی نمایش داد و در هر لحظه فقط یک رقم می‌تواند روشن باشد. فرکانس روشن و خاموش شدن هر رقم باید به اندازه کافی زیاد باشد تا از سوسو زدن جلوگیری شود. در کتابخانه­‌ای­ که در این آموزش استفاده کردیم و در ادامه توضیح داده شده­‌است، این کار با استفاده از یک وقفه تایمر انجام می‌شود که هر یک میلی‌ثانیه فعال می‌گردد. به‌طوری ­که در یک میلی‌ثانیه اول، اولین رقم روشن و بقیه خاموش می­‌شوند. در یک میلی‌ثانیه بعدی تنها دومین رقم روشن می­شود و به همین ترتیب ادامه پیدا می‌­کند. این یکی از نقطه‌­ضعف‌­های نمایشگر سون‌سگمنت است – که اگر از یک آی‌سی خارجی استفاده نشود باید به طور مداوم توسط میکروکنترلر به‌روز شود.

ریت فعال شدن وقفه به تعداد ارقام نمایشگر بستگی دارد. طبق رابطه زیر ریت به‌روزرسانی نمایشگر سون‌سگمنت برابر است با:

تعداد ارقام / (دوره روتین وقفه (ISR) / 1)

اگر وقفه هر یک میلی‌ثانیه فعال شود و 4 رقم داشته باشیم، ریت به‌­روزرسانی (1/0.001)=1000Hz/4=250Hz خواهد بود. هرچه ارقام بیشتر باشد، فرکانس هم باید بیشتر باشد تا از سوسو زدن جلوگیری شود.

برای راه اندازی سون سگمنت با میکروکنترلر AVR، از کتابخانه‌­ای تحت عنوان display7seg.h استفاده می­‌کنیم که می‌توانید آن را از لینک زیر دانلود کنید:

دانلود کتابخانه display7seg.h


در ادامه پارامترها و  متغیرهای تعریف شده در این کتابخانه را بررسی می­‌کنیم تا بتوانید هر نوع سون‌ سگمنت موردنیاز خود را با یک میکروکنترلر AVR راه‌­اندازی نمایید.

کتابخانه نمایشگر سون سگمنت

در این کتابخانه، از کتابخانه millis برای فعال کردن وقفه یک میلی‌ثانیه استفاده می‌شود، اما اگر وقفه‌ای دارید که قبلاً از آن استفاده کرده‌اید، می‌توانید به جای آن، تابع مالتی‌پلکسر را قرار دهید. کتابخانه millis را می‌توانید از طریق لینک زیر دانلود کنید:

دانلود کتابخانه millis


قبل از استفاده از کتابخانه چندین مورد باید مشخص شود، به عبارت دیگر متناسب با سون­ سگمنت موردنیاز خود، موارد زیر را تعیین کنید:

#define DISPLAY_7SEG_NR_OF_DIGITS

مشخص می­‌کند نمایشگر چند رقم دارد.

#define DISPLAY_7SEG_TYPE

نمایشگر از چه نوعی است: کاتد مشترک یا آند مشترک (DISPLAY_7SEG_COMMON_CATHODE یا DISPLAY_7SEG_COMMON_ANODE)

#define DISPLAY_7SEG_PORT

مشخص می­‌کند سون­‌سگمنت به چه پورتی متصل شده­‌است، مثلا پورت D:

#define DISPLAY_7SEG_PORTD

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

شماره‌ پایه‌­های اختصاص داده شده به هر سگمنت، فقط برای راهنمایی است. لازم ­است آن‌ها را با توجه مدار خود تغییر دهید.

// IMPORTANT. All pins must be on the same port
#define SEGMENT_A_PIN			7
#define SEGMENT_B_PIN			5
#define SEGMENT_C_PIN			1
#define SEGMENT_D_PIN			3
#define SEGMENT_E_PIN			4
#define SEGMENT_F_PIN			6
#define SEGMENT_G_PIN			0

سگمنت مربوط به اعشار می‌تواند روی پورت متفاوتی باشد.

// The dot can be on a different port
#define SEGMENT_DOT_PORT		PORTD
#define SEGMENT_DOT_PIN		PD2

True یا False. اگر هیچ عدد اعشاری‌ای استفاده نمی‌کنید آن را روی False تنظیم کنید.

تعیین پایه آند مشترک یا کاتد مشترک برای هر رقم :
لازم به ذکر است که این کتابخانه تا 6 رقم را پشتیبانی می‌کند، بنابراین بسته به تعداد رقم‌هایی که دارید، بقیه بدون اتصال (NC) باقی می‌مانند.

// Common anode or common cathode pin for each digit
#define DISPLAY_DIGIT_1_DDR		DDRC
#define DISPLAY_DIGIT_1_PORT		PORTC
#define DISPLAY_DIGIT_1_PIN		PC0

#define DISPLAY_DIGIT_2_DDR		DDRC
#define DISPLAY_DIGIT_2_PORT		PORTC
#define DISPLAY_DIGIT_2_PIN		PC1

#define DISPLAY_DIGIT_3_DDR		DDRC
#define DISPLAY_DIGIT_3_PORT		PORTC
#define DISPLAY_DIGIT_3_PIN		PC2

#define DISPLAY_DIGIT_4_DDR		DDRC
#define DISPLAY_DIGIT_4_PORT		PORTC
#define DISPLAY_DIGIT_4_PIN		PC3

#define DISPLAY_DIGIT_5_DDR		NC
#define DISPLAY_DIGIT_5_PORT		NC
#define DISPLAY_DIGIT_5_PIN		NC

#define DISPLAY_DIGIT_6_DDR		NC
#define DISPLAY_DIGIT_6_PORT		NC
#define DISPLAY_DIGIT_6_PIN		NC

تابع ()main

در ابتدای تابع ()main، کتابخانه نمایشگر سون­ سگمنت را راه ­اندازی می‌­کنیم (()display7seg_init). به طوری­‌که بسته به نوع نمایشگر، پایه‌ها را به عنوان خروجی به‌صورت low یا high تنظیم می‌کند. کتابخانه millis نیز باید راه اندازی شود و سپس وقفه‌های سراسری با استفاده از تابع ()sei فعال شوند.

display7seg_init();
    millis_init();

    // Enable global interrupts
    sei();

نمایش اعداد صحیح بر روی نمایشگر سون‌سگمنت

display7seg_printInt(number, start_position, nr_of_digits)

این تابع چاپ اعداد صحیح دارای سه ورودی است:

  • number: یک عدد صحیح مثبت یا منفی است.
  • start_position: رقمی که نمایش عدد موردنظر از آن شروع می‌شود. از 1 تا DISPLAY_7SEG_NR_OF_DIGITS. اگر عدد منفی باشد، علامت منفی در جلو عدد قرار می‌گیرد.
  • nr_of_digits: این ورودی برای اضافه کردن (padding) تعداد ارقام مفید است. به طوری­که به تعداد ارقام موردنیاز صفر اضافه می­شود. فرض کنید یک ساعت دیجیتال داریم و می‌خواهیم دقیقه‌ها به جای hh: 1 به صورت hh:01 نمایش داده شوند، در این صورت با مقداردهی این پارامتر با مقدار 2، تعداد ارقام موردنظر را 2 رقم تعیین می­کنیم. اگر عدد از 0 تا 9 باشد یک صفر قبل از آن قرار می‌گیرد تا 2 رقمی شود و اگر عدد 2 رقمی باشد، نیازی به اضافه شدن صفر نیست. درصورتی که این پارامتر با صفر مقداردهی شود، عدد به همان صورتی که هست نمایش داده می‌شود.

نمایش اعداد اعشاری بر روی نمایشگر سون‌سگمنت

display7seg_printFloat(float_number, start_position, nr_of_digits,  nr_of_decimals)

این تابع چاپ اعداد اعشاری دارای چهار ورودی است:

  • float_number: یک عدد اعشاری مثبت یا منفی است.
  • start_position و nr_of_digits: این دو ورودی مشابه ورودی‌­های تابع چاپ اعداد صحیح است.
  • nr_of_decimals: با این ورودی مشخص می­کنیم که چند رقم بعد از ممیز نمایش داده شود. اگر عدد اعشاری دارای ارقام اعشار زیادی مانند 3.14159265359 باشد و مقدار این پارامتر 2 باشد، عدد چاپ شده 3.14 خواهد بود. اگر عدد اعشاری 3.1 و مقدار این پارامتر 2 باشد، عدد چاپ شده 3.10 خواهد بود – یک صفر در انتها برای ایجاد 2 رقم اعشار اضافه می‌شود.

نمایش حروف الفبا بر روی نمایشگر سون‌سگمنت

display7seg_printChar(start_position, character)

این تابع تعدادی از حروف الفبا را چاپ می‌کند. با توجه به تعداد محدود سگمنت‌ها، نمی‌توان همه کاراکترهای حروف الفبا را با نمایشگر سون‌سگمنت نمایش داد. این تابع دارای دو ورودی است:

  • start_position: این ورودی مشابه ورودی تابع چاپ اعداد صحیح است.
  • character: این ورودی باید یکی از تعاریف زیر باشد و نمی‌تواند کاراکتری مانند ‘a’ یا “a” باشد.
    // Minus "-" sign
    #define DISPLAY_7SEG_DIGIT_MINUS 
 
    // Space
    #define DISPLAY_7SEG_DIGIT_SPACE
 
    // Letters
    #define DISPLAY_7SEG_DIGIT_a
    #define DISPLAY_7SEG_DIGIT_b
    #define DISPLAY_7SEG_DIGIT_c
    #define DISPLAY_7SEG_DIGIT_d
    #define DISPLAY_7SEG_DIGIT_r	
    #define DISPLAY_7SEG_DIGIT_t	

    #define DISPLAY_7SEG_DIGIT_A	
    #define DISPLAY_7SEG_DIGIT_C	
    #define DISPLAY_7SEG_DIGIT_E	
    #define DISPLAY_7SEG_DIGIT_F	
    #define DISPLAY_7SEG_DIGIT_G	
    #define DISPLAY_7SEG_DIGIT_H	
    #define DISPLAY_7SEG_DIGIT_I	
    #define DISPLAY_7SEG_DIGIT_J	
    #define DISPLAY_7SEG_DIGIT_L	
    #define DISPLAY_7SEG_DIGIT_N	
    #define DISPLAY_7SEG_DIGIT_O	
    #define DISPLAY_7SEG_DIGIT_P	
    #define DISPLAY_7SEG_DIGIT_Q	
    #define DISPLAY_7SEG_DIGIT_S	
    #define DISPLAY_7SEG_DIGIT_U	
    #define DISPLAY_7SEG_DIGIT_Y

هر تعریف بیت‌های پورتی که سگمنت‌ها به آن متصل شده­‌اند را مشخص می­کند.

خاموش و روشن کردن سگمنت ممیز اعشار

display7seg_dotOn(dot_number)

display7seg_dotOff(dot_number)

dot_number: با این ورودی مشخص می­کنیم سگمنت اعشار کدام رقم روشن یا خاموش شود.

حرکت دادن ممیز اعشار

()display7seg_dotAnimation

این تابع سگمنت­های اعشار را از چپ به راست روشن و خاموش خواهد کرد.

این یک تابع ساده است که از تابع ()_delay_ms استفاده می‌کند و تأخیری به اندازه تعداد رقم‌ها * 200 میلی‌ثانیه اضافه می‌کند. می­توان از آن به عنوان نشانگر وضعیت استفاده کرد.

پاک‌کردن نمایشگر

()display7seg_clearDisplay

پاک‌کردن نمایشگر همیشه لازم نیست. به عنوان مثال، زمانی که همان تعداد رقم با مقادیر جدید جایگزین می‌شوند، پاک‌کردن نمایشگر لازم نیست. تنها زمانی به پاک‌کردن نیاز داریم که برخی از قسمت‌های نمایشگر استفاده شده‌­باشد و دیگر چیزی درآنجا چاپ نشود. برای مثال فرض کنید ابتدا عدد 10 چاپ شود و سپس 9 در جایی که 1 بود چاپ شود. بنابراین اگر قبل از چاپ عدد 9، از تابع clear استفاده نشود، 0 باقی می‌ماند و 90 بر روی نمایشگر نمایش داده می­‌شود.

برای پاک‌کردن یک کاراکتر به صورت زیر از تعریف ‘space’ استفاده کنید:

    display7seg_printChar(1, DISPLAY_7SEG_DIGIT_SPACE);

مالتی‌پلکسر

()display7seg_multiplexer

این تابع باید در داخل روتین وقفه (ISR) قرار داده شود و پایه‌های پورت موردنظر را بر اساس آنچه که قرار است نمایش داده شود تنظیم می‌کند. در توابع چاپی که معرفی شد، پایه‌هایی که باید روشن شوند، محاسبه می‌شود و بیت‌ها را در یک آرایه قرار می­‌دهد تا وقفه بسیار سریع باشد.

در پایان برنامه‌­ی یک ساعت دیجیتال با استفاده از دو کتابخانه­‌ی display7seg و millis قرار داده شده­‌است:

نمایش ساعت دیجیتال بر روی یک سون­ سگمنت چهار رقمی

#include "display7seg.h"
#include "millis.h"

volatile uint8_t seconds = 0;
volatile uint8_t minutes = 0;
volatile uint8_t hours = 0;

volatile int16_t timerISRCount = 0;
volatile uint8_t update_display = 0;

int main(void){
	display7seg_init();
	millis_init();
	
	// Enable global interrupts
	sei();

	while(1){
	
		// Update the display only if something changes
		if(update_display){
			update_display = 0;
			
			if(hours > 9){
				display7seg_printInt(hours, 1, 0);
			}else{
				display7seg_printInt(hours, 2, 0);  
			}
			
			display7seg_printInt(minutes, 3, 2);
			
			//display7seg_printInt(seconds, 3, 2);
		}
	}
	
	return 0;
}


ISR(TIMER2_COMPA_vect){

	timerISRCount++;
		
	// 1/2 second elapsed
	if(timerISRCount == 500){
		// Turn off colon
		display7seg_dotOff(2);
		
	// 1 second elapsed
	}else if(timerISRCount == 1000){
		timerISRCount = 0;

		seconds++;
		update_display = 1;
		
		// Display colon
		display7seg_dotOn(2);

		if(seconds > 59){
			seconds = 0;
			
			minutes++;
			
			if(minutes > 59){
				minutes = 0;
				hours++;
				
				if(hours > 23){
					hours = 0;
				}
			}
		}
	}
	
	// 7 segment display
	display7seg_multiplexer();
    
} 

در این آموزش سعی کردیم شما را با راه اندازی سون سگمنت و انواع آن­ آشنا کنیم. همچنین یک کتابخانه برای نمایشگر سون ­سگمنت مورد استفاده قرار گرفت که به کمک آن قادر خواهید بود با انجام تنظیمات مربوطه، هر نوع نمایشگر سون­ سگمنتی را با یک میکروکنترلر AVR راه­‌اندازی کنید.

امیدواریم از این مقاله لذت برده باشید و از آن در پروژه‌های خود استفاده کنید.

نظرات و سوالات خود را با ما در میان بگذارید.

مقالات مشابه

۱۶ دیدگاه. Leave new

  • علیرضا ساقی
    بهمن ۲۵, ۱۴۰۰ ۱۴:۲۳

    سلام
    اگر ممکنه در مورد ترانزیستر برای کاتد مشترک هم یک مدار ارائه بدید ممنون میشم
    باتشکر

    پاسخ
    • سلام علیرضای عزیز،
      برای کاتد مشترک هم از همین مدار میتونی استفاده کنی.
      فقط تفاوتش این هست که روشن کردن هر رقم نمایشگر با صفر کردن پایه متناظر انجام میشه و عکس آند مشترکه.

      پاسخ
  • باسلام

    اگر تو طراحی یک مدار که قراره عددی از۰ تا۲۵۵ دریافت کنه و توان ۳ رو تو خروجی نشون بده از کلید dipsw برای کنترل سون سگمنت ۸تایی استفاده بشه بافرض اینکه کاتد مشترک باشه باید پایه ۱،۲،۳…،۸سگمنت به زمین وصل کنیم از لحاظ سخت افزاری ؟

    پاسخ
    • سلام و درود،
      اگه بتونی دقیق‌تر برامون توضیح بدی که می‌خوای چه کاری انجام بدی، ممنون میشم.
      اینجوری بهتر می‌تونیم راهنماییت کنیم.

      پاسخ
  • سلام وقت شما بخیر
    ببخشید از کجا میشه به این کتابخانه (display7seg.h) دسترسی داشت؟

    پاسخ
    • سلام علی عزیز،
      لینک این کتابخونه رو قرار دادیم، الان می‌تونی اون رو دانلود کنی.

      پاسخ
  • با عرض سلام و وقت بخیر و تشکر از سایت خوبتون، من توی Atmel Studio 7 از این کد استفاده کردم و خطاهای زیر رو گرفتم، لطفا راهنمایی بفرمایید:
    Error #error “F_CPU not supported. Please request support.”
    Error ‘TCCR2A’ undeclared (first use in this function)
    Error ‘TCCR2B’ undeclared (first use in this function)
    Error ‘TIMSK2’ undeclared (first use in this function)
    Error ‘TIMSK2’ undeclared (first use in this function)
    Error ‘TIMSK2’ undeclared (first use in this function)
    Error ‘OCR2A’ undeclared (first use in this function)
    Error ‘OCIE2A’ undeclared (first use in this function)
    Error ‘OCIE2A’ undeclared (first use in this function)
    Error ‘OCIE2A’ undeclared (first use in this function)
    Error ‘CLOCKSEL’ undeclared (first use in this function)
    Error ‘F_CPU’ undeclared (first use in this function)
    Error ‘PRESCALER’ undeclared (first use in this function)

    پاسخ
    • سلام علی عزیز، ممنون از شما،
      این کتابخونه فقط برای atmega328 و atmega88 قابل استفاده است.

      پاسخ
  • سلام وقت بخیر
    ممنون میشم بفرمایید که
    آیا این پروژه با ماژول زیر که در فروشگاهتون موجوده قابل راه اندازی هست یا خیر؟
    تشکر

    پاسخ
  • سلام برای راه اندازی ۱۸b20 با این کتابخانه امکانش هست اگه یک توضیح بدید ممنون میشم

    پاسخ
    • سلام حمید عزیز،
      ۱۸b20 ارتباطی به این کتابخونه نداره. اگه بتونی سوالت رو دقیق تر بگی، بهتر می‌تونیم کمکت کنیم.

      پاسخ
  • عالی بود سپاس

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

    پاسخ
    • درود بر شما نگار عزیز
      بسته به نوع سگمنت نیاز به مالتی پلکس کردن ۶ رقم است. مالتی پلکس کردن ۴ رقم در مقاله توضیح داده شده و برای ۶ رقم هم مشابه است.
      سپاس از همراهیتون

      پاسخ

دیدگاهتان را بنویسید

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

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات