نشانگرهای LED هفت بخش. آردوینو و نشانگر چهار رقمی هفت قسمتی نشانگر هفت قسمتی پین اوت 4 رقمی

مقالات جدید

● پروژه 7: ماتریس 4 رقمی شاخص های 7 قسمتی. ساخت نمایشگر پویا

در این آزمایش ما به عملکرد آردوینو با یک ماتریس هفت بخش 4 بیتی نگاه خواهیم کرد. بیایید یک ایده از نمایشگر پویا داشته باشیم، که به شما امکان می دهد از همان پین های آردوینو هنگام نمایش اطلاعات در چندین نشانگر هفت بخش استفاده کنید.

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

ماتریس 4 رقمی نشانگرهای هفت قسمتی از چهار نشانگر هفت قسمتی تشکیل شده و برای نمایش همزمان 4 رقم بر روی ماتریس طراحی شده است. مدار یک ماتریس 4 بیتی بر روی نشانگرهای 7 قسمتی در شکل نشان داده شده است. 7.1.

برنج. 7.1. طرح یک ماتریس 4 بیتی روی نشانگرهای 7 قسمتی

برای نمایش اعداد باید LED های لازم را روشن کنید تماس با A-Gو DP و ماتریس مورد نظر را با اعمال LOW روی پایه های 6، 8، 9 یا 12 انتخاب کنید.
بیایید کنتاکت های ماتریس را به برد آردوینو وصل کنیم و اعداد خروجی را به بیت های مختلف ماتریس برسانیم. برای اتصال به 12 پین آردوینو نیاز داریم. نمودار اتصال برای اتصال یک ماتریس 4 بیتی به برد آردوینو در شکل نشان داده شده است. 7.2. هنگام اتصال مخاطبین، استفاده کنید مقاومت های محدود کننده 510 اهم.

برنج. 7.2. نمودار اتصال ماتریس 4 بیتی به آردوینو

بیایید طرحی از خروجی ترتیبی اعداد (0-9) را در یک ثبات دلخواه ماتریس بنویسیم. برای انتخاب یک مقدار تصادفی از محدوده، از تابع random() استفاده می کنیم. آرایه اعداد مقادیر مربوط به داده های نمایش اعداد 0-9 را ذخیره می کند (مهم ترین بیت بایت مربوط به برچسب بخش A از نشانگر و کمترین بیت مربوط به بخش G است)، آرایه پین ​​ها حاوی مقادیر مخاطبین برای بخش های A-Gو DP، در آرایه پین ​​اعداد - مقادیر مخاطبین برای انتخاب رقم ماتریس. محتویات طرح در فهرست 7.1 نشان داده شده است.

// متغیر برای ذخیره مقدار رقم فعلی int number=0 ; // نشانگر هفت بخش int digit=0 ; void setup()( برای (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } حلقه خالی()( number=(number+1 )%10 ; showNumber(number); // DS for (int i=0 ;i<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } void shownumber( int num)( برای (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // بخش را روشن کنید // خاموش کردن بخش digitalWrite (پین[i]، LOW)؛ ))
سفارش اتصال:

1. یک نشانگر هفت بخش را مطابق نمودار در شکل وصل کنید. 7.3.
2. طرح را از لیست 7.2 روی برد آردوینو بارگذاری کنید.

// لیست پین های آردوینو برای اتصال به بیت های a-g // نشانگر هفت بخشپین های int=(9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 ); // مقادیر برای نمایش اعداد 0-9اعداد بایت = ( B11111100، B01100000، B11011010، B11110010، B01100110، B10110110، B10111110، B11100000، B111111110، B111111110، B111111110); // متغیر برای ذخیره و پردازش مقدار فعلی int number=0 ; int number1=0 ; int number2=0 ; // نشانگر هفت بخش int pindigits=(2 ,8 ,11 ,12 ); // متغیر برای ذخیره رقم فعلی int digit=0 ; // برای اندازه گیری 100 میلی ثانیهطولانی بدون علامت millis1=0 ; // حالت 1 - کرونومتر در حال اجرا است mode=0 ; const int BUTTON=14 ; // پین 14 (A0) برای اتصال دکمه int tekButton = LOW; // متغیر برای ذخیره وضعیت فعلی دکمه int prevButton = LOW; // متغیر برای ذخیره وضعیت قبلی// به دکمه های بولی ledOn = false ; // وضعیت فعلی LED (روشن/خاموش) void setup(){ // پین دکمه را به عنوان ورودی پیکربندی کنید pinMode (BUTTON، INPUT)؛ // پین ها را به عنوان خروجی پیکربندی کنیدبرای (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } حلقه خالی()(tekButton = debounce(prevButton); if (prevButton == LOW && tekButton == HIGH) // اگر فشار داده شود... ( mode=1 -mode; // تغییر حالت if (mode==1 ) number=0 ; ) if (millis()-millis1>=100 && mode==1 ) (millis1=millis1+100 ; number=number+1 ; if (number==10000 ) number=0 ; ) number1=number; برای (int i=0 ;i<4 ;i++) { number2=number1%10 ; number1=number1/10 ; showNumber(number2,i); for (int j=0 ;j<4 ;j++) digitalWrite(pindigits[j],HIGH); digitalWrite(pindigits[i],LOW); delay(1 ); } } // عملکرد برای نمایش اعداد در یک نشانگر هفت بخش void shownumber( int num,int dig)( برای (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // بخش را روشن کنید digitalWrite(پین[i]،HIGH)؛ دیگر // خاموش کردن بخش digitalWrite (پین[i]، LOW)؛ ) اگر (حفاری==1) // نقطه اعشار برای رقم دوم digitalWrite (پین، بالا)؛ ) // عملکرد صاف کردن پرش. به عنوان می پذیرد // حالت قبلی دکمه را آرگومان می کند و وضعیت واقعی را برمی گرداند. انحراف بولی ( آخرین بولی)(جریان بولی = DigitalRead(BUTTON)؛ // وضعیت دکمه را بخوانید،اگر (آخرین != فعلی) // اگر تغییر کرده باشد ...الی ( 5 ) ; // اجازه دهید 5 m s جریان = digitalRead(BUTTON); // وضعیت دکمه را بخوانیدجریان برگشتی؛ // وضعیت دکمه را برگردانید } }

3. با فشار دادن دکمه کرونومتر را شروع یا متوقف می کنیم.

در مقاله امروز ما در مورد شاخص های 7 بخش و نحوه "دوست شدن" با آردوینو صحبت خواهیم کرد. چندین گزینه وجود دارد. البته ساده ترین راه رفتن به آن است و یک نشانگر آماده با سپر یکپارچه بخرید (به این میگن کارت تطبیق) اما ما به دنبال راه های ساده ای نیستیم بنابراین مسیر کمی دشوارتر را در پیش خواهیم گرفت. مبتدیان - نگران نباشید، این مقاله، مانند مقالات قبلی من (و ) فقط برای شما. بگذارید گوروها برای همان گوروهای با تجربه بنویسند، و من مبتدی هستم - من برای مبتدیان می نویسم.

چرا اندیکاتور 7 قسمتی؟ به هر حال، صفحه های بسیار متفاوتی وجود دارد، با تعداد زیادی کاراکتر، خطوط، مورب ها و وضوح های مختلف، سیاه و سفید و رنگی، که مقرون به صرفه ترین آنها چند دلار قیمت دارد... و اینجا: "قدیمی" یکی، بسیار ساده است، اما به تعداد زیادی پین نشانگر 7 قطعه نیاز دارد، اما هنوز هم این "پیرمرد" یک مزیت دارد. واقعیت این است که با استفاده از طرح های ارائه شده در اینجا می توانید نه تنها یک نشانگر با ارتفاع رقم 14 میلی متر، بلکه پروژه های جدی تر (البته خانگی) را احیا کنید و ارقام متر در این مورد از حد مجاز دور هستند. این ممکن است برای ساکنان پایتخت چندان جالب نباشد، اما اگر ساعتی در یک باشگاه یا شورای روستا ظاهر شود که بتواند تاریخ و دما را نیز نمایش دهد، جمعیت نووکاتساپتوکا یا نیژنیا کدروفکا بسیار خوشحال خواهند شد و در مورد خالق آن صحبت خواهند کرد. این ساعت برای مدت بسیار طولانی اما چنین ساعت هایی موضوع یک مقاله جداگانه است: بازدیدکنندگان می خواهند - من خواهم نوشت. هر آنچه در بالا نوشته شده است را می توان مقدمه دانست. مانند آخرین مقاله من، این مقاله شامل بخش هایی خواهد بود، این بار در دو بخش. در بخش اول ما به سادگی شاخص را "مدیریت" خواهیم کرد و در قسمت دوم سعی خواهیم کرد آن را برای چیزی حداقل کمی مفید تطبیق دهیم. پس ادامه می دهیم:

بخش اول. تجربی - آموزشی

اساس این پروژه ARDUINO UNO است که قبلاً از مقالات قبلی به خوبی برای ما شناخته شده است. به شما یادآوری می کنم که ساده ترین راه برای خرید آن در اینجا است:یا اینجا: علاوه بر این، به یک نشانگر 4 رقمی 7 قسمتی نیاز دارید. من به ویژه GNQ-5641BG-11 را دارم. چرا این یکی؟ بله، فقط به این دلیل که 5 سال پیش اشتباهاً آن را خریدم، تنبلی برای تعویضش داشتم، بنابراین تمام این مدت دراز کشیده بود و در بال ها منتظر بود. من فکر می کنم که هر کسی که یک آند مشترک دارد این کار را انجام می دهد (و با یک کاتد مشترک این امکان وجود دارد، اما شما باید داده های آرایه و سایر مقادیر پورت را معکوس کنید - یعنی آنها را به مقادیر مخالف تغییر دهید)، تا زمانی که آنقدر قدرتمند نیست که آردوینو را نسوزد. علاوه بر این، 4 مقاومت محدود کننده جریان، هر کدام تقریباً 100 اهم، و یک تکه کابل (10 سانتی متر برای من کافی بود) برای 12 پین (هسته) را می توان از یک عریض تر جدا کرد، کاری که من انجام دادم. یا حتی می توانید آنها را با سیم های جداگانه لحیم کنید، مشکلی پیش نخواهد آمد. شما همچنین به پین ​​هایی برای تخته (11 قطعه) نیاز دارید، اگرچه اگر مراقب باشید می توانید بدون آنها کار کنید. طرحی از نشانگر را می توان در شکل 1 و نمودار آن را در شکل 2 مشاهده کرد. همچنین اشاره می کنم که بهتر است به هر بخش از این نشانگر (محدود شده با مقاومت های 100 اهم) بیش از 2.1 ولت تامین نشود. در این صورت بیش از 20 میلی آمپر مصرف نخواهد کرد. اگر عدد "8" روشن شود، مصرف بیش از 7x20=140 میلی آمپر نخواهد بود که برای خروجی های آردوینو کاملا قابل قبول است. یک خواننده کنجکاو این سوال را می پرسد: "اما 4 تخلیه 140 میلی آمپری هر کدام در حال حاضر 4x140 = 560 میلی آمپر است و این در حال حاضر خیلی زیاد است!" من جواب می دهم - 140 باقی می ماند چگونه؟ ادامه مطلب محل قرارگیری پین ها روی نشانگر در شکل 3 قابل مشاهده است و مطابق جدول 1 اتصال را انجام می دهیم.


برنج. 1 - طرح نشانگر


برنج. 2 - مدار نشانگر


برنج. 3 - محل پین

میز 1

پین Arduino Uno

پین نشانگر

توجه داشته باشید

بخش G

بخش F

بخش E

بخش D

بخش C

بخش B

بخش A

آند مشترک قطعه شماره 1، از طریق یک مقاومت 100 اهم متصل می شود.

آند مشترک قطعه شماره 2، از طریق یک مقاومت 100 اهم متصل می شود.

آند مشترک قطعه شماره 3، از طریق یک مقاومت 100 اهم متصل می شود.

آند مشترک قطعه شماره 6 از طریق یک مقاومت 100 اهم متصل می شود.



ما یک طرح ساده را پر می کنیم، که یک "جدول شمارش" ساده از 0 تا 9 است:


حالا برای شفاف سازی DDRD یک رجیستر پورت D (DDRB - به ترتیب پورت B) است که در پشت کلمه "ترسناک" "رجیستر" فقط یک تابع "مخفی" وجود دارد که نشان می دهد آیا پورت چیزی را با پین خود می خواند (دریافت اطلاعات) یا vice. برعکس، امکان انجام کاری وجود دارد و سپس بنویسید (اطلاعات بدهید). در این حالت خط DDRD=B11111111; نشان می دهد که تمام پایه های پورت D خروجی هستند، یعنی. اطلاعات از آنها بیرون خواهد آمد. حرف "B" به این معنی است که یک عدد باینری در رجیستر نوشته می شود. یک خواننده بی حوصله بلافاصله می پرسد: "آیا اعشاری ممکن است!" من عجله می کنم تا به شما اطمینان دهم که امکان پذیر است، اما کمی بعد در مورد آن بیشتر توضیح می دهم. اگر بخواهیم نیمی از پورت را برای ورودی و نیمی را برای خروجی استفاده کنیم، می‌توانیم آن را به صورت زیر مشخص کنیم: DDRD=B11110000; یک ها آن پین هایی را نشان می دهند که اطلاعات را ارائه می دهند و صفرها آن هایی را نشان می دهند که این اطلاعات را دریافت می کنند. راحتی اصلی رجیستر نیز در این واقعیت نهفته است که شما نیازی به ثبت تمام پین ها 8 بار ندارید، یعنی. ما 7 خط را در برنامه ذخیره می کنیم. حالا بیایید به خط زیر نگاه کنیم:

PORTB=B001000; // پایه 11 پورت B را بالا تنظیم کنید

PORTB ثبت داده پورت B است، یعنی. با نوشتن یک عدد در آن مشخص می کنیم که کدام پایه پورت یک و کدام یک صفر خواهد بود. علاوه بر کامنت بگم که اگه آردوینو Uno رو طوری بگیری که کنترلر رو ببینی و پین های دیجیتال بالایش هست، ورود به رجیستر مشخص میشه یعنی. کدام «صفر» (یا «یک») با کدام پین مطابقت دارد، یعنی. سمت راست ترین صفر پورت B برای پین هشتم و سمت چپ ترین صفر برای سیزدهمین (که دارای LED داخلی است) است. برای پورت D، به ترتیب، سمت راست برای پایه 0، سمت چپ برای پایه 7 است.
امیدوارم پس از چنین توضیحات مفصلی همه چیز روشن باشد، اما از آنجایی که واضح است، پیشنهاد می کنم به سیستم اعداد اعشاری که از دوران کودکی برای ما شناخته شده و محبوب بوده برگردیم. و یک چیز دیگر - یک طرح 25 خطی ممکن است کوچک به نظر برسد، اما برای یک مبتدی هنوز هم تا حدودی دست و پا گیر است. ما آن را کاهش می دهیم.

بیایید یک طرح ساده تر، همان «جدول شمارش» را پر کنیم:


ویدئو 1.
فقط 11 خط! این راه ما است، "راه تازه کار"! لطفا توجه داشته باشید که به جای اعداد باینری، اعداد اعشاری در رجیسترها نوشته می شوند. طبیعتاً برای اعداد اعشاری هیچ حرفی در جلو لازم نیست. من فکر می کنم که قرار دادن همه اعداد در جداول ضرری ندارد.

جدول 2. مطابقت کاراکتر نمایش داده شده با داده های پورت

آند مشترک

کاتد مشترک

سیستم دودویی

سیستم اعشاری

سیستم دودویی

سیستم اعشاری

جدول 3. مطابقت رقم نمایش داده شده با داده های پورت

آند مشترک

کاتد مشترک

سیستم دودویی

سیستم اعشاری

سیستم دودویی

سیستم اعشاری



توجه! داده های جداول 2 و 3 تنها زمانی معتبر هستند که مطابق جدول 1 سیم کشی شوند.
اکنون بیایید یک طرح با یک "جدول شمارش" از 0 تا 9999 بارگذاری کنیم:




برنج. 4 - جدول شمارش

می توانید این طرح را در عمل مشاهده کنیدویدئو 2.

نظرات در این طرح بیشتر از خود کد وجود دارد. هیچ سوالی نباید باشه... علاوه بر یک چیز، این چه نوع "چرخه سوسو زدن" است، دقیقاً چه چیزی در آنجا سوسو می زند و چرا؟ و همچنین نوعی متغیر برای این وجود دارد ...
و کل نکته این است که بخش های همنام هر چهار دسته در یک نقطه به هم متصل هستند. A1، A2، A3 و A4 یک کاتد مشترک دارند. A1, B1,…..G1 آند مشترک. بنابراین، با اعمال همزمان "1234" در نشانگر 4 رقمی، "8888" را دریافت خواهیم کرد و از این موضوع بسیار شگفت زده خواهیم شد. برای جلوگیری از این اتفاق، ابتدا باید "1" را در دسته خود روشن کنید، سپس آن را خاموش کنید، "2" را در دسته خود روشن کنید و غیره. اگر این کار را خیلی سریع انجام دهید، سوسو زدن اعداد مانند فریم های یک فیلم با هم ادغام می شوند و چشم عملا متوجه آن نمی شود. و حداکثر مقدار متغیر سوسو زدن در این مورد سرعت تغییر اعداد روی نشانگر را کنترل می کند. به هر حال، به لطف این "سوسو زدن" است که حداکثر مصرف جریان به جای 560 تنها 140 میلی آمپر است. اکنون پیشنهاد می کنم به سراغ چیز مفیدتری بروید.

بخش دوم. حداقل کمی مفید است

در این قسمت با استفاده از ARDUINO MEGA کاراکترها را از یک کامپیوتر شخصی به یک نشانگر 7 قسمتی خروجی می دهیم. چرا ایده "تعویض اسب ها در گذرگاه" ناگهان بوجود آمد؟ دو دلیل وجود دارد: اول، من قبلا هرگز ARDUINO MEGA را در مقالات خود در نظر نگرفته بودم. و ثانیاً، در ARDUINO UNO من هنوز نفهمیدم که چگونه می توانم به صورت پویا پورت COM و پورت D را عوض کنم. اما من یک تازه کار هستم - می توانم مرا ببخشند. طبیعتاً می توانید این کنترلر را از اینجا خریداری کنید: . برای اجرای طرح مجبور شدم یک هویه بردارم و کابل را از سمت آردوینو دوباره لحیم کنم و همچنین یک طرح جدید بنویسم. نحوه لحیم شدن کابل را در شکل 5 می بینید. نکته اینجاست که ARDUINO MEGA و ARDUINO UNO دارای پورت های مختلف هستند و Mega پورت های بسیار بیشتری دارد. مطابقت پین های استفاده شده را می توان در جدول 4 مشاهده کرد.



برنج. 5 - سیم کشی کابل جدید

جدول 4

پورت مگا


توجه! این جدول فقط برای این پروژه معتبر است!

همچنین باید توجه داشته باشید که پورت C آردوینو مگا از پایه 37 و سپس به ترتیب نزولی شروع می شود و پورت A از پایه 22 و سپس به ترتیب صعودی شروع می شود.



برنج. 6 - نمای کلی



ویژگی های کوچک پیاده سازی: ما 4 کاراکتر خروجی خواهیم داد. کاراکترها باید اعداد باشند. اگر «1234» را وارد کردید و ما «1234» را خواهیم دید، اگر «123456» را وارد کردید، همچنان «1234»، اگر «ytsuk»، «fyva1234»، «otiog485909oapom» را وارد کردید - چیزی نخواهیم دید. اگر "pp2345mm" را وارد کنید، "23" را خواهیم دید. کوچک، ساخته شده در "ضد خطا".

خود طرح:



نحوه کار این برنامه را می توانید در اینجا ببینیدویدئو 3.



بررسی تهیه شده توسط پاول سرگئیف

نشانگرهای LED هفت بخش در بین دستگاه های نمایشگر ارزش دیجیتال بسیار محبوب هستند و در پانل های جلویی اجاق های مایکروویو، ماشین لباسشویی، ساعت های دیجیتال، شمارنده ها، تایمرها و غیره استفاده می شوند. فواصل طولانی و در زاویه دید گسترده. برای اتصال یک نشانگر 4 بیتی هفت بخش به یک میکروکنترلر، حداقل 12 خط ورودی/خروجی مورد نیاز است. بنابراین، استفاده از این نشانگرها با میکروکنترلرهایی با تعداد پایه کم، به عنوان مثال سری های شرکت، تقریبا غیرممکن است. البته می‌توانید از روش‌های مالتی پلکس‌های مختلفی استفاده کنید (توضیحات آن در وب‌سایت در بخش «طرح‌ها» آمده است)، اما حتی در این مورد هم برای هر روش محدودیت‌های خاصی وجود دارد و اغلب از الگوریتم‌های نرم‌افزاری پیچیده استفاده می‌کنند.

ما روش اتصال نشانگر از طریق رابط SPI را بررسی خواهیم کرد که تنها به 3 خط ورودی/خروجی میکروکنترلر نیاز دارد. در همان زمان، کنترل تمام بخش های نشانگر باقی خواهد ماند.

برای اتصال نشانگر 4 بیتی به میکروکنترلر از طریق گذرگاه SPI، از تراشه درایور تخصصی تولید شده توسط این شرکت استفاده می شود. این ریز مدار قادر به هدایت هشت نشانگر هفت بخش با یک کاتد مشترک است و شامل رمزگشای BCD، درایورهای قطعه، مدار مالتی پلکس و رم استاتیک برای ذخیره مقادیر رقمی است.

جریان عبوری از بخش های نشانگر تنها با استفاده از یک مقاومت خارجی تنظیم می شود. علاوه بر این، تراشه از کنترل روشنایی نشانگر (16 سطح روشنایی) با استفاده از PWM داخلی پشتیبانی می کند.

مدار مورد بحث در مقاله یک مدار ماژول نمایشگر با رابط SPI است که می تواند در طراحی های رادیویی آماتور استفاده شود. و ما بیشتر علاقه مندیم نه به خود مدار، بلکه به کار با میکرو مدار از طریق رابط SPI. توان ماژول +5 V به پین ​​Vcc عرضه می شود، خطوط سیگنال MOSI، CLK و CS برای ارتباط بین دستگاه اصلی (میکروکنترلر) و Slave (تراشه MAX7219) در نظر گرفته شده است.

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

داده ها در بسته های 16 بیتی (دو بایت) به تراشه منتقل می شوند که در رجیستر شیفت 16 بیتی داخلی در هر لبه افزایشی سیگنال CLK قرار می گیرند. ما یک بسته 16 بیتی را به عنوان D0-D15 نشان می دهیم، که در آن بیت های D0-D7 حاوی داده ها، D8-D11 حاوی آدرس ثبت هستند، بیت های D12-D15 معنی ندارند. بیت D15 مهم ترین بیت است و اولین بیت دریافتی است. اگرچه این تراشه قادر به کنترل هشت نشانگر است، اما ما تنها با چهار نشانگر کار خواهیم کرد. آنها توسط خروجی های DIG0 - DIG3 کنترل می شوند که به ترتیب از راست به چپ قرار دارند، آدرس های 4 بیتی (D8-D11) که مربوط به آنها هستند 0x01، 0x02، 0x03 و 0x04 (فرمت هگزا دسیمال) هستند. ثبت رقم با استفاده از RAM روی تراشه با سازماندهی 8x8 پیاده سازی می شود و مستقیماً آدرس پذیر است به طوری که هر رقم جداگانه روی صفحه نمایش را می توان در هر زمان به روز کرد. جدول زیر ارقام آدرس پذیر و رجیسترهای کنترل تراشه MAX7219 را نشان می دهد.

ثبت نام

نشانی

مقدار HEX

بدون عملیات

حالت رمزگشایی

تعداد شاخص ها

خاموش شدن

تست شاخص

ثبت های کنترل

تراشه MAX1792 دارای 5 رجیستر کنترل است: حالت رمزگشایی (Decode-Mode)، کنترل روشنایی نشانگر (Intensity)، رجیستر تعداد نشانگرهای متصل (Scan Limit)، کنترل روشن/خاموش (Shutdown)، حالت تست (Display Test).

روشن و خاموش کردن تراشه

هنگامی که برق به تراشه اعمال می شود، همه رجیسترها ریست می شوند و به حالت Shutdown می رود. در این حالت نمایشگر خاموش است. برای تغییر حالت عملکرد عادی، بیت D0 از رجیستر Shutdown (آدرس 0Сh) باید تنظیم شود. این بیت را می توان در هر زمان پاک کرد تا درایور مجبور به خاموش شدن شود و محتویات همه رجیسترها بدون تغییر باقی بماند. این حالت را می توان برای صرفه جویی در مصرف انرژی یا در حالت هشدار با چشمک زدن نشانگر (فعال و غیرفعال کردن متوالی حالت خاموش کردن) استفاده کرد.

ریز مدار با انتقال متوالی آدرس (0Сh) و داده ها (00h) به حالت خاموش شدن سوئیچ می شود و با انتقال 0Ch (آدرس) و سپس 01h (داده) به عملکرد عادی باز می گردد.

حالت رمزگشایی

با استفاده از ثبت انتخاب حالت رمزگشایی (آدرس 09h)، می توانید از رمزگشایی کد BCD B (نمایش کاراکترهای 0-9، E، H، L، P، -) یا بدون رمزگشایی برای هر رقم استفاده کنید. هر بیت در ثبات مربوط به یک رقم است، تنظیم یک عدد منطقی مربوط به روشن کردن رمزگشا برای این بیت است، تنظیم 0 به این معنی است که رمزگشا غیرفعال است. اگر از رمزگشای BCD استفاده شود، تنها کمترین ریز داده در رجیسترهای رقمی (D3-D0) در نظر گرفته می‌شود، بیت‌های D4-D6 نادیده گرفته می‌شوند، بیت D7 به رسیور BCD وابسته نیست و مسئول روشن کردن است. نقطه اعشار روی نشانگر اگر D7 = 1 باشد. به عنوان مثال، هنگامی که بایت های 02h و 05h به ترتیب ارسال می شوند، نشانگر DIG1 (رقم دوم از سمت راست) عدد 5 را نمایش می دهد. به طور مشابه، هنگام ارسال 01h و 89h، نشانگر DIG0 عدد 9 را با اعشار درج می کند. . جدول زیر فهرست کاملی از کاراکترهای نمایش داده شده در هنگام استفاده از رمزگشای BCD آی سی را نشان می دهد.

سمبل

داده ها در رجیسترها

بخش های فعال = 1

خالی

*نقطه اعشار با بیت D7=1 تنظیم می شود

هنگامی که رمزگشا BCD از عملکرد حذف می شود، بیت های داده D7-D0 با خطوط قطعه (A-G و DP) نشانگر مطابقت دارند.

کنترل روشنایی نشانگر

این تراشه به شما امکان می دهد تا با استفاده از PWM داخلی، روشنایی نشانگرها را به صورت برنامه ای کنترل کنید. خروجی PWM توسط نوک پایین مرتبه (D3-D0) رجیستر شدت (آدرس 0Ah) کنترل می شود که به شما امکان می دهد یکی از 16 سطح روشنایی را تنظیم کنید. هنگامی که تمام بیت های یک نیبل بر روی 1 تنظیم می شوند، حداکثر روشنایی نشانگر انتخاب می شود.

تعداد نشانگرهای متصل

رجیستر Scan-Limit (آدرس 0Bh) مقدار تعداد بیت های سرویس شده توسط ریزمدار (1 ... 8) را تنظیم می کند. برای نسخه 4 بیتی ما، مقدار 03h باید در رجیستر نوشته شود.

تست شاخص

رجیستر مسئول این حالت در آدرس 0Fh قرار دارد. با تنظیم بیت D0 در ثبات، کاربر تمام بخش های نشانگر را روشن می کند، در حالی که محتویات رجیسترهای کنترل و داده تغییر نمی کند. برای غیرفعال کردن حالت Display-Test، بیت D0 باید 0 باشد.

رابط با میکروکنترلر

ماژول نشانگر را می توان به هر میکروکنترلری که دارای سه خط ورودی/خروجی آزاد است متصل کرد. اگر میکروکنترلر دارای یک ماژول سخت افزاری داخلی SPI باشد، ماژول نشانگر را می توان به عنوان یک دستگاه برده در اتوبوس متصل کرد. در این حالت، خطوط سیگنال SPI SDO (خروج داده های سریال)، SCLK (ساعت سریال) و SS (انتخاب برده) میکروکنترلر می توانند مستقیماً به پین ​​های MOSI، CLK و CS تراشه MAX7219 (ماژول) متصل شوند. سیگنال CS کم است.

اگر میکروکنترلر دارای SPI سخت افزاری نباشد، رابط را می توان در نرم افزار سازماندهی کرد. ارتباط با MAX7219 با کشیدن و پایین نگه داشتن خط CS آغاز می شود، سپس 16 بیت داده را به صورت متوالی (ابتدا MSB) روی خط MOSI در لبه افزایشی سیگنال CLK ارسال می کند. پس از اتمام انتقال، خط CS دوباره بالا می رود.

در بخش دانلودها، کاربران می توانند متن منبع برنامه آزمایشی و فایل HEX سیستم عامل را دانلود کنند که یک شمارنده معمولی 4 بیتی با نمایش مقادیر روی یک ماژول نشانگر با رابط SPI پیاده سازی می کند. میکروکنترلر مورد استفاده یک رابط پیاده سازی شده در نرم افزار است، خطوط سیگنال CS، MOSI و CLK ماژول نشانگر به ترتیب به پورت های GP0، GP1 و GP2 متصل می شوند. کامپایلر mikroC برای میکروکنترلرهای PIC استفاده می شود ()، اما کد را می توان برای سایر کامپایلرهای سطح بالا تغییر داد. میکروکنترلر با فرکانس ساعت 4 مگاهرتز از نوسانگر داخلی RC کار می کند، خروجی MCLR غیرفعال است.

این ماژول می تواند به پلتفرم آردوینو نیز متصل شود. برای کار با آن، به کتابخانه LedControl نیاز دارید که برای دانلود در وب سایت آردوینو موجود است.

دانلودها

سورس کد برنامه تست و فایل HEX برای فلش کردن فریمور میکروکنترلر -

  • این انصاف نیست!!! نامگذاری موضوع "اتصال ماتریس LED با یک کنترل کننده هوشمند از طریق یک رابط سیم پایین" صحیح تر است. شما می توانید چنین شهر کوچکی را خودتان بسازید - روی نشانگر چیزی از PIC12-PIC16 با پروتکل مناسب قرار دهید (microLAN، SPI، I2C، rs232 یا چیز خانگی دیگری - فقط حالت USART همزمان). اکنون تعداد کافی خانواده های مختلف MK وجود دارد - وقت آن است که به کار با مدارهای متشکل از چندین MK بروید که هر کدام وظیفه خود را انجام می دهند و سعی نکنید همه چیز را "روی یک سر" بارگیری کنید.
  • این یک مقاله برای بورژوازی لعنتی است! تراشه های Maxim بسیار گران هستند. راه حل بسیار ساده تری وجود دارد - رجیسترهای شیفت سریال-موازی. درست است که به سیم های بیشتری نیاز خواهید داشت - پایانه های مشترک نشانگرها را تغییر دهید. یا همانطور که یکی از همکاران به درستی اشاره کرد، از دو MK استفاده کنید. هنوز از تراشه های مکس ارزان تر است... Z.Y. با این حال، امکان ایجاد یک مدار جهانی با استفاده از دو رجیستر وجود دارد. سپس می‌توانید با چهار سیم: ساعت، داده، ضبط و علامت/مکان عبور کنید. تعداد مکان های آشنا فقط با ظرفیت بیتی ثبت نام ها محدود خواهد شد.
  • من خودم با شیفت رجیستر شروع کردم. اما بعد نپذیرفت. دلیلش هم ساده است. زمان قابل توجهی CPU برای نمایش مورد نیاز است. مناسب برای برنامه های ساده با افزایش حجم نرم افزار، روشنایی کاهش می یابد. جریان نشانگر را نیز نمی توان به مقادیر بیش از جریان ثابت بخش افزایش داد. برنامه ممکن است قطع شود. یک پردازنده جداگانه نیز گزینه ای نیست. مقاومت های پردازنده و ابعاد برد و سیم کشی 2/3 هزینه MAX7219 روی برد است. منظورم نمایشگر 8 رقمی است. من بارها و بارها Terraelectronics را با یک مشت چیزی در دستم ترک کردم. و چرا 6000-10000 چوبی دادی؟ و وقتی دستگاه را به مشتری تحویل می‌دهید، به یاد می‌آورید و فکر می‌کنید که چقدر من را از شر آن نجات داد و ارزشش را دارند. با گذشت زمان دیدگاه خود را تغییر خواهید داد.
  • اجازه دهید مخالفت کنم؛) حداقل تنظیم شده برای یک نشانگر 4 موقعیت * 8 بخش است: pic16f628a یا attiny2313 (خیلی بیشتر می خورد) در حالت اسکن "رستر"، روشنایی واقعاً خیلی زیاد نیست، اما حداقل جزئیات وجود دارد. در اکثر راه حل ها با جریان نسبتاً قابل توجهی از بخش و ولتاژ افزایش یافته (+11 - + 27 ولت DC ناپایدار)، فقط سوئیچ های "بالا" مشکل ایجاد می کنند (صرف نظر از آنچه با +U تغذیه می کنیم - قطعه یا آند نشانگر. ماتریس). مجموعه استاندارد: pic16f628a/attiny2313/، pic16f676 uln2803 tpic6b595 (hc595hc595 + uln2803) و مجموعه‌ای از ترانزیستورهای npn (طبق مدار منبع امیتر) به‌عنوان مدار سوئیچ امیتر به عنوان مدار سوئیچ امیتر، سوئیچ‌های استاندارد L37T -1LM به عنوان جریان فعال7L. با سطح شناخته شده و پایدار ولتاژ تامین کننده آندها، محاسبه مقاومت های پایه کلیدهای بالایی بسیار ساده است. برخی از مشکلات هنگام تغذیه با ولتاژ ثابت افزایش یافته و ناپایدار به وجود می آیند...:mad: یک راه حل با کمک ریزمدارهای تخصصی امکان پذیر است - اما آنها بسیار گران هستند، بنابراین "ترفندی" اختراع شد که سرعت آن کاملاً کافی است. ، و جزئیات بسیار محبوب هستند - مجموعه ای از چندین مقاومت ، 4N33 و یک ترانزیستور قدرتمند n-p-n (نمودار را در http://radiokot.ru/forum/download/file.php?id=93485 ببینید):)
  • در برخی موارد، شیفت رجیسترها توجیه می شوند. خوب، من طرح های ارزان قیمت را قبول نمی کنم. اگر مثلا یک تئودولیت الکترونیکی برای 80 بسازم. این یک LCD چهار خطی به قیمت 1000 روبل است. نیاز به خرید. فقط شرم آور است که وقت خود را برای نمایش تلف کنیم. کلیدها را لحیم کنید، زمان پردازشگر را تلف کنید - گرانترین است. و مشتری معمولا حساس است. روشنایی باید نرمال باشد. بله، شما فراموش کرده اید که هزینه یک مجموعه از قطعات را محاسبه کنید و فراموش نکنید که مابه التفاوت هزینه برد مدار چاپی (بیشتر خواهد بود) و زمان نصب را درج کنید. و یه چیز دیگه این مشخصات کار است. به عنوان مثال، PIC آویزان شد. می توان دلیل آن را فهمید. می توانید آخرین داده ها را قبل از شکست مشاهده کنید. در اینجا یک نمونه اخیر از یک نقص بسیار نادر و غیرقابل درک در برنامه به مدت 3 ماه آورده شده است. نمی دانستم کجا را نگاه کنم. در اینجا انگشتان کارگر نیز خرد شد. و وقتی آخرین داده ها را قبل از شکست دیدم، دلیل آن را فهمیدم.
  • تفاوت بین تجهیزات حرفه ای و محصولات خانگی آماتور همیشه بوده است، هست و خواهد بود - مدار توسعه یافته "باحال" به چینی ها واگذار شد و آنها به طور کلی آن را بر اساس "قطره" می سازند :) یک LED ابتدایی نیست. یک رقیب برای یک تک بلوک روی LCD (البته با استثنائات نادر). اما برای مثالی از یک کاربرد معمولی MK در نشانگرهای قابل جابجایی، نیازی به جستجوی دور ندارید - باید به راه حل به اصطلاح ثبت کننده های مالی (نمایش مشتری) توجه کنید - در آنجا، یک دستگاه می تواند از هر گزینه ای استفاده کند. (لومینسانس / LCD / LED) - تا زمانی که پروتکل ارتباطی پشتیبانی شود و مشتری آن را دوست داشته باشد (من آماده هستم برای آن پول بپردازم) ... درباره شروع توسعه بر اساس اصل "مشتری می تواند پرداخت کند؟" بیشتر... بنابراین کسی که پول زیادی دارد از شرکت‌ها چیز آماده می‌خرد و یا «از فقر» به یک کارگر خانه‌ساز روی می‌آورد، یا کاملاً سرخوش که می‌داند چگونه بهانه‌ای برای کلاهبرداری‌های بعدی پیدا کند. ...:mad: برای خودم، هر چیزی که در حال حاضر موجود است انجام می دهد (و نه همیشه تازه ترین - الان 12 سال است که یک ساعت رمترون در فروش ندیده ام :) ). علاوه بر هر چیز دیگری، عملا اکثر LSI های "تخصصی" بر اساس همان MK ها با یک برنامه ماسک ایجاد می شوند. ;)

بیایید یک نشانگر LED هفت بخش را به برد آردوینو متصل کنیم و یاد بگیریم که چگونه آن را با استفاده از کتابخانه Led4Digits.h کنترل کنیم.

درس قبلی به تفصیل میکروکنترلرها را توضیح داد. بیایید چنین نشانگری را به برد آردوینو وصل کنیم.

نمودار اتصال نشانگر به برد آردوینو به این صورت است.

من آن را روی یک برد مدار جمع کردم.

برای مدیریت نشانگرها، کتابخانه Led4Digits.h را نوشتم:

و پرداخت کنید.

این کتابخانه به شما امکان می دهد شاخص های هفت بخش را مدیریت کنید:

  • تا چهار رقم در اندازه؛
  • با هر نوع قطبیت پالس کنترلی (همه)؛
  • در یک فرآیند موازی کار می کند.
  • به شما امکان می دهد روی نشانگر نمایش دهید:
    • بخش های هر دسته؛
    • رقم هر رقم؛
    • عدد صحیح 0 ... 9999;
  • برای خروجی یک عدد صحیح می توان تعداد ارقام را مشخص کرد.
  • حالتی برای سرکوب ارقام ناچیز وجود دارد.

می توانید کتابخانه Led4Digits.h را از این لینک دانلود کنید:

و پرداخت کنید. فقط 25 روبل. در هر ماه برای دسترسی به تمام منابع سایت!

نحوه نصب در نوشته شده است.

من متون منبع را ارائه نمی دهم. می توانید آنها را در فایل های کتابخانه جستجو کنید. مثل همیشه، نظرات زیادی در آنجا وجود دارد. نحوه استفاده از کتابخانه را به تفصیل شرح خواهم داد.

کتابخانه کنترل LED برای Arduino Led4Digits.

اینم توضیحات کلاس من فقط روش ها و خواص عمومی را ارائه کردم.

کلاس Led4Digits (
عمومی:
رقم بایت؛ // کدهای کنترل بخش بیت
void regen(); // بازسازی، روش باید به طور منظم نامیده شود
void tetradToSegCod (بایت حفاری، بایت تتراد)؛ // تبدیل کدهای تتراد به بخش
چاپ بولی (مقدار int بدون علامت، عدد عدد بایت، بایت خالی)؛ // خروجی عدد صحیح



} ;

سازنده.

Led4Digits (نوع بایتLed، بایت digitPin0، بایت digitPin1، بایت digitPin2، بایت digitPin3،
بایت segPinA، بایت segPinB، بایت segPinC، بایت segPinD،
بایت segPinE، بایت segPinF، بایت segPinG، بایت segPinH).

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

تایپ شده انتخاب دسته انتخاب بخش نوع مدار
0 -_- -_- آند مشترک با کلیدهای انتخاب تخلیه
1 _-_ -_- آند مشترک
2 -_- _-_ کاتد مشترک
3 _-_ _-_ کاتد مشترک با کلیدهای انتخاب تخلیه

digitPin0...digitPin3- خروجی برای انتخاب ارقام. اگر digitPin = 255، رقم غیرفعال است. این به شما امکان می دهد نشانگرها را با ارقام کمتر متصل کنید. digitPin0 - رقم پایین (راست).

segPinA...segPinH– خروجی های کنترل بخش

مثلا،

معنی: نشانگر نوع 1؛ خروجی های تخلیه 5،4،3،2; خروجی های بخش های 6،7،8،9،10،11،12،13.

روش void regen()

روش باید به طور منظم در یک فرآیند موازی فراخوانی شود. تصویر را روی نشانگرها بازسازی می کند. زمان چرخه بازسازی برابر است با دوره فراخوانی روش ضرب در تعداد بیت ها.

مثلا،

// کنترل کننده وقفه 2 میلی ثانیه
void timerInterrupt() (
disp.regen(); // بازسازی شاخص
}

آرایه رقمی بایت

شامل وضعیت بخش ها است. رقم کم اهمیت ترین بیت است، کم اهمیت ترین بیت رقم، بخش "A" بیت کم اهمیت است. حالت بیت 1 به این معنی است که بخش روشن است.

مثلا،

رقم = B0000101;

به این معنی که در رقم دوم، بخش های "A" و "C" روشن می شوند.

نمونه ای از برنامه ای که به طور متوالی تمام بخش های هر رقم را روشن می کند.

// بخش های در حال اجرا
#عبارتند از
#عبارتند از

//
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
وقفه تایمر 2 میلی ثانیه
MsTimer2::start(); // وقفه فعال کردن
}

حلقه خالی() (
برای (int i = 0; i< 32; i++) {
if (i == 0) disp.digit= 1;
else if (i == 8) disp.digit= 1;
else if (i == 16) disp.digit= 1;
else if (i == 24) disp.digit= 1;
دیگر(
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
}
تاخیر(250);
}
}

//کنترل کننده وقفه 2 میلی ثانیه
void timerInterrupt() (
disp.regen(); // بازسازی شاخص
}

در آرایه رقمی، 1 جابجا می شود و نشانگرها این را نشان می دهند.

روش void tetradToSegCod (بایت حفاری، بایت تتراد)

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

  • dig – رقم شماره 0 ... 3;
  • تتراد - کد کاراکتر اعشاری. کد 0 عدد "0"، کد 1 - عدد "1"، کد 14 - حرف "E" را نمایش می دهد.

مثلا،

tetrad(2, 7);

عدد "7" را در رقم سوم نمایش می دهد.

نمونه ای از برنامه ای که کاراکترهای هر رقم را به نوبه خود تغییر می دهد.

// اعداد یکی یکی
#عبارتند از
#عبارتند از

// نشانگر نوع 1; خروجی های تخلیه 5،4،3،2; خروجی های بخش 6،7،8،9،10،11،12،13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2، timerInterrupt); // وقفه تایمر 2 میلی ثانیه
MsTimer2::start(); // وقفه فعال کردن
}

حلقه خالی() (
برای (int i = 0; i< 64; i++) {
disp.tetradToSegCod(i>>4, i);
تاخیر(250);
}
}

// کنترل کننده وقفه 2 میلی ثانیه
void timerInterrupt() (
disp.regen(); // بازسازی شاخص
}

روش چاپ بولی (مقدار int بدون علامت، عدد عدد بایت، بایت خالی)

این روش یک عدد صحیح را روی نشانگرها نمایش می دهد. این عدد باینری را برای هر رقم به BCD تبدیل می کند. استدلال دارد:

  • مقدار - عددی که روی نشانگر نمایش داده می شود.
  • digitNum - تعداد ارقام برای عدد. این نباید با تعداد ارقام نشانگر اشتباه گرفته شود. ممکن است بخواهید یک عدد را روی 2 رقم نمایش دهید و نویسه ها را روی دو رقم دیگر با استفاده از رقم نمایش دهید.
  • خالی - نشانه ای از سرکوب ارقام ناچیز. blank=0 یعنی عدد باید با تمام صفرها نمایش داده شود. عدد "7" شبیه "0007" خواهد بود. اگر خالی با 0 متفاوت باشد، صفرهای ناچیز سرکوب می شوند.

اگر مقدار عدد از عدد مجاز برای تعداد ارقام انتخاب شده (digitNum) بیشتر شود، تابع "---" را روی نشانگر نمایش می دهد و false را برمی گرداند.

نمونه ای از برنامه خروجی عدد.

// شماره خروجی
#عبارتند از
#عبارتند از

// نشانگر نوع 1; خروجی های تخلیه 5،4،3،2; خروجی های بخش 6،7،8،9،10،11،12،13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2، timerInterrupt); // وقفه تایمر 2 میلی ثانیه
MsTimer2::start(); // وقفه فعال کردن
}

حلقه خالی() (
برای (int i = 0; i< 12000; i++) {
disp.print(i, 4, 1);
تاخیر (50);
}
}

// کنترل کننده وقفه 2 میلی ثانیه
void timerInterrupt() (
disp.regen(); // بازسازی شاخص
}

دو روش آخر وضعیت بخش "H" - نقطه اعشار را تغییر نمی دهد. برای تغییر وضعیت یک نقطه، می توانید از دستورات زیر استفاده کنید:

رقم |= 0x80; // نقطه اعشار را روشن کنید
رقم &= 0x7f; // نقطه اعشار را خاموش کنید

خروجی به شاخص های اعداد منفی (int).

اعداد منفی را می توان به صورت زیر خروجی داد:

  • علامت عدد را بررسی کنید.
  • اگر عدد منفی است، علامت منفی را در مهم ترین رقم چاپ کنید و علامت عدد را در تابع print() به مثبت تغییر دهید.
  • اگر عدد مثبت است، بیت علامت را خاموش کنید و با استفاده از تابع print() عدد را چاپ کنید.

در اینجا برنامه ای وجود دارد که این روش را نشان می دهد. اعداد از -999 تا 999 را خروجی می دهد.

// خروجی اعداد منفی
#عبارتند از
#عبارتند از

// نشانگر نوع 1; خروجی های تخلیه 5،4،3،2; خروجی های بخش 6،7،8،9،10،11،12،13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2، timerInterrupt); // وقفه تایمر 2 میلی ثانیه
MsTimer2::start(); // وقفه فعال کردن
}

حلقه خالی() (

برای (int i = -999; i< 1000; i++) {

اگر من< 0) {
// عدد منفی است
disp.digit= B01000000; // امضا کردن -
disp.print(i * -1, 3, 1);
}
دیگر(
disp.digit= B00000000; // علامت را پاک کنید
disp.print(i, 3, 1);
}

تاخیر (50);
}
}

// کنترل کننده وقفه 2 میلی ثانیه
void timerInterrupt() (
disp.regen(); // بازسازی شاخص
}

خروجی به نشانگرهای اعداد کسری، فرمت شناور.

راه های زیادی برای نمایش اعداد ممیز شناور با استفاده از توابع استاندارد زبان C وجود دارد. بسیار کند کار می کند، نیاز به تبدیل اضافی کدهای کاراکتر به کدهای اعشاری باینری دارد، شما باید یک نقطه را از یک رشته استخراج کنید. مشکلات مشابه با سایر توابع.

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

  • عدد ممیز شناور در 10 ضرب می شود و به توان مربوط به تعداد ارقام اعشاری مورد نیاز است. اگر باید 1 رقم اعشار را روی نشانگرها نمایش دهید، در 10 ضرب کنید، اگر 2 باشد، سپس در 100، 3 رقم اعشار در 1000 ضرب کنید.
  • سپس، عدد ممیز شناور به صراحت به یک عدد صحیح (int) تبدیل می‌شود و با استفاده از تابع print() روی نشانگرها نمایش داده می‌شود.
  • یک نقطه در رقم مورد نیاز قرار می گیرد.

به عنوان مثال، خطوط زیر یک متغیر شناور با دو رقم اعشار به LED های هفت قسمتی خروجی می دهد.

float x = 2.12345;

disp.digit |= 0x80; //

عدد را در 100 ضرب می کنیم و با قرار دادن نقطه در رقم سوم حاصل را بر 100 تقسیم می کنیم.

در اینجا برنامه ای وجود دارد که اعداد ممیز شناور را از 0.00 تا 99.99 روی نشانگرها نمایش می دهد.

// خروجی ممیز شناور
#عبارتند از
#عبارتند از

// نشانگر نوع 1; خروجی های تخلیه 5،4،3،2; خروجی های بخش 6،7،8،9،10،11،12،13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2، timerInterrupt); // وقفه تایمر 2 میلی ثانیه
MsTimer2::start(); // وقفه فعال کردن
}

حلقه خالی() (
شناور x = 0;

برای (int i = 0; i< 10000; i++) {
x += 0.01;

disp.print((int)(x * 100.), 4, 1);
disp.digit |= 0x80; // نقطه سطح سوم را روشن کنید

تاخیر (50);
}
}

//کنترل کننده وقفه 2 میلی ثانیه
void timerInterrupt() (
disp.regen(); // بازسازی شاخص
}

همانطور که می بینید، کتابخانه Led4Digits.h کار با نشانگرهای دیود ساطع نور هفت بخش (LED) متصل به برد آردوینو را بسیار ساده می کند. من مشابهی از چنین کتابخانه ای پیدا نکردم.

کتابخانه هایی برای کار با نمایشگرهای LED از طریق شیفت رجیستر وجود دارد. شخصی برای من نوشت که آنها یک کتابخانه پیدا کردند که با یک صفحه نمایش LED کار می کند که مستقیماً به برد آردوینو متصل است. اما هنگام استفاده از آن، ارقام نشانگر به طور ناهموار می درخشند و چشمک می زنند.

برخلاف آنالوگ هایش، کتابخانه Led4Digits.h:

  • به عنوان یک فرآیند موازی اجرا می شود. در حلقه اصلی، برنامه داده ها را در متغیرهای خاصی بارگذاری می کند که به طور خودکار روی نمایشگر نمایش داده می شوند. خروجی اطلاعات و بازسازی نشانگر در یک وقفه تایمر رخ می دهد که برای برنامه اصلی نامرئی است.
  • اعداد نمایشگر به طور یکنواخت بدون چشمک زدن می درخشند. این ویژگی با این واقعیت تضمین می شود که بازسازی در یک چرخه به طور دقیق توسط یک وقفه تایمر تعریف شده است.
  • این کتابخانه دارای کد فشرده است، به سرعت اجرا می شود و کنترل کننده را به حداقل می رساند.

در درس بعدی یک نشانگر LED و یک ماتریس دکمه را به طور همزمان به برد آردوینو متصل می کنیم. بیایید برای چنین طراحی یک کتابخانه بنویسیم.

دسته بندی: . می توانید آن را نشانه گذاری کنید.

این مقاله به مجموعه مقالات من در مورد سازماندهی نشانگرهای دینامیکی در میکروکنترلرهای PIC و نشانگرهای LED ادامه می دهد. اینم لینک های پست های قبلی:

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

در هر یک از وقفه ها با فاصله 2 میلی ثانیه (در این مورد از تایمر TMR0)، یک مرحله نشانگر دینامیکی (DI) طبق الگوریتمی تهیه می شود که شامل پنج مرحله کنترل رجیستر و نشانگر است.

فاز 2: لبه مثبت در پایه 12 رجیستر (ST_CP) حالت صفر رجیستر را روی لچ خروجی می نویسد. در اینجا و بیشتر، قبل از شروع نشانگر، نشانگر با پتانسیل صفر در بخش ها خاموش می شود.

فاز سوم: با کنترل پایه های ثبات 14 (DS - data) و 11 (SH_CP - clock) کد کنترل سگمنت ها در آن نوشته می شود.

فاز 4: با افت مثبت در پایه 12 رجیستر، داده های رجیستر در لچ خروجی نوشته می شود و به دلیل سطوح مثبت روی بیت ها، نشانگر خاموش می ماند.

مرحله 5: در اینجا کد مورد نیاز به خروجی ارقام نشانگر داده می شود و سپس نشانه واقعی رخ می دهد.

اگر مدار از یک نشانگر 4 رقمی استفاده می کند، برای عملکرد صحیح باید روی OK تنظیم شود. اگر نیاز به کنترل 8 بیت دارید، از 8 پورت MK استفاده می شود، در حالی که 4 پورت باقی مانده به سادگی بیت ها را کنترل می کنند (در فاز 4 آنها باید سطح بالایی داشته باشند). شایان ذکر است که در این حالت می توان از نشانگرهایی با هر دو OK و OA استفاده کرد که به ترتیب بخش ها یا ارقام را به رجیستر متصل می کند (به دلایل ذکر شده در زیر، در حالت اول ترجیحاً سازماندهی بخش DI به تفکیک بخش، و در دوم - بیت به بیت).

با استفاده از این روش، می توانید دو نشانگر چهار بیتی را با استفاده از یک شیفت رجیستر به PIC16F676 MCU متصل کنید، در حالی که چهار پورت رایگان برای استفاده باقی می گذارید. به عنوان مثال، برای چنین اتصالی، افراد از ترکیب توابع ورودی DI و آنالوگ در برخی از پورت های MK استفاده کردند (به نظر من، یک تصمیم بسیار مشکوک) که منجر به پیچیدگی قابل توجه مدار و برخی محدودیت ها شد که نویسندگان هشدار در مورد. با استفاده از نمودار اتصال من، همه چیز به سادگی و زیبایی حل می شود - ورودی های جداگانه، نشانه های جداگانه، به علاوه دو پورت دیگر (از جمله MCLR) برای دکمه ها.

برای آزمایش این روش کنترل، مدار ساده زیر بر روی PIC12F629 MCU و نشانگر FYQ3641A پیشنهاد شده است که به طور متناوب کلمه "test" و عدد 1234 را روی نشانگر نمایش می دهد.

در اینجا تصمیم گرفته شد که از یک بخش به بخش DI استفاده شود (هر لحظه یک قطعه روشن می شود و یک کد روی پایه های بیت وجود دارد که در هر بیت: 0 - اگر این بخش باید در یک بیت مشخص روشن شود و 1 - در غیر این صورت)، که در آن جریان های پیک به رجیستر منتقل می شود. چرا؟ دو دلیل برای این وجود دارد: اول اینکه حداکثر ظرفیت بار خروجی های 74HC595 35 میلی آمپر در مقابل 25 میلی آمپر برای کنترل کننده های PIC است. نکته دوم و اصلی این است که یک جریان نزدیک به حد مجاز از طریق درگاه خروجی MK از نظر تئوری می تواند پتانسیل خروجی خود را تا سطح سوئیچینگ ورودی های ثبت افزایش دهد که منجر به خطا در عملکرد می شود. و بنابراین، جریان های 6-7 میلی آمپر به درگاه های MK جریان می یابد و پتانسیل های موجود در خروجی ها مطمئناً از سطح TTL تجاوز نمی کند.

همانطور که در بالا ذکر شد، فاصله وقفه 2 میلی ثانیه است که مطابق با نرخ تجدید نشانگر 64 هرتز است و درخشش آن برای چشم کاملاً راحت است.

این روش DI، از جمله موارد دیگر، امکان نصف کردن تعداد مقاومت‌های محدودکننده جریان (R2-R5) را فراهم کرد.

این دستگاه بر روی تخته نان به اصطلاح "بدون لحیم کاری" مونتاژ می شود.

نشانگر را می توان با هر یک از سری های 3641A جایگزین کرد.

مدار توسط یک منبع تثبیت شده 5 ولت تغذیه می شود.

برنامه کنترل MK به زبان C نوشته شده و در محیط ترجمه شده است.

کد در MikroC، پروژه، فایل HEX در برنامه.

برای استفاده از این روش اتصال در توسعه های تجاری، لطفا با من تماس بگیرید.

فهرست عناصر رادیویی

تعیین تایپ کنید فرقه تعداد توجه داشته باشیدخرید کنیددفترچه یادداشت من
DD1 MK PIC 8 بیتی

PIC12F629

1 به دفترچه یادداشت
DD2 ثبت نام74HC5951 به دفترچه یادداشت
H.L. شاخصFYQ36411 به دفترچه یادداشت
R1 مقاومت

30 کیلو اهم

1 به دفترچه یادداشت
R2 مقاومت

430 اهم

1 به دفترچه یادداشت
R3 مقاومت

430 اهم

1
اگر خطایی پیدا کردید، لطفاً یک متن را انتخاب کنید و Ctrl+Enter را فشار دهید.