در این پست شما طریقه راه اندازی نمایشگرهای سون سگمنت ها توسط میکروکنترلرها به زبان بیسیک و با استفاده از نرم افزار محبوب Bascom، آموزش می بینید.
مقدمه
سون سگمنت چیست؟
نمایشگر هفت قسمتی برای نشان دادن اعداد در ساعتهای دیجیتالی، چراغ راهنما، ماشین حساب، ترازوی دیجیتالی و … از یک قطعه الکترونیکی به نام Seven-Segment یا هفت قسمتی استفاده می کنند؛ که اغلب به رنگ های سبز و قرمز هستند. ساختار این قطعه الکترونیکی از هفت LED (دیود نورانی) تشکیل شده است و با روشن یا خاموش کردن این LEDها می توان اعداد را به نمایش گذاشت.
تقسیم بندی و انواع سون سگمنت ها
سون سگمنت ها از پایه هایی تشکیل شده اند که یکی از این پایه ها مشترک هستند که این پایه مشترک سون سگمنت ها را به دو نوع تقسیم می کند: سون سگمنت آند مشترک و یا کاتد مشترک.
سون سگمنت آند مشترک
سون سگمنتی که پایه مشترک آن مثبت باشد، به آن آند مشترک گویند که این به این معنی است که پایه های مثبت LEDهای درون سون سگمنت به هم مشترک و یا اتصال داده شده اند و می توان با کنترل پایه های منفی این سون سگمنت ها که با حروف a, b, c, d, e, f, g نمایش داده شده اند، اعداد دلخواه را روی سون سگمنت ها نمایش دهیم. برای یادگیری و فهم بهتر تصویر زیر را مشاهده نمایید:
سون سگمنت کاتد مشترک
سون سگمنتی که پایه مشترک آن منفی باشد، به آن کاتد مشترک گویند که این به این معنی است که پایه های منفی LEDهای درون سون سگمنت به هم مشترک و یا اتصال داده شده اند و می توان با کنترل پایه های مثبت این سون سگمنت ها، اعداد دلخواه را روی سون سگمنت ها نمایش دهیم. برای یادگیری و فهم بهتر تصویر زیر را مشاهده نمایید:
نمایش اعداد بر روی سون سگمنت ها چگونه انجام می شود؟
گاهی می خواهیم تنها یک سون سگمنت را راه اندازی کنیم که این کاری بسیار ساده است و می توان پورت های سون سگمنت (a, b, c, d, e, f, g) را به راحتی به یک پورت از میکرو وصل کرد (شکل 3) ولی وقتی بیش از یک سون سگمنت را بخواهیم راه اندازی کنیم، به دلیل محدود بودن پایه های میکروکنترلر، نمی توانیم هر کدام از مجموعه پایه های نامشترک سون سگمنت را به پورت مجزایی از میکروکنترلر متصل کنیم. (شکل 4) راه حلی که برای رفع این مشکل می توان ارائه داد به این صورت است که ابتدا در یک بازه زمانی بسیار کوتاه، سون سگمنت مربوط به اولین عدد روشن شود و عدد مشخص شده خودش را نمایش دهد و بعد از این کار، این سون سگمنت خاموش شود و سپس سون سگمنت دوم روشن شود و عدد تعیین شده برای خودش را نمایش دهد و دوباره خاموش گردد و به همین ترتیب ادامه خواهد یافت.
لذا کاری که می توان انجام داد این است که پایه های نامشترک سون سگمنت ها را به هم وصل کنیم و همه این پایه ها را به یک پورت از میکروکنترلر اتصال دهیم. بر خلاف این امر، پایه های مشترک (Com) هر سون سگمنت را به یک پایه مجزا از میکروکنترلر متصل کنیم. (شکل 5) (توجه شود تمامی سون سگمنت ها از نوع آند مشترک هستند.)
قسمت کدنویسی
1. بعد از تعیین میکروکنترلر مورد استفاده و فرکانس کریستال، پورت های خروجی را مشخص می کنیم که همان پورت هایی هستند که به سون سگمنت ها متصل می شوند. در اینجا پورت A برای کنترل قسمت های a – b – c – d – e – f – g، و پورت B برای کنترل پایه های آند سون سگمنت ها به کار می رود.
1 2 |
$regfile = "m32def.dat" $crystal = 8000000 |
1 2 |
Config PORTA = Output Config PORTB = Output |
2. پایه های آند هر سون سگمنت را مشخص می کنیم و به آن ها یک نام می دهیم تا فرایند برنامه نویسی آسان شود.
1 2 3 4 5 6 7 8 |
Seg1 Alias PORTB.0 Seg2 Alias PORTB.1 Seg3 Alias PORTB.2 Seg4 Alias PORTB.3 Seg5 Alias PORTB.4 Seg6 Alias PORTB.5 Seg7 Alias PORTB.6 Seg8 Alias PORTB.7 |
3. متغیرهای موردنیاز در برنامه را تعریف می کنیم.
1 |
Dim Number As Long |
متغیرهای زیر از این جهت بازه بندی شده اند که در فرایند برنامه نویسی گیج نشده و کدنویسی ما منظم تر جلوه دهد. خط اول مربوط به اعدادی هستند که می خواهیم به هر سون سگمنت دهیم تا آن را نمایش دهد. خط دوم مربوط به متغیرهایی است که در فرایند برنامه نویسی از آن ها بطور موقت و کمکی استفاده می شود. (در محاسبات که در قسمت های پایینی توضیح داده می شود.)
1 2 |
Dim Digits(8) As Long Dim Temp(6) As Long |
4. پس از ایجاد حلقه Do – Loop، حال نوبت به محاسبات می رسد. برای اینکه یک عدد را به ارقام تشکیل دهنده اش تبدیل کنیم، بایستی از توابع باقی مانده (Mod)، تقسیم صحیح (\) و یا تقسیم معمولی (/) کمک بگیریم. این کار را برای یادگیری بهتر با ارائه یک مثال توضیح می دهیم.
برای مثال می خواهیم ارقام عدد 17 را محاسبه کنیم. برای محاسبه رقم یکان، باید باقی مانده تقسیم این عدد بر 10 را محاسبه کنیم که همان رقم یکان می شود. برای محاسبه رقم دهگان، عدد 17 را بر 10 تقسیم صحیح می کنیم. (تقسیم صحیح آن است که اگر بر عددی بخش پذیر نباشد، تنها قسمت صحیح خارج قسمت را در نظر می گیرد و از قسمت اعشاری آن صرف نظر می کند.) با این کار، عدد 1 بدست می آید که همان رقم دهگان این عدد است.
حال مثال را سخت تر میکنیم و عدد 2017 را در نظر می گیریم. برای اینکه این عدد بزرگ است، بایستی ابتدا رقم هزارگان این عدد را بدست آوریم و سپس ارقام بعدی را محاسبه کنیم. برای محاسبه رقم هزارگان، همانطور که در قسمت قبل گفته شد، عدد 2017 را بر 1000 تقسیم صحیح می کنیم، که عدد 2 حاصل می شود. حال باقی مانده تقسیم عدد 2017 را بر 1000 بدست می آوریم و درون یکی از متغیرهای موقتی (Temp) قرار می دهیم تا سه رقم سمت راست عدد 2017 بدست آید (017). همانطور که مشاهده می کنید ما عدد را مرحله به مرحله می شکنیم تا به رقم یکانش برسیم. حال برای محاسبه رقم صدگان این عدد (017)، حاصل تقسیم صحیح آن را بر 100 محاسبه میکنیم که عدد 0 بدست می آید. سپس دوباره باقی مانده تقسیم این عدد را بر 100 محاسبه می کنیم تا دو رقم اول عدد بدست آید (17). حال طبق توضیحات بالا و مثال قبل عمل می کنیم و رقم های دهگان و یکان این عدد را نیز محاسبه می کنیم. حال این ارقام را داخل متغیرهای اصلی (Digits) قرار می دهیم.
در برنامه اصلی مایلیم عدد 8 رقمی را بر روی 8 عدد سون سگمنت نمایش دهیم که در قطعه کد زیر آمده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Digits(1) = Number \ 10000000 Temp(1) = Number Mod 10000000 Digits(2) = Temp(1) \ 1000000 Temp(2) = Temp(1) Mod 1000000 Digits(3) = Temp(2) \ 100000 Temp(3) = Temp(2) Mod 100000 Digits(4) = Temp(3) \ 10000 Temp(4) = Temp(3) Mod 10000 Digits(5) = Temp(4) \ 1000 Temp(5) = Temp(4) Mod 1000 Digits(6) = Temp(5) \ 100 Temp(6) = Temp(5) Mod 100 Digits(7) = Temp(6) \ 10 Digits(8) = Temp(6) Mod 10 |
5. حال نوبت به نمایش این اعداد بر روی سون سگمنت ها می رسد. برای اینکار باید در زمانی بسیار کوتاه (5 میلی ثانیه و یا کمتر) هر سون سگمنت به ترتیب روشن شود و عدد مربوط به خودش را نمایش دهد و سپس خاموش شود. پس ابتدا به این صورت عمل می کنیم که سون سگمنت اول را توسط دستور Seg1 = 1 و یا Set Seg1 روشن می کنیم؛ حال باید عدد مربوط به خودش را نمایش دهد. لذا بایستی پایه های پورت A را طوری روشن یا خاموش کنیم که این عدد نمایان شود. چون سون سگمنت های موردنظر ما از نوع آند مشترک هستند، لذا باید به پایه های a – b – c و … آن ها، ولتاژ منفی دهیم (همان GND). بدیهی است اگر سون سگمنت ها از نوع کاتد مشترک بودند، می بایست ولتاژ مثبت به این پایه ها می دادیم.
برای اینکه این پورت ها به طور صحیح روشن و یا خاموش شوند، می توانیم از یک سری داده که می توانند از نوع باینری و یا هگزادسیمال باشند، استفاده کنیم. لازم به ذکر است که ما می توانیم یک مقدار باینری (0 و 1) و یا هگزادسیمال را به یک پورت دهیم و این پورت با توجه به این مقدار، پورت های خود را تنظیم می کند. به مثال زیر توجه کنید:
PORTA = &B10100111
PORTA = &HA7
دو حرف اول مشکخص می کند مقدار باینری یا هگزادسیمال است. باید توجه داشته باشید که در مقادیر باینری، ترتیب بدین صورت است که مقدار اول، پایه آخر از پورت A را مشخص می کند و مقدار آخر، پایه اول آن را مشخص می کند. برای فهم بهتر، به جدول زیر توجه کنید:
PORTA = &B10100111 | ||||||||
PORTA.7 | PORTA.6 | PORTA.5 | PORTA.4 | PORTA.3 | PORTA.2 | PORTA.1 | PORTA.0 | پایه های پورت A |
1 = روشن | 0 = خاموش | 1 = روشن | 0 = خاموش | 0 = خاموش | 1 = روشن | 1 = روشن | 1 = روشن | مقدار و وضعیت |
در جدول زیر وضعیت پورت ها و سگمنت ها به تفکیک نوع سون سگمنت (آند یا کاتد) آورده شده است.
عدد موردنظر برای نمایش | وضعیت سگمنت ها در سون سگمنت کاتد مشترک | |||||||||
a | b | c | d | e | f | g | DP | کد باینری | کد هگزادسیمال | |
0 | ? | ? | ? | ? | ? | ? | &B00111111 | &H3F | ||
1 | ? | ? | &B00000110 | &H06 | ||||||
2 | ? | ? | ? | ? | ? | &B01011011 | &H5B | |||
3 | ? | ? | ? | ? | ? | &B01001111 | &H4F | |||
4 | ? | ? | ? | ? | &B01100110 | &H66 | ||||
5 | ? | ? | ? | ? | ? | &B01101101 | &H6D | |||
6 | ? | ? | ? | ? | ? | ? | &B01111101 | &H7D | ||
7 | ? | ? | ? | &B00000111 | &H07 | |||||
8 | ? | ? | ? | ? | ? | ? | ? | &B01111111 | &H7F | |
9 | ? | ? | ? | ? | ? | &B01101111 | &H6F |
عدد موردنظر برای نمایش | وضعیت سگمنت ها در سون سگمنت آند مشترک | |||||||||
a | b | c | d | e | f | g | DP | کد باینری | کد هگزادسیمال | |
0 | ? | ? | &B11000000 | &HC0 | ||||||
1 | ? | ? | ? | ? | ? | ? | &B11111001 | &HF9 | ||
2 | ? | ? | ? | &B10100100 | &HA4 | |||||
3 | ? | ? | ? | &B10110000 | &HB0 | |||||
4 | ? | ? | ? | ? | &B10011001 | &H99 | ||||
5 | ? | ? | ? | &B10010010 | &H92 | |||||
6 | ? | ? | &B10000010 | &H82 | ||||||
7 | ? | ? | ? | ? | ? | &B11111000 | &HF8 | |||
8 | ? | &B10000000 | &H80 | |||||||
9 | ? | ? | ? | &B10010000 | &H90 |
حال برای ساده تر شدن کار می توانیم این اطلاعات و Data ها را در پایین برنامه در یک برچسب یا اصطلاحا Label قرار دهیم که هر وقت به این مقادیر باینری و یا هگز احتیاج داشتیم، با دادن عدد موردنظر، مقادیر باینری و یا هگزادسیمال آن را دریافت کنیم و به پورت A دهیم. برای این منظور از تابع Lookup استفاده می کنیم. ساختار این تابع به صورت زیر است:
PORTA = Lookup(عدد موردنظر, Label)
لازم به ذکر است عدد موردنظر گفته شده، Index و یا ردیف را در Data ها مشخص می کند و مقدار آن Index را بر می گرداند.
برای مثال: کد مربوط به داده ها (مخصوص سون سگمنت های به ترتیب آند مشترک و کاتد مشترک)
1 |
Data &HC0, &HF9, &HA4, &HB0, &H99, &H92, &H82, &HF8, &H80, &H90 |
1 |
Data &H3F, &H06, &H5B, &H4F, &H66, &H6D, &H7D, &H07, &H7F, &H6F |
قطعه کد برای نمایش اعداد در این قسمت از آموزش به صورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Seg1 = 1 PORTA = Lookup(digits(1) , 7seg) Waitms 2 Seg1 = 0 Seg2 = 1 Porta = Lookup(digits(2) , 7seg) Waitms 2 Seg2 = 0 Seg3 = 1 Porta = Lookup(digits(3) , 7seg) Waitms 2 Seg3 = 0 . . . |
و قطعه کد مربوط به داده های سون سگمنت به صورت زیر است:
1 2 |
7seg: Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 |
همچنین ببینید: نرم افزار محاسبه و ایجاد کد برای سون سگمنت
بخش دانلود
شامل موارد زیر:
- فایل های پروژه آموزشی
- فایل مدار شبیه سازی شده Proteus
- سورس کد به زبان بیسیک (Bascom)
توجه: برای تهیه این آموزش زحمت فراوانی کشیده شده است؛ لذا، کپی برداری ممنوع می باشد!
باسلام .اگر مدار كاتد مشترك را با يك DIPSWطراحي كنيم علاوه بر اينكه كد هگز ديتا تغيير ميكنه وDIPSW به زمين وصل ميشه ،POWER بايد به سگمنت اعمال كنيم يا ميكرو؟ ممنون ميشم اگر راهنمايي كنيد.
با درود؛
سوال شما مبهم است.
بهطور کلی در سگمنتهای کاتدمشترک، پایه مشترک بایستی به GND، و روی پایههای a تا g ولتاژ مثبت یا همان Power موردنظر شما (بسته به داده موردنظر) اعمال شود. حال این Power میتواند به دو صورت اعمال شود: توسط میکروکنترلر (که بهدلیل محدودبودن جریان گذرنده از هر پایه از میکروکنترلر پیشنهاد نمیشود) و یا توسط یک ترانزیستور بهعنوان درایور سوئیچینگ که توسط سیگنال میکروکنترلر تحریک میشود.
درواقع سگمنت کاتد مشترکی که مدنظرم بوده 8تایی.از طریق atmega8535وdipswقراره یه عدد توبازه 0 تا 255 رو به توان سه رسونده و با سگمنت نشونش بدیم.طبق توضیحات شما یعنی باید هر 8تا پایه رو به gnd وصل کنم ؟ مداری که پیوست شده مربوط به آند مشترکه .
با درودی دوباره؛
خیر؛ با فرض کاتدمشترک بودن سگمنتها در تصویر، میبایست از طریق پورت C، تکتک سگمنتها را (با دادن مقدار 0 منطقی به پین مربوطه از پورت) به ترتیب به زمین متصل کرده و توسط پورت A، دیتای موردنظر را به پایههای غیرمشترک سگمنتها (یعنی پایههای a تا g) دهید. البته بهتر بود بهجای پورت C، از پورت دیگری استفاده میکردید.
ضمن اینکه DIP-SW در اینجا به درایو سگمنتها ارتباطی ندارد و تنها برای ورودی عدد موردنظر بهکار گرفته میشود. پایههای سمت چپ DIP-SW نیز میتواند به زمین و یا به VCC متصل باشد. در صورتی که به VCC متصل باشد، کد شما مشابه کد زیر خواهد بود:
بالاخره run شد((((:
خیلی ممنونم از توضیحاتتون و وقتی که گذاشتید.
ارادتمند، موفق باشید.
سلام من زیاد بسکام بلد نیستم اگه امکان داره خودتون زحمت نوشتن را بکشید با تشکر
با درود؛
درخواست خود را از طریق بخش پشتیبانی ارسال کنید تا بررسی شود. (در بخش نظرات، امکان انجام درخواستهای غیرمرتبط با مطلب اصلی امکانپذیر نمیباشد.)
سلام مهندس امکان داره این برنامه را طوری تغییر بدید که با up بالا و باdown پایین بیاد و اعداد زیر صفر که منفی میشن مثل 1- تا 9999- را نشان بده
با درود؛
موفق باشید.
سلام خسته نباشید
خیلی عالی
واقعا کمک کرد
ممنون
سلام مهندس خسته نباشی
میتوانی بگی چطور میشود تعداد بیشتری 7 سگمنت مثلا 24 یا حتی بیشتر را به میکرو مگا32 وصل کرد اگر نمونه شبیه سازی با بسکام و پروتئوس باشه ممنون میشم
با سلام
می توانید از یک آی سی بافر استفاده کنید و در نتیجه نیازی نیست که هر کدام از سون سگمنت ها را به یک پورت جداگانه از میکرو متصل کنید و با یک آی سی بافر می توانید 8 الی 16 عدد سون سگمنت را کنترل کنید.