راههای زیادی برای کنترل یک نمایشگر سونسگمنت وجود دارد، ازجمله استفاده از یک آیسی شیفت رجیستر که به پایههای زیادی نیاز ندارد. همچنین میتوان سگمنتها را مستقیماً از پایههای میکروکنترلر کنترل کرد، به طوریکه هر رقم (digit) با استفاده از یک ترانزیستور کنترل میشود. در ابتدای این آموزش به معرفی نمایشگرهای سونسگمنت و انواع آنها میپردازیم. پس از آن با راه اندازی سون سگمنت چهار رقمی با میکروکنترلر AVR آشنا میشویم. در نهایت با یک برنامهی نمایش ساعت دیجیتال این آموزش را به پایان میرسانیم.
دیود نورافشان (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 اعمال کنیم.
بهطور كلی، استفاده از سونسگمنتهای آند مشترک متداولتر است، زيرا اكثرا مدارات منطقی بيشتر از آن كه جريان الكتريكی را تأمین کنند، مصرف کننده هستند.
نکتهای که باید به یاد داشته باشید این است که یک سونسگمنت آند مشترک را به لحاظ سخت افزاری نمیتوانید مستقيماً جایگزین یک سونسگمنت كاتد مشترک کنید. اين كار دقیقاً مانند آن است كه يک الایدی را بهصورت معكوس در مدار قرار دهیم که با این کار مسلماً الایدی روشن نخواهد شد!
کاربردهای نمایشگر سون سگمنت
از جمله کاربردهای متداول نمایشگرهای سونسگمنت میتوان به موارد زیر اشاره کرد:
- ساعتهای دیجیتال
- رادیوهای ساعتدار
- ماشینحسابها
- ساعت مچیها
- سرعتسنجها
- کیلومترشمار وسائل نقلیه موتوری
- فرکانسمترهای دیجیتال
نمایشگر سونسگمنت چهار رقمی
با یک نمایشگر سونسگمنت چهار رقمی حداکثر عدد قابل نمایش 9999 است. در شکل 7 میتوانید اتصالات الکتریکی داخلی یک نمایشگر سونسگمنت 4 رقمی معمولی را مشاهده کنید. هر رقم از 7 سگمنت (الایدی) به علاوهی یک سگمنت مربوط به ممیز اعشار تشکیل شدهاست. برخی از نمایشگرها دارای دو نقطه ‘:’ هستند که برای نمایش ساعت به کار میرود. در این شکل اولین مدار، نمایشگر نوع آند مشترک را نشان میدهد و مدار زیرین آن یک نمایشگر کاتد مشترک است.
قابل توجه است که در سون سگمنتهای چند رقمی، تمام سگمنتهای یک رقم به سگمنتهای رقمهای دیگر متصل است. برای مثال اگر میخواستیم عدد 9 را روی رقم اول نمایش دهیم، این عدد در هر 3 رقم دیگر نیز نشان داده میشد. به همین دلیل نمایشگرهای سونسگمنت چند رقمی مالتیپلکس شدهاند؛ به این معنی که در هر لحظه تنها یک رقم روشن میشود و سایر ارقام خاموش خواهند بود. به این ترتیب اعداد هر رقم با سرعت بالا پشت سرهم نمایش داده میشوند و به نظر میرسد همهی ارقام همزمان روشن میشوند. به عنوان مثال، همانطورکه در شکل 7 مشاهده میکنید، هر یک از ارقام این سون سگمنت 4 رقمی از طریق پایههای 6، 8، 9 و 12 قابل دسترساند و با استفاده از آنها میتوانید رقم مربوطه را خاموش و روشن کنید.
راه اندازی سون سگمنت با میکروکنترلر 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) را به یک پورت از میکروکنترلر متصل کنید ولی پایه مربوط به سگمنت اعشار را میتوانید به پورت دیگری هم متصل کنید.
انتخاب مقاومتهای محدودکننده جریان برای راه اندازی سون سگمنت
همانطور که قبلاً اشاره کردیم، هر سگمنت یک الایدی است و تقریباً میتواند 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 قابل استفاده است.
سلام وقت بخیر
ممنون میشم بفرمایید که
آیا این پروژه با ماژول زیر که در فروشگاهتون موجوده قابل راه اندازی هست یا خیر؟
تشکر
سلام سعید عزیز،
برای این پروژه از یک سون سگمنت معمولی ۴ تایی مثل محصول زیر میتونی استفاده کنی:
https://roboeq.ir/products/detail/1203070/%D8%B3%D9%88%D9%86-%D8%B3%DA%AF%D9%85%D9%86%D8%AA-%DA%86%D9%87%D8%A7%D8%B1-%D8%AA%D8%A7%DB%8C%DB%8C-%D8%A2%D9%86%D8%AF-%D9%85%D8%B4%D8%AA%D8%B1%DA%A9-4013-%D8%B3%D8%A8%D8%B2-%D8%B3%D8%A7%D8%B9%D8%AA%DB%8C/
ماژول سون سگمنت TM1637 راهاندازی متفاوتی داره که میتونی مقاله مربوط به اون رو در وبلاگ مطالعه کنی.
سلام برای راه اندازی ۱۸b20 با این کتابخانه امکانش هست اگه یک توضیح بدید ممنون میشم
سلام حمید عزیز،
۱۸b20 ارتباطی به این کتابخونه نداره. اگه بتونی سوالت رو دقیق تر بگی، بهتر میتونیم کمکت کنیم.
عالی بود سپاس
درود برشما شهرام عزیز
از همراهی سبزتان ممنون و سپاسگذاریم.
سلام ممنون از توضیحات عالیتون.لطف میکنید توضیح بدین اگه یک سگمنت ۶رقمی داشته باشیم و بخوایم رو دوتای اول دمای محیط رو دوتای دوم دمای مرجع و روی رقم های پنجم و شیشم هرکدوم جداگانه led های مشخصی رو تعریف کنیم برای روشن شدن چطور میشه برنامه اش؟
درود بر شما نگار عزیز
بسته به نوع سگمنت نیاز به مالتی پلکس کردن ۶ رقم است. مالتی پلکس کردن ۴ رقم در مقاله توضیح داده شده و برای ۶ رقم هم مشابه است.
سپاس از همراهیتون