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

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

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

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

انواع نشانگرهای LED.

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

بخش ها با حروف لاتین از "A" تا "H" مشخص می شوند.

آندها یا کاتدهای هر LED در نشانگر ترکیب شده و یک سیم مشترک را تشکیل می دهند. بنابراین، شاخص هایی با یک آند مشترک و یک کاتد مشترک وجود دارد.

نشانگر LED با آند مشترک.

نشانگر LED کاتد مشترک

کنترل ال ای دی استاتیک

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

محاسبه مقاومت مانند LED های جداگانه است.

R = ( عرضه U - بخش U) / قطعه I

برای این مدار: قطعه I = (5 - 1.5) / 1000 = 3.5 میلی آمپر

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

در نمودار اتصال نشانگر با کاتد مشترک، قطبیت سیگنال های منبع تغذیه و کنترل تغییر می کند.

بخش روشن می شود که بر روی خروجی کنترلی که از آن تشکیل می شود سطح بالا(5 V).

حالت کنترل LED مالتی پلکس.

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

نتیجه گیری از بخش هایی با همان نام هر شاخص ترکیب شده است. به نظر می رسد ماتریسی از LED های متصل بین خروجی های بخش ها و خروجی های مشترک نشانگرها. در اینجا مداری برای کنترل چندگانه یک نشانگر سه رقمی با یک آند مشترک وجود دارد.

برای اتصال سه نشانگر، 11 پین مورد نیاز بود، و نه 24، مانند حالت کنترل استاتیک.

با نشانگر پویا، هر بار فقط یک رقم روشن می شود. یک سیگنال سطح بالا (5 ولت) به خروجی مشترک یکی از بیت ها اعمال می شود و سیگنال های سطح پایین برای بخش هایی که باید در این بیت روشن شوند به خروجی های قطعه ارسال می شود. پس از مدت زمان مشخصی، ترشحات بعدی مشتعل می شود. سطح بالایی به خروجی مشترک آن اعمال می شود و سیگنال های وضعیت این بیت به خروجی های قطعه ارسال می شود. و به همین ترتیب برای همه بیت ها در یک حلقه بی نهایت. زمان چرخه را زمان تجدید نشانگر می نامند. اگر زمان بازسازی به اندازه کافی کوتاه باشد، چشم انسان متوجه تغییر ترشحات نمی شود. به نظر می رسد که تمام ترشحات به طور مداوم می درخشند. برای جلوگیری از سوسو زدن نشانگرها، فرکانس چرخه بازسازی باید حداقل 70 هرتز باشد. من سعی می کنم حداقل از 100 هرتز استفاده کنم.

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

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

محاسبه عناصر نشانگر دینامیکی نشانگرهای دیود ساطع نور (LED).

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

  • جریان متوسط ​​بخش ها؛
  • بخش های جریان ضربه ای؛
  • مقاومت مقاومت قطعه؛
  • جریان پالسی نتایج مشترک تخلیه ها.

زیرا ارقام نشانگر به نوبه خود روشن می شوند، سپس روشنایی درخشش جریان متوسط ​​را تعیین می کند. ما باید آن را بر اساس پارامترهای نشانگر و روشنایی مورد نیاز انتخاب کنیم. جریان متوسط ​​روشنایی نشانگر را در سطحی مطابق با کنترل استاتیک با همان جریان ثابت تعیین می کند.

بیایید یک جریان متوسط ​​قطعه 1 میلی آمپر را انتخاب کنیم.

حال بیایید جریان ضربه ای قطعه را محاسبه کنیم. برای تامین جریان متوسط ​​مورد نیاز، جریان پالسی باید N برابر بیشتر باشد. جایی که N تعداد ارقام نشانگر است.

من segm. بد = من سگم. میانگین * ن

برای طرح ما من segm. بد = 1 * 3 = 3 میلی آمپر.

مقاومت مقاومت هایی که جریان را محدود می کنند را محاسبه می کنیم.

R \u003d (قدرت U - بخش U) / بخش I. بد

R \u003d (5 - 1.5) / 0.003 \u003d 1166 اهم

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

من طبقه بندی imp. = من سگم. بد * هشت

برای طرح ما من impar را تخلیه می کنم. = 3 * 8 = 24 میلی آمپر.

  • مقاومت مقاومت ها 1.1 کیلو اهم انتخاب شده است.
  • خروجی های میکروکنترلر کنترل سگمنت باید جریان حداقل 3 میلی آمپر را ارائه دهند.
  • خروجی های میکروکنترلر برای انتخاب رقم نشانگر باید حداقل 24 میلی آمپر جریان داشته باشد.

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

طرح هایی با کلیدهای اضافی

اگر نشانگرها به جریان بیشتری نیاز دارند، باید از سوئیچ های اضافی مخصوصاً برای سیگنال های انتخاب رقم استفاده شود. مجموع جریان تخلیه 8 برابر جریان یک قطعه است.

نمودار سیم کشی یک نشانگر LED با یک آند مشترک در حالت مالتی پلکس با سوئیچ های ترانزیستوری برای انتخاب ارقام.

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

نمودار سیم کشی یک نشانگر LED با یک کاتد مشترک در حالت مالتی پلکس با سوئیچ های ترانزیستوری برای انتخاب ارقام.

برای انتخاب یک بیت در این مدار، لازم است یک سیگنال سطح بالا تولید شود. سوئیچ مربوطه خروجی مشترک تخلیه به زمین را باز و بسته می کند.

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

کلیدهای نشانگرهایی با افزایش ولتاژ تغذیه.

نشانگرهایی از اندازه های بزرگ وجود دارد که در آن هر بخش از چندین LED متصل به صورت سری تشکیل شده است. برای تغذیه چنین نشانگرها، منبعی با ولتاژ بیشتر از 5 ولت مورد نیاز است. سوئیچ ها باید سوئیچینگ ولتاژ بالا را که توسط سیگنال های سطح میکروکنترلر کنترل می شود (معمولاً 5 ولت) ارائه دهند.

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

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

بین تعویض بیت های نشانگر برای مدت کوتاهی (1-5 میکرو ثانیه)، همه بخش ها باید خاموش شوند. این زمان برای تکمیل فرآیندهای گذرا کلیدهای سوئیچینگ ضروری است.

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

در درس بعدی یک نشانگر LED هفت قسمتی را به برد آردوینو وصل می کنیم، یک کتابخانه برای کنترل آن می نویسیم.

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

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


الگوریتم نشان‌دهنده به این صورت است: ابتدا سطوح منطقی مورد نیاز را روی خطوط تنظیم می‌کنیم، بسته به اینکه کدام بخش باید در اولین نشانگر روشن شود (نشان از چپ به راست)، با سطح منطقی بالا برای روشن کردن، پایین تا بخش را خاموش کنید در مرحله بعد، سطح منطقی بالایی را به پایه ترانزیستور VT1 اعمال می کنیم، در نتیجه کاتد مشترک اولین نشانگر به سیم مشترک متصل می شود، در این لحظه آن بخش ها روشن می شوند که روی آندهای آن یک واحد منطقی وجود دارد. پس از مدت زمان معین (مکث)، نشانگر را با اعمال سطح منطقی پایین به پایه ترانزیستور خاموش می کنیم، سپس مجدداً سطوح منطقی خطوط را مطابق با اطلاعات خروجی در نظر گرفته شده برای نشانگر دوم تغییر می دهیم و یک عدد ارسال می کنیم. سیگنال روشن به ترانزیستور VT2. بنابراین، به ترتیب در یک چرخه دایره‌ای، همه نشانگرها را تغییر می‌دهیم، این کل نشانه پویا است.

برای گرفتن یک تصویر جامد بدون سوسو زدن، سوئیچینگ باید با سرعت بالا انجام شود، برای جلوگیری از سوسو زدن LED ها، نرخ تجدید باید از 70 هرتز یا بیشتر تنظیم شود، من معمولا آن را روی 100 هرتز تنظیم می کنم. برای ساخت فوق، مکث به صورت زیر محاسبه می شود: برای فرکانس 100 هرتز، دوره 10 میلی ثانیه است، به ترتیب تنها 4 نشانگر وجود دارد، زمان درخشش هر نشانگر 10/4 = 2.5 میلی ثانیه تنظیم شده است. در یک مسکن نشانگرهای هفت قسمتی چند رقمی وجود دارد که در آن قطعاتی به همین نام در داخل خود هوزینگ به هم متصل می شوند که البته برای استفاده از آنها باید از نشانگر دینامیک استفاده کرد.

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

;اجرای اندیکاسیون پویا برای 4 اندیکاتور هفت قطعه ای ;;;;;;;;;;;;;; swapf STATUS,W ; وضعیت clrf ; movwf STATUS_TEMP ; ; bcf ind1 ;نشانگر 1 را خاموش کنید bcf ind2 ;نشانگر دوم را خاموش کنید bcf ind3 ;نشانگر سوم را خاموش کنید bcf ind4 ;نشانگر چهارم را خاموش کنید. incf shet,F ;increment register shet movlw .5 ;برگ محتویات ثبت را بررسی کنید shet xorwf,W ;بررسی کنید که برابر با 5 btfss STATUS,Z ; goto met1 ;تعداد در شیت رجیستر برابر با 5 movlw نیست .1 ;عدد در شیت رجیستر 5 است: شماره 1 را بنویسید movwf shet ;into shet register ; met1 movlw .1 ؛ بررسی رجیستر محتویات shet xorwf shet,W ؛ برابر با شماره 1 btfss STATUS,Z ; goto met2 ؛ عدد در رجیستر شیت برابر با 1 نیست: پرش به met2 movf datind1، W ؛ تعداد در رجیستر شیت برابر با 1 است: movwf PORTB را کپی کنید؛ محتویات ثبت نام datind1 را در رجیستر PORTB bsf ind1؛ اولین اندیکاتور met2 را روشن کنید. movlw .2 ;بررسی محتویات شیت ثبت xorwf shet,W ؛ برابر با 2 btfss STATUS,Z ; goto met3 ؛ شماره در رجیستر شیت برابر با 2 نیست: پرش به met3 movf datind2، W ؛ شماره در رجیستر شیت 2 است: movwf PORTB را کپی کنید ؛ محتویات datind2 را در ثبت PORTB ثبت کنید bsf ind2 ؛ نشانگر دوم را روشن کنید باید خروج کنید ؛ پرش به label exit met3 movlw .3 ؛ بررسی رجیستر محتویات shet xorwf shet,W ؛ برابر با 3 btfss STATUS,Z . goto met4 ؛ شماره در رجیستر شیت برابر با 3 نیست: پرش به met4 movf datind3، W ؛ شماره در رجیستر شیت 3 است: movwf PORTB را کپی کنید؛ محتویات ثبت نام datind3 را در رجیستر PORTB bsf ind3 روشن کنید؛ نشانگر 3 را روشن کنید، خروج را انتخاب کنید؛ پرش به label exit met4 movf datind4,W ;محتویات رجیستر datind3 movwf PORTB را کپی کنید ;در رجیستر PORTB bsf ind4 ;نشانگر چهارم را روشن کنید. movlw .100 ;نوشتن 156 به ثبت زمان سنج TMR0 movwf TMR0 ; ; وضعیت movwf ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; برنامه اصلی ................. movlw b"11010011"؛ OPTION_REG، در نتیجه داخلی را تنظیم می کند؛ نسبت پیش مقیاس کننده را 1:16 تنظیم می کند. صفحه clrf، تنظیم مجدد برگه ثبت، قبل از شروع، وقفه در سرریز TMR0، انجام شده. clrf datind1 ;پاک کردن رجیسترها برای خروجی اطلاعات به clrf datind2 ;نشانگرها، معادل خاموش کردن clrf datind3 ;نشانگرها به عنوان اندیکاتورهایی با clrf datind4 ;کاتد مشترک است. bcf INTCON,T0IF؛ پاک کردن وقفه سرریز TMR0 پرچم bsf INTCON,T0IE؛ فعال کردن وقفه های سرریز TMR0 bsf INTCON,GIE؛ فعال کردن وقفه های سراسری. movlw b"00000110" ؛ خروجی 13.52 نمونه movwf datind1 ; movlw b"11001111" ; movwf date2 ; movlw b"01101101" ; movwf date3 ; movlwb"01011011" ; movwf date4 ; ; . ................ .................; .................; ; پایان ؛ پایان کل برنامه

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;اجرای نشانگر پویا برای 4 اندیکاتور هفت بخش

فرکانس ساعت نمونه 4 مگاهرتز، چرخه ماشین 1 میکرو ثانیه

org 0000h؛ اجرای برنامه را در آدرس 0000h شروع کنید

goto Start ;به برچسب Start بروید

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

؛ وقفه در روال

org 0004h ;شروع اجرای زیربرنامه در آدرس 0004h

movwf W_TEMP ;مقادیر ثبت کلید را ذخیره کنید

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;نشانگر 1 را خاموش کنید

bcf ind2 ;نشانگر دوم را خاموش کنید

bcf ind3 ؛ نشانگر سوم را خاموش کنید

bcf ind4 ؛ نشانگر چهارم را خاموش کنید

incf shet,F ;ورق ثبت افزایشی

movlw .5 ؛ محتویات شیت ثبت را بررسی کنید

ورق xorwf، W ؛ برابر با 5

btfss STATUS,Z ;

goto met1 ؛ عدد در شیت رجیستر برابر با 5 نیست

movlw .1 ؛ عدد در شیت رجیستر 5 است: عدد 1 را بنویسید

برگه movwf ;ثبت برگه

met1 movlw .1 ؛ محتویات ثبت شیت را بررسی کنید

shet xorwf,W ؛ برابر با عدد 1

btfss STATUS,Z ;

goto met2 ؛ عدد در رجیستر 1 برابر نیست: پرش به met2

movf datind1,W ؛ شماره در رجیستر 1 است: کپی

movwf PORTB ؛ محتویات datind1 در رجیستر PORTB ثبت نام کنید

bsf ind1 ;نشانگر 1 را روشن کنید

goto exit ;برو به label exit

met2 movlw .2 ؛ محتویات ثبت شیت را بررسی کنید

shet xorwf,W ؛ برابر با عدد 2

btfss STATUS,Z ;

goto met3 ؛ عدد در رجیستر 2 برابر نیست: به met3 بروید

movf datind2,W ؛ شماره در رجیستر 2 است: کپی

movwf PORTB؛ محتویات datind2 به رجیستر PORTB ثبت نام کنید

bsf ind2 ;نشانگر دوم را روشن کنید

goto exit ;برو به label exit

met3 movlw .3 ؛ محتویات ثبت شیت را بررسی کنید

shet xorwf,W ؛ برابر با عدد 3

btfss STATUS,Z ;

goto met4 ؛ عدد در رجیستر برابر با 3 نیست: پرش به met4

movf datind3,W ؛ شماره در رجیستر 3 است: کپی

movwf PORTB؛ محتویات datind3 به رجیستر PORTB ثبت نام کنید

bsf ind3 ؛ نشانگر 3 را روشن کنید

goto exit ;برو به label exit

met4 movf datind4,W ؛ محتویات ثبت datind3 را کپی کنید

movwf PORTB ;به PORTB ثبت نام کنید

bsf ind4 ؛ نشانگر چهارم را روشن کنید

خروج از bcf INTCON,T0IF ؛ بازنشانی پرچم وقفه سرریز TMR0

movlw .100 ؛ عدد 156 را برای ثبت زمان سنج TMR0 بنویسید

swapf STATUS_TEMP،W؛ بازیابی محتویات رجیسترهای کلید

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;خروج از روال وقفه

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

؛ برنامه اصلی

شروع ................. راه اندازی اولیهثبت می کند

................. ؛هدف خاص

.................

bsf STATUS,RP0 ;نوشتن عدد باینری 11010011 جهت ثبت نام

movlw b"11010011" ;OPTION_REG، در نتیجه تنظیمات داخلی

movwf OPTION_REG؛ منبع ساعت برای TMR0

bcf STATUS,RP0 ;پیش مقیاس کننده را قبل از TMR0 فعال کنید

؛ نسبت پیش مقیاس کننده را روی 1:16 تنظیم کنید

clrf shet؛ رجیستر شیت را قبل از شروع بازنشانی کنید

وقفه سرریز TMR0، انجام شد

؛ یک بار پس از روشن شدن

clrf datind1؛ رجیسترهای روشن برای خروجی اطلاعات به

clrf datind2 ;شاخص ها، معادل خاموش

clrf datind3 ;شاخص‌ها، زیرا شاخص‌هایی با یک مشترک

clrf datind4 ;کاتد

bcf INTCON,T0IF ;پرچم وقفه سرریز TMR0 را بازنشانی کنید

bsf INTCON,T0IE ؛ وقفه های سرریز TMR0 را فعال کنید

bsf INTCON,GIE ؛ وقفه های سراسری را فعال کنید

movlw b"00000110"؛ نمونه خروجی 13.52

movlw b"11001111" ;

movlw b"01101101" ;

movlwb"01011011" ;

................. ;

................. ;

................. ;

پایان؛ پایان کل برنامه

در برنامه اصلی، ابتدا با استفاده از رجیستر OPTION_REG یک تایمر تنظیم کردیم، قبلاً در مورد استفاده از تایمر برای . در مرحله بعد، ثبت شیت را که برای وارد کردن تعداد از 1 تا 4 در نظر گرفته شده است، برای هر نشانگر پاک می کنیم. این ثبات در روال وقفه افزایش می یابد و در آنجا تنظیم می شود (از 1 تا 4 به حساب می آید) این تمیز کردنبعد از روشن شدن یکبار انجام می شود. بر اساس این رجیستر، ما تعیین خواهیم کرد که کدام اندیکاتور را شامل و داده های مربوط به آن را صادر کنیم. مرحله بعدی پاک کردن رجیسترهای ذخیره اطلاعات است، چهار رجیستر dataind1،2،3،4 مربوط به چهار شاخص. پاک کردن معادل خاموش کردن نشانگرها است، زیرا در روال سرویس وقفه، محتویات این رجیسترها به رجیستر PORTB منتقل می شود که آندهای نشانگر به آن متصل می شوند. این امر ضروری است تا پس از فعال شدن وقفه ها، هر گونه زباله روی نشانگرها نمایش داده نشود، در اصل اگر اطلاعات صحیح بلافاصله برای خروجی نوشته شود، نمی توان این کار را انجام داد. در مرحله بعد، پرچم وقفه سرریز تایمر را بازنشانی کنید، وقفه های سرریز TMR0 را فعال کنید و در نهایت وقفه های سراسری را فعال کنید.

در روال وقفه ابتدا همه نشانگرها را خاموش می کنیم (با اعمال سطوح منطقی پایین به پایه های ترانزیستورها)، چون معلوم نیست کدام یک روشن است. ما رجیستر برگ را افزایش می دهیم و برابری با عدد 5 را بررسی می کنیم، اگر چنین تطابقی وجود دارد، عدد 1 را در رجیستر بنویسید، زیرا باید از 1 تا 4 بشمارید. سپس بررسی می کنیم که کدام عدد در برگه است. ثبت، که به وسیله آن داده ها را از PORTB در رجیسترهای ذخیره سازی اطلاعات PORTB (dataind) برای نشانگر مربوطه بارگذاری می کنیم و آن را روشن می کنیم. پس از آن، پرچم وقفه سرریز TMR0 را بازنشانی می کنیم، عدد 100 را در تایمر می نویسیم (محاسبه این مقدار در زیر آورده شده است)، برای یک تاخیر زمانی، و از کنترل کننده وقفه خارج می شویم. در اولین وقفه، نشانگر اول روشن می شود، در وقفه دوم، وقفه دوم، و غیره در یک چرخه دایره ای. در برنامه اصلی، فقط بارگذاری داده ها در ثبت های ذخیره سازی اطلاعات برای هر نشانگر باقی می ماند. در زیربرنامه وقفه، ذخیره و بازیابی مقادیر رجیسترهای کلید را فراموش نکنید، در مقاله ای در مورد این موضوع نوشتم.

برای خروجی اعداد بهتر است از یک مولد کاراکتر به شکل جدول داده استفاده کنید. به عنوان مثال، برای نمایش عدد 3456 روی نشانگرها، باید آن را به ارقام تقسیم کرد، در حالی که بهتر است از ثبات های جداگانه برای ذخیره اعداد ارقام (از 0 تا 9) استفاده کنید، سپس این ثبات ها را از طریق مولد کاراکتر اجرا کنید. به دست آوردن بایت های صحیح (بارگذاری شده در رجیسترهای dataind) برای احتراق بخش های مربوطه.

فرکانس مولد ساعت را 4 مگاهرتز می گیریم، سیکل ماشین 1 میکرو ثانیه است. بگذارید نرخ تازه سازی هر نشانگر 100 هرتز باشد (دوره T = 10 ms) به ترتیب، تاخیر زمانی مورد نیاز 10/4 = 2.5 میلی ثانیه است. فاکتور پیش مقیاس کننده برای TMR0 روی 1:16 تنظیم شده است، در حالی که حداکثر تاخیر ممکن 256x16 = 4096 میکرو ثانیه است و ما به مکث 2.5 میلی ثانیه نیاز داریم. بیایید عددی را که باید روی TMR0 بنویسیم محاسبه کنیم: 256-((256x2.5)/4.096) = 256-156.25 = 99.75. پس از گرد کردن، عدد 100 را بدست می آوریم.

در زیر می توانید یک مدل برنامه پروتئوس، سیستم عامل و کد منبع با اجرای نشانگر پویا روی یک نشانگر 4 رقمی با کاتد مشترک با استفاده از میکروکنترلر PIC16F628A دانلود کنید. به عنوان مثال، اعداد 0000 روی نشانگر نمایش داده می شوند. 0001; 0002; 13.52; 9764.

اکنون اتصال ماتریسی با وضوح 8x8 پیکسل (LED) را در نظر بگیرید. ساختار یک ماتریس معمولاً بر حسب ردیف و ستون در نظر گرفته می شود. در تصویر زیر در هر ستون کاتد تمام ال ای دی ها و در هر ردیف آندها به هم وصل شده اند. رشته ها (8 خط، آند LED) از طریق مقاومت ها به میکروکنترلر متصل می شوند. هر ستون (کاتدهای LED) از طریق 8 ترانزیستور به میکروکنترلر متصل می شود. الگوریتم نشانگر یکسان است، ابتدا سطوح منطقی لازم را روی ردیف ها تنظیم می کنیم که مطابق با آن LED ها باید در ستون روشن شوند، سپس ستون اول را وصل می کنیم (نشان از چپ به راست). پس از یک مکث مشخص، ستون را خاموش می کنیم و سطوح منطقی خطوط را تغییر می دهیم تا ستون دوم نمایش داده شود، سپس ستون دوم را به هم وصل می کنیم. و بنابراین به طور متناوب همه ستون ها را رفت و آمد کنید. در زیر نموداری از اتصال ماتریس به میکروکنترلر نشان داده شده است.


در مجموع برای اتصال چنین ماتریسی به 16 پین میکروکنترلر نیاز است که بسیار زیاد است بنابراین برای کاهش خطوط کنترل بهتر است از رجیسترهای شیفت سریال استفاده کنید.

رایج ترین رجیستر سریال ریزمدار 74HC595 است که شامل یک رجیستر شیفت برای بارگذاری داده ها و یک ثبات نگهدارنده است که از طریق آن داده ها به خطوط خروجی منتقل می شود. بارگیری داده ها در آن ساده است، 0 منطقی را در ورودی ساعت SH_CP تنظیم کنید، سپس سطح منطقی مورد نیاز را در ورودی داده DS تنظیم کنید، پس از آن، ورودی ساعت را به 1 تغییر می دهیم، در حالی که مقدار سطح را ذخیره می کنیم (در ورودی DS) داخل شیفت رجیستر در همان زمان، داده ها یک بیت جابجا می شوند. خروجی SH_CP را دوباره روی 0 تنظیم کنید، سطح مورد نیاز را در ورودی DS تنظیم کنید و SH_CP را به 1 برسانید. پس از بارگیری کامل رجیستر shift (8 بیت)، خروجی ST_CP را روی 1 تنظیم کنید، در این لحظه داده ها به ورودی منتقل می شوند. ذخیره سازی ثبت شده و به خطوط خروجی Q0 ... Q7 تغذیه می شود، پس از آن خروجی ST_CP را تنظیم مجدد می کنیم. در طول بارگذاری متوالی، داده ها از Q0 به Q7 منتقل می شوند. پین Q7 به آخرین بیت رجیستر شیفت متصل است، این پین را می توان به ورودی ریزمدار دوم متصل کرد، بنابراین می توانید داده ها را در دو یا چند ریز مدار به طور همزمان بارگذاری کنید. پین OE خطوط خروجی را به حالت سوم (مقاومت بالا) سوئیچ می کند که منطق 1 روی آن اعمال شود. پایه MR برای تنظیم مجدد رجیستر شیفت طراحی شده است، یعنی تنظیم سطوح منطقی پایین در خروجی های تریگرهای رجیستر. ، که معادل بارگذاری هشت صفر است. در زیر نموداری از بارگذاری داده ها در ریز مدار 74NS595 آورده شده است که مقدار 11010001 را در خطوط خروجی Q0 ... Q7 تنظیم می کند، مشروط بر اینکه در ابتدا صفر وجود داشته باشد:


اتصال یک ماتریس 8×8 را به یک میکروکنترلر PIC16F628A با استفاده از دو رجیستر شیفت 74HC595 در نظر بگیرید، نمودار زیر نشان داده شده است:


داده ها در تراشه DD2 بارگذاری می شوند (کنترل سطح منطقی روی ردیف ها، آندهای LED)، سپس از طریق پین Q7 به DD3 (کنترل ستون) منتقل می شوند، ابتدا بایت را بارگذاری می کنیم تا ستون فعال شود، سپس بایت با سطوح منطقی روی ردیف ها. ستون های ماتریس سوئیچینگ ترانزیستور (کاتدهای LED) به خطوط خروجی DD3 متصل می شوند. در زیر کد برنامه برای نمایش تصویر روی ماتریس آمده است:

;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; ;اجرای نشانگر دینامیکی برای یک ماتریس با وضوح 8x8 ;فرکانس مولد ساعت به عنوان مثال 4 مگاهرتز، چرخه ماشین 1 μs org 0000h ;شروع اجرای برنامه از آدرس 0000h goto Start ;پرش به برچسب شروع ;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;وقفه روتین org 0004h ;شروع اجرای زیربرنامه از آدرس 0004h movwf W_TEMP ;ذخیره مقادیر ثبت کلید swapf STATUS,W ; وضعیت clrf ; movwf STATUS_TEMP ; ; movwf FSR_osn ;به رجیستر FSR_osn movf FSR_prer,W ;بازیابی مقدار ذخیره شده قبلی movwf FSR ;رجیستر FSR از رجیستر FSR_prer ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; محتویات رجیستر stolb را در تراشه movf stolb بارگذاری کنید، W ;محتویات رجیستر stolb را کپی کنید movwf var ;در ثبات var met2 btfsc var,0 ؛ ds خروجی را مطابق با btfss var,0 تنظیم کنید. bcf ds ; bcf sh_cp ; rrf var,F ;Shift register var به سمت راست برای آماده سازی;بیت بعدی goto met2 ;scetbit برابر با صفر نیست: پرش به برچسب met2 ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ؛ محتویات رجیستر INDF را در تراشه بارگذاری کنید؛ 74HC595 (رجیستر شیفت سریال) movf INDF,W؛ محتویات رجیستر INDF movwf var را کپی کنید؛ در رجیستر var movlw .8؛ عدد 8 را در ثبات scetbit بنویسید. برای شمارش movwf scetbit ;بیت های منتقل شده met1 btfsc var ,7 ;تنظیم خروجی ds بر اساس bsf ds ;مقدار بیت 7 ثبات var btfss var,7 ; bcf ds ; bsf sh_cp ;خروجی ساعت sh_cp برای اتصال داده bcf sh_cp ; rlf var,F ;Shift register var سمت چپ برای آماده سازی;بیت بعدی decfsz scetbit,F ;کاهش با شرط ثبت scetbit goto met1 ;scetbit برابر با صفر نیست: پرش به برچسب met1 ; bsf st_cp ؛ ساعت خروجی st_cp برای انتقال bcf بارگذاری شده st_cp ؛ بایت ها به خطوط خروجی تراشه های 74HC595 . bcf STATUS,C ;تنظیم بیت C وضعیت رجیستر قبل از shift rrf stolb,F ; ثبت shift چپ stolb ; incf FSR,F ;افزایش رجیستر FSR، آماده بعدی ;ثبت نام برای ارسال داده به 74HC595 decfsz shet,F ;کاهش با برگه شرط ثبت goto exit ;ثبت ثبت مساوی 0 نیست: پرش به خروج از movlw data1 ;ثبت ثبت برابر با 0: آدرس اول را بنویسید movwf FSR ;ثبت نام برای ذخیره اطلاعات در رجیستر FSR movlw .8 ;نوشتن عدد 8 در رجیستر شیت برای نگهداری ورق movwf ;شمارش ستون ها ; خروج از bcf INTCON,T0IF ;بازنشانی پرچم وقفه سرریز TMR0 movlw . 124 ;برای ​​ثبت تایمر TMR0 movwf TMR0 عدد 124 را بنویسید ; ; movf FSR,W ;ذخیره مقدار فعلی FSR movwf FSR_prer ;به FSR_prer movf FSR_osn ,W ;بازیابی مقدار ذخیره شده قبلی movwf FSR ;FSR از FSR_osn ; swapf STATUS_TEMP,W ؛ بازیابی محتویات رجیسترهای کلیدی movwf STATUS . swapf W_TEMP,F ; swapf W_TEMP,W ; ; رتفی ;خروج از زیربرنامه وقفه;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;شروع برنامه اصلی ................ ;تنظیم اولیه رجیسترها ................. ;هدف ویژه..... ............ bsf STATUS,RP0 ;عدد باینری 11010011 را در register movlw b"11010010" ;OPTION_REG بنویسید و بدین ترتیب منبع ساعت داخلی movwf OPTION_REG را تنظیم کنید ;منبع ساعت برای TMR0 bcf STATUS,RP0 ;پیش مقیاس کننده را قبل از فعال کردن TMR0؛ نسبت پیش مقیاس کننده را 1:8 تنظیم کنید. movlw .8؛ نوشتن شماره 8 در ثبت شیت، قبل از شروع شیت movwf، وقفه های سرریز tmr0، اجرا می شود؛ یک بار، پس از روشن شدن movlw b"10000000"؛ نوشتن عدد باینری 10000000 در movwf stolb ;stolb1st ستون، برای فعال کردن یک بار، پس از روشن کردن برق انجام می شود. movlw data1 ;آدرس اولین رجیستر (ثبت‌های ذخیره‌سازی movwf FSR_prer ;اطلاعات) را در رجیستر FSR_prer بنویسید، یک بار پس از روشن شدن. movlw .8 ;پاک کردن 8 رجیستر خروجی اطلاعات به movwf tmp ;ماتریس معادل خاموش کردن movlw data1 ;ماتریس movwf FSR ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF؛ پاک کردن وقفه سرریز TMR0 پرچم bsf INTCON,T0IE؛ فعال کردن وقفه های سرریز TMR0 bsf INTCON,GIE؛ فعال کردن وقفه های سراسری. m1 movlw data1؛ خروجی R مثال movwf FSR. movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"01111111" ; movwf INDF ; incf FSR,F ; movlwb"00001001" ; movwf INDF ; incf FSR,F ; movlwb"00011001" ; movwf INDF ; incf FSR,F ; movlwb"00101001" ; movwf INDF ; incf FSR,F ; movlw b"01000110" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; ; .................; .................; .................; ; پایان ؛ پایان کل برنامه

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

پیاده سازی نشانگر پویا برای یک ماتریس با وضوح 8x8

فرکانس ساعت نمونه 4 مگاهرتز، چرخه ماشین 1 میکرو ثانیه

org 0000h؛ اجرای برنامه را در آدرس 0000h شروع کنید

goto Start ;به برچسب Start بروید

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

؛ وقفه در روال

org 0004h ;شروع اجرای زیربرنامه در آدرس 0004h

movwf W_TEMP ;مقادیر ثبت کلید را ذخیره کنید

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W مقدار فعلی رجیستر FSR را ذخیره کنید

movwf FSR_osn ;به ثبت نام FSR_osn

movf FSR_prer,W ؛ مقدار ذخیره شده قبلی را بازیابی کنید

movwf FSR ;FSR از FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (رجیستر شیفت سریال)

movf stolb,W ؛ محتویات ثبت stolb را کپی کنید

movwf var ;ثبت نام var

movlw .8 برای شمارش عدد 8 را در ثبات scetbit بنویسید

movwf scetbit ;بیت های ارسال شده

met2 btfsc var,0 ;خروجی ds را بر اساس تنظیم کنید

bsf ds ؛ ارزش بیت هفتم ثبات var

bsf sh_cp ;clock sh_cp خروجی برای چفت کردن داده ها

rrf var,F ؛ shift register var سمت راست برای آماده سازی

؛ بیت بعدی

decfsz scetbit,F ؛ کاهش با شرایط ثبت scetbit

goto met2 ;scetbit برابر با صفر نیست: به برچسب met2 بروید

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (رجیستر شیفت سریال)

movf INDF,W ؛ محتویات ثبت INDF را کپی کنید

movwf var ;ثبت نام var

movlw .8 برای شمارش عدد 8 را در ثبات scetbit بنویسید

movwf scetbit ;بیت های ارسال شده

met1 btfsc var,7 ;خروجی ds را بر اساس تنظیم کنید

bsf ds ؛ ارزش بیت هفتم ثبات var

bsf sh_cp ;clock sh_cp خروجی برای چفت کردن داده ها

rlf var,F ;تغییر چپ var برای آماده سازی

؛ بیت بعدی

decfsz scetbit,F ؛ کاهش با شرایط ثبت scetbit

goto met1 ;scetbit برابر با صفر نیست: به برچسب met1 بروید

bsf st_cp ؛ خروجی st_cp را برای انتقال بارگذاری شده ساعت کنید

bcf st_cp ;بایت در هر خط خروجی 74HC595

bcf STATUS،C؛ بیت C را از ثبت وضعیت قبل از شیفت پاک کنید

rrf stolb،F ؛ ثبت شیفت چپ stolb

incf FSR,F ;رجیستر FSR را افزایش دهید، بعدی را آماده کنید

؛ برای ارسال داده ها به 74HC595 ثبت نام کنید

decfsz shet,F ;کاهش با برگه شرایط ثبت

goto exit ;shet register برابر 0 نیست: پرش به خروج

movlw data1 ;shet register 0 است: آدرس اولین را بنویسید

movwf FSR ;ثبت نام برای ذخیره اطلاعات در FSR

movlw .8 برای مرجع، عدد 8 را در ثبت شیت بنویسید

ورق movwf ؛ تعداد ستون ها

movlw b"10000000"؛ عدد باینری 10000000 را بنویسید

movwf stolb ؛ stolb را ثبت کنید تا ستون 1 را شامل شود

خروج از bcf INTCON,T0IF ؛ بازنشانی پرچم وقفه سرریز TMR0

movlw .124 ;عدد 124 را برای ثبت تایمر TMR0 بنویسید

movf FSR,W مقدار فعلی رجیستر FSR را ذخیره کنید

movwf FSR_prer ;به ثبت نام FSR_prer

movf FSR_osn ,W ؛ مقدار ذخیره شده قبلی را بازیابی کنید

movwf FSR ;FSR از FSR_osn

swapf STATUS_TEMP،W؛ بازیابی محتویات رجیسترهای کلید

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;خروج از روال وقفه

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

؛ برنامه اصلی

شروع ................. ؛تنظیم اولیه رجیسترها

................. ؛هدف خاص

.................

bsf STATUS,RP0 ؛ برای ثبت نام عدد باینری 11010011 را بنویسید

movlw b"11010010" ;OPTION_REG، در نتیجه تنظیمات داخلی

movwf OPTION_REG؛ منبع ساعت برای TMR0

bcf STATUS,RP0 ;پیش مقیاس کننده را قبل از TMR0 فعال کنید

;نسبت پیش مقیاس کننده را روی 1:8 تنظیم کنید

movlw .8 ؛ قبل از اجرا، عدد 8 را در رجیستر شیت بنویسید

صفحه movwf؛ سرریز TMR0 قطع می شود، در حال اجرا است

؛ یک بار پس از روشن شدن

movlw b"10000000"؛ عدد باینری 10000000 را بنویسید

movwf stolb ؛ stolb را ثبت کنید تا ستون 1 را شامل شود

اطلاعات با سطوح منطقی برای ردیف های هر ستون در 8 رجیستر ذخیره اطلاعات ذخیره می شود که از طریق آنها قابل دسترسی است. آدرس اولین رجیستر data1 نام دارد. علاوه بر نوشتن اولیه رجیسترهای shet و stolb، لازم است که آدرس اولین رجیستر ذخیره اطلاعات را در رجیستر FSR_prer بنویسید (رجیستر data1 است، ورود در FSR_prer یک بار انجام می شود، سپس در قسمت تنظیم می شود. کنترل کننده)، تنها پس از آن، اجازه وقفه های سرریز TMR0 را بدهید.

قبل از فعال کردن وقفه ها، پاک کردن رجیسترهای ذخیره اطلاعات مطلوب است، این عملیات با استفاده از ثبات tmp اضافی (به عنوان شمارنده) و آدرس دهی غیر مستقیم انجام می شود، پاکسازی معادل خاموش کردن ماتریس است.

در روال مدیریت وقفه، محتویات رجیستر stolb را در تراشه DD2 بارگذاری می کنیم (در اولین باری که بعد از فعال کردن وقفه ها وارد هندلر می شوید، همانطور که در بالا ذکر شد، رجیستر دارای عدد 10000000 است). بارگذاری از بیت پایین رجیستر stolb شروع می شود، که در جهت بارگذاری از Q0 به Q7 (داخل تراشه DD2) تغییر می کند، الگوریتم بارگذاری در بالا مورد بحث قرار گرفت، بنابراین فکر می کنم درک کد دشوار نخواهد بود. . در مرحله بعد، محتویات رجیستر INDF را در DD2 بارگذاری می کنیم، این یکی از رجیسترهای ذخیره اطلاعات است که آدرس آن در FSR است (اولین باری که بعد از فعال کردن وقفه ها هندلر را وارد می کنید، FSR حاوی آدرس اولین است. ثبت ذخیره اطلاعات به نام data1). بارگیری از بیت بالای رجیستر INDF شروع می شود. پس از بارگذاری 2 بایت در نظر گرفته شده، خروجی st_cp را کلاک می کنیم، در نتیجه داده های دانلود شده به خطوط خروجی ریز مدارهای DD2، DD3 منتقل می شوند. بنابراین، در اولین ورودی به هندلر، اولین ستون ماتریس سوئیچ می شود، که در آن LED ها روشن می شوند، که بر روی آندهای آن سطح منطقی بالایی وجود دارد، مطابق با محتوای ثبت داده 1 ( اولین ثبت ذخیره اطلاعات).

سپس، ثبات stolb را یک بیت به سمت راست منتقل می کنیم تا ستون دوم ماتریس را برای سوئیچینگ در ورودی بعدی به کنترل کننده وقفه آماده کنیم. پرچم C ثبت STATUS باید قبل از شیفت پاک شود، زیرا تغییر از طریق این پرچم انجام می شود و وضعیت آن در زمان تغییر مشخص نیست. پس از تغییر، رجیستر FSR را افزایش می دهیم و رجیستر ذخیره سازی بعدی (پس از ثبات data1) را با سطوح ردیف منطقی برای ستون دوم آماده می کنیم. در مرحله بعد رجیستر شیت را با شرط کم می کنیم و اگر برابر با صفر نبود پرچم وقفه سرریز TMR0 را ریست می کنیم و عدد را روی تایمر می نویسیم و از کنترل کننده وقفه خارج می شویم.

دفعه بعد که وارد handler می شوید، ستون دوم ماتریس فعال می شود و به همین ترتیب. هنگامی که رجیستر شیت ریست می شود (پس از تعویض ستون 8)، عدد 8 برای چرخه بعدی تعویض ستون ها روی آن نوشته می شود، علاوه بر این، مقدار ثبات stolb تصحیح می شود، آدرس اولین ثبت ذخیره اطلاعات ( data1) در رجیستر FSR نوشته می شود.

بیایید تاخیر زمانی را برای تایمر TMR0 محاسبه کنیم، فرکانس ساعت 4 مگاهرتز است، چرخه ماشین 1 میکرو ثانیه است. برای جلوگیری از سوسو زدن LED ها، اجازه دهید نرخ تازه سازی هر ستون را 100 هرتز در نظر بگیریم (دوره T=10ms)، تاخیر زمانی 10/8 = 1.25ms است. ما نسبت پیش مقیاس کننده TMR0 را روی 1:8 تنظیم می کنیم، در حالی که حداکثر تاخیر ممکن 256x8 = 2048 میکرو ثانیه است. برای مکث 1.25 میلی ثانیه، تایمر باید شمارش کند (256x1.25) / 2.048 = 156.25 بار، با گرد کردن 156 شمارش دریافت می کنیم. بر این اساس، لازم است عدد 256-156 = 100 را در تایمر بنویسید.اما این مقدار کاملاً صحیح نیست، زیرا اجرای روال وقفه مدتی طول می کشد، در این مورد حدود 190 میکرو ثانیه طول می کشد. ضریب پیش مقیاس کننده را در نظر بگیرید، 190/8 = 23.75 یا 24 شمارش دریافت می کنیم. مقدار صحیح برای نوشتن روی TMR0 این است: 100+24=124.

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


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

در زیر لینک می‌توانید سفت‌افزار و کد منبع میکروکنترلر PIC16F628A را با پیاده‌سازی نشان‌دهنده دینامیک روی یک ماتریس 8x8 با استفاده از دو رجیستر شیفت 74HC595 دانلود کنید، نمودار اتصال در بالا مورد بحث قرار گرفت. حروف R، L، عدد 46، شکلک و فقط یک الگو به شکل ضربدر به طور متناوب روی ماتریس نمایش داده می شود، این انیمیشن در ویدیوی زیر نشان داده شده است.

با برچسب ها , . خواندن .

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

1 مبانی اصول، یا مقدمه

اول از همه، اجازه دهید اصطلاحاتی را که در طول مقاله استفاده خواهیم کرد، تعریف کنیم.

اگر می خواهید نمایشگری متشکل از یک آشنایی هفت بخش را کنترل کنید، این مشکلی ایجاد نمی کند - می توان آن را به عنوان 8 LED مستقل نشان داد. اگر نیاز به نمایش اطلاعات بیشتر از یک کاراکتر دارید، مشکلات شروع می شود: 2 آشنایی 16 LED، سه - 24 و غیره است، یعنی برای یک صفحه نمایش سه رقمی، خروجی های میکروکنترلر ممکن است به سادگی کافی نباشد، ناگفته نماند. نمایشگرهای 6 بیتی یا بیشتر و مخصوصاً نشانگرهای ماتریسی.

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

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

تصویر با نمایشگر پویا

2 انواع پیاده سازی سخت افزاری

2.1 ماتریس های مسطح

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

بدیهی است که با اعمال سطوح مورد نیاز به سطرها و ستون‌های ماتریس، می‌توانیم هر بخش LED ابتدایی را روشن کنیم (معروف به پیکسل - این یک اصطلاح سنتی تر برای نمایشگرهای ماتریسی است). بسته به اینکه دقیقاً چگونه سطوح را در ردیف‌ها و ستون‌ها تغییر می‌دهیم، می‌توانیم چندین نوع نشان پویا دریافت کنیم:

  • توسط خط؛
  • توسط ستون ها؛
  • بخش به بخش (در هر پیکسل)؛
  • به صورت مختلط

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

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

2.2 ماتریس های چند بعدی

مثال هایی که در نظر گرفتیم، پیاده سازی را فرض می کنند صفحه نمایش تک رنگ، یعنی متشکل از LED های تک رنگ اگر بخواهید مثلاً از LED های RGB یک نمایشگر چند رنگ بگیرید؟ دو راه حل ممکن وجود دارد.

اولین مورد این است که به سادگی تعداد ردیف ها (یا ستون ها) ماتریس خود را با در نظر گرفتن هر LED RGB به عنوان 3 LED مستقل افزایش دهیم. عیب بزرگ این روش افزایش 3 برابری تعداد سطرها (یا ستون ها) است. در مثال سادهبه راحتی می توان فهمید که این در عمل به چه چیزی تبدیل می شود: با کمک دو برآمدگی هشت بیتی میکروکنترلر، می توانیم یک ماتریس تک رنگ از بخش های 8x8 یا یک رنگ 4x4 داشته باشیم. موافق باشید که در مورد دوم عملاً غیرممکن است که چیزی قابل درک را نشان دهید ...

راه دوم این است که از یک ماتریس "مسطح" قطعات به یک "چند بعدی" حرکت کنیم. اگر سیگنال هر خط از یک مالتی پلکسر 1x3 عبور داده شود، می توانیم سیستم نمایش LED های RGB را به عنوان 3 ماتریس مستقل از ابعاد اولیه نشان دهیم: هر ماتریس از LED های یک رنگ تشکیل شده است و ماتریس مورد نظر را با سیگنال های کنترل مالتی پلکسر شکل، آنچه گفته شد را توضیح می دهد.

بدیهی است که در مورد یک ماتریس چند بعدی، تعداد خطوط کنترل اضافی نیز مورد نیاز است، با این حال، این تعداد چندان زیاد نیست: در همان دو پورت کنترلر، می توانیم یک صفحه نمایش رنگی 7x7 دریافت کنیم !!!

2.3 راه های کاهش ابعاد ماتریس ها

اگر تعداد پایه های میکروکنترلر بسیار محدود باشد، باید به دنبال راه هایی برای کاهش تعداد سطرها و ستون های ماتریس خود باشیم. البته معجزه اتفاق نمی افتد و در این صورت باید هزینه را پرداخت کنیم که علاوه بر میکروکنترلر، از ریز مدارهای اضافی نیز استفاده شود. همانطور که ممکن است حدس زده باشید ، در اینجا می توانید از روش قبلاً در نظر گرفته شده ماتریس های "چند بعدی" استفاده کنید - از این گذشته ، هیچ کس ما را منع نمی کند که به سادگی از تعداد سه LED تک رنگ به جای LED های RGB استفاده کنیم؟ نکته اصلی این است که آنها را به درستی مرتب کنید ...

بنابراین، ما می توانیم بعد ماتریس را با اعمال زیر کاهش دهیم:

  • رمزگشاها یا مالتی پلکسرها؛
  • شیفت رجیسترها

ما قبلاً با مالتی پلکسرها ملاقات کرده ایم، رمزگشاهمانطور که می توانید حدس بزنید، به طور غیراصولی با مالتی پلکسر متفاوت است. فقط باید اضافه کرد که با استفاده از رمزگشاها / مالتی پلکسرها برای هر دو سطر و ستون، می توان به یکباره کاهش ابعاد ماتریس را در هر دو بعد به دست آورد، اما در این حالت ممکن است فقط استفاده از قطعه به صورت ضروری باشد. نشانگر پویایی بخش، با تمام کاستی های آن.

رجیسترهای شیفت می توانند بسیار بهتر از رمزگشاها کمک کنند. نمودار شکل زیر را در نظر بگیرید.

به راحتی می توان فهمید که هر تعداد سطر و ستون فقط به افزایش تعداد رجیسترها نیاز دارد و تعداد خطوط کنترل میکروکنترلر درگیر ثابت می ماند! یک منهای کوچک این رویکرداین است که با افزایش تعداد ثبات ها در زنجیره، افزایش سرعت خروجی متوالی اطلاعات در آنها ضروری خواهد بود که همیشه به راحتی قابل دستیابی نیست. بنابراین، به عنوان مثال، میکروکنترلرهای رایج خانواده AVR، عملاً به شما اجازه نمی دهد از سرعت خروجی سریال 10 مگابیت بر ثانیه پیشی بگیرید. از سوی دیگر، اگر از کنترل‌کننده‌های دیگری استفاده می‌کنید که می‌توانند سیگنال‌ها را سریع‌تر تولید کنند، ممکن است مشکلاتی با ترتیب متفاوتی شروع شوند: انتشار یک سیگنال ساعت با فرکانس بالا در طول یک خط طولانی (و زمانی که اعداد بزرگثبت می کند، به ناچار چنین خواهد بود) کاملاً با فرکانس پایین متفاوت است، بنابراین هنگام سیم کشی اقدامات خاصی لازم است تخته مدار چاپیو موارد دیگری که در این مقاله در نظر نخواهیم گرفت.

3 روش پیاده سازی نرم افزار

ما اجرای نرم افزاری همه گزینه های ذکر شده را برای نشان دادن پویا در نظر نخواهیم گرفت - این به طور غیرمنطقی مقاله را باد می کند. ما خود را به سه نمونه از "در حال اجرا" ترین مثال ها محدود می کنیم: یک ماتریس مسطح با کنترل مستقیم ردیف ها و ستون ها، همان با استفاده از رمزگشا، و در نهایت، یک نوع با استفاده از ثبات های تغییر. در همه موارد، توجه ویژه ای به تمام تفاوت های ظریف خواهد شد پیاده سازی نرم افزاریعنی کد C فقط در مواردی که با قصد نویسنده مطابقت داشته باشد با توضیحات همراه خواهد بود و به هیچ وجه با سطح آموزشی شما. با این اشاره می کنم که شما باید اصول C را بدون من بدانید.

برای همه نمونه ها، ما موافقت خواهیم کرد که صفحه نمایش ما بر روی نشانگرهای هفت بخش با یک کاتد مشترک ساخته شده است.

3.1 ساده ترین راه

بدیهی است که در برنامه داشتن آرایه ای راحت تر خواهد بود که محتویات آن به طور منحصر به فرد تعیین می کند که کدام بخش ها در کدام قسمت های آشنای صفحه نمایش روشن می شوند - نوعی آنالوگ از RAM صفحه نمایش.

اجازه دهید تعریف ثابت های زیر را معرفی کنیم:

#define SCR_SZ 6 /* تعداد فضاهای کاراکتر نمایش */ #define ROWS PORTB /* port of display "rows", i.e. مدیریت بخش */ #define COLS PORTD /* پورت برای مدیریت "ستون ها"، یعنی. کاتدهای رایج */

حالا بیایید یک صفحه آرایه را اعلام کنیم:

کاراکتر بدون امضا SCR;

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

چگونه این آرایه را روی نمایشگر "نمایش" کنیم؟ بیایید کد زیر را بنویسیم:

< SCR_SZ; pos++){ ROWS = SCR; COLS = ~(1 << pos); }

آیا عملکرد مورد نیاز را انجام خواهد داد؟ آره. اما بد است.

اول از همه، توجه داشته باشید که ما هیچ کنترلی روی نرخ به روز رسانی محتوای سطرها و ستون ها نداریم. دوم، توجه داشته باشید که تا زمانی که عنصر آرایه جدید به خروجی برسد ROWSروی خطوط COLSارزش قدیمی هنوز وجود دارد! به کجا منتهی می شود؟ علاوه بر این، برای کسری از ثانیه، بخش‌هایی از یک آشنای همسایه روی آشنایی نمایش داده می‌شود، یعنی. برخی از بخش ها به اشتباه برجسته می شوند.

شما می توانید از این اثر مانند این جلوگیری کنید: قبل از به روز رسانی محتوا ROWS، همیشه آشنایی قبلی را لغو کنید. برای اینکه با تعریف آشنایی قبلی خسته نشوید، می توانید همه چیز را یکباره خاموش کنید. بنابراین کد ما به شکل زیر است:

char pos بدون امضا; while(1) for(pos = 0؛ pos< SCR_SZ; pos++){ COLS = 0xFF; ROWS = SCR; COLS = ~(1 << pos); delay(); }

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

واقعیت این است که چرخه نمایش بی پایان در حالی کهفقط به ما اجازه نمی دهد کار دیگری انجام دهیم چه نوع برنامه ای خواهیم داشت که فقط می داند چگونه چیزی را روی نشانگر نمایش دهد؟! البته، همه چیز 100٪ بد نیست، زیرا در وقفه ها می توان کاری مفید انجام داد ... و به جای تاخیر تاخیر انداختن()شما می توانید برخی از اقدامات را انجام دهید ... اما همه اینها بسیار بسیار کج است: انجام کاری پیچیده و دست و پا گیر در کنترل کننده های وقفه مطلوب نیست. از طرف دیگر، اگر به جای تاخیر کاری پیچیده و دست و پا گیر انجام شود، اطمینان از زمان محاسباتی یکسان دشوار است، در غیر این صورت معلوم می شود که آشنایی برای دوره زمانی متفاوتی می درخشد، که از نظر بصری شبیه به آنها خواهد بود. درخشش یا سوسو زدن با روشنایی متفاوت.

به طور کلی، این گزینه را می توان فقط به عنوان یک استثنا، فقط به عنوان یک مثال آموزشی، یا در مورد (اما پنج، فقط به عنوان یک استثنا!)، زمانی که مشکل اصلی که باید حل شود بسیار ساده است (این می تواند برای به عنوان مثال، مشکل اندازه گیری ADCولتاژ و نمایش آن).

آنچه باید انجام شود؟ پاسخ، مانند همیشه، ساده است: تمام فرآیندهایی که باید به طور نامحسوس از راه حل کار اصلی اجرا شوند (و البته نشانه چنین فرآیندی است)، باید توسط وقفه های تایمر انجام شوند.
وقفه ها در فواصل کاملاً مشخصی ایجاد می شوند که یکنواختی درخشش آشنایی را تضمین می کند. نشان پس‌زمینه به ما این امکان را می‌دهد که به سادگی چیزی در آرایه در زمان مناسب در حلقه اصلی بنویسیم SCR- و فوراً روی صفحه نمایش ظاهر می شود! و همه تغییرات کد به این واقعیت منجر می شود که به جای حلقه ها از تابع کنترل کننده وقفه استفاده می کنیم:

ISR(TIMER0_OVF_vect)( کاراکتر بدون علامت ثابت = 0؛ COLS = 0xFF؛ ROWS = SCR؛ COLS = ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

چند نظر.

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

در برنامه اصلی، ما فقط باید پورت ها و تایمر را مقداردهی اولیه کنیم (در این مورد - تایمر 0) به طوری که در فواصل زمانی مورد نیاز ما سرریز شود و اجازه وقفه ها را بدهیم. پس از آن، شما نمی توانید در مورد نشانه به یاد داشته باشید - بی سر و صدا و به خودی خود کار خواهد کرد. اما چگونه می توان فاصله سرریز تایمر مورد نظر را تعیین کرد؟ بسیار ساده. چشم انسان سوسو زدن با فرکانس بیش از 25 هرتز را به عنوان یک درخشش مداوم درک می کند. ما 6 نشانگر داریم، هر یک از آنها باید با چنین فرکانسی سوسو بزنند، به این معنی که اطلاعات روی صفحه نمایش باید با فرکانس 25 x 6 = 150 هرتز یا بیشتر به روز شوند. حالا بیایید مقدار پیش مقیاس کننده تایمر را محاسبه کنیم: فرکانس ساعت MK را بر 256 تقسیم کنید ( تایمر 0همه دارند AVRهشت بیت، به این معنی که سرریز می شود، تا 256 شمارش می کند) - این مقدار مورد نظر پیش مقیاس کننده تایمر خواهد بود. البته، بعید است که نتیجه با یکی از مقادیر پیش مقیاس کننده استاندارد مطابقت داشته باشد - این مشکلی نیست، می توانید نزدیکترین مقدار مناسب کوچکتر را بگیرید. نشانگر در فرکانس بالاتر کار می کند، اما این باعث کاهش کیفیت آن نمی شود! یک عارضه جانبی برای نشان دادن بار زیادی روی هسته MK خواهد بود. اگر این امر با برنامه اصلی تداخل زیادی دارد، باید نشانگر را به تایمر دیگری منتقل کنید، به عنوان مثال، 16 بیت تایمر 1، یا برای رد شدن از سرریزهای تایمر یک شمارنده وارد کنید:

#define SKIP 15 /* تعداد وقفه های تایمر برای رد شدن */ ISR(TIMER0_OVF_vect)( char pos بدون علامت ثابت = 0؛ علامت ثابت بدون علامت پرش = SKIP؛ اگر (--پرش) بازگشت؛ پرش = SKIP؛ COLS = 0xFFS؛ = SCR؛ COLS = ~ (1<< pos); if(++pos == SCR_SZ) pos = 0; }

در این مثال های ساده شده، فرض می کنیم که پورت COLS، به جز کاتدهای رایج نشانگرها، هیچ چیز دیگری متصل نیست. با این حال، در زندگی واقعی، چنین شادی اغلب اتفاق نمی افتد و به احتمال زیاد چیز دیگری به خطوط باقی مانده این بندر متصل است. بنابراین، هنگام سازماندهی نشانگر پویا، همیشه باید از تغییرناپذیری وضعیت تمام خطوط بندری که مستقیماً در نشانه دخالت ندارند اطمینان حاصل کرد. این کار به سادگی انجام می شود: به جای نوشتن یک مقدار جدید در پورت، باید از ماسک کردن بیت های غیر ضروری استفاده شود:

COLS |= 0x3F; // بنابراین ما همه آشنایی COLS &= ~(1<

هر دو عبارت ارزش بیت های بالای پورت را تغییر نمی دهند COLS.

3.2 روش رمزگشا

رمزگشا را می توان برای تبدیل استفاده کرد HEXیا BCDکد را به کاراکترهای هفت بخش، یا برای انتخاب یکی از ستون های ماتریس. هر دو گزینه تنها در نحوه سازماندهی خروجی به پورت ها با ساده ترین روشی که قبلا در نظر گرفته شد متفاوت خواهند بود. ROWSو/یا COLSکه ورودی های رمزگشا به آن متصل خواهند شد.
گزینه ای برای استفاده از رمزگشا برای دریافت یک کاراکتر هفت بخش:

ISR(TIMER0_OVF_vect)( کاراکتر بدون علامت ثابت = 0؛ COLS |= 0x3F؛ ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

همانطور که می بینید، تغییرات حداقل هستند - قبل از نمایش در ROWSکد کاراکتر از آرایه SCR، بیت های بالا ماسک می شوند و پس از آن بیت های کم با توجه به کد کاراکتر تنظیم می شوند. یعنی در نظر می گیریم که رسیور به 4 بیت کم اهمیت ترین پورت متصل است ROWS.

امیدوارم بی معنی باشد که مثالی برای رمزگشایی ستون ها ارائه دهیم - به هر حال همه چیز روشن است.

3.3 روش با ثبت

اگرچه نشان‌دهنده دینامیکی با استفاده از شیفت ثبات‌ها اساساً با روش‌های مورد بحث قبلی تفاوتی ندارد، گزینه‌های متعددی برای اجرای آن وجود دارد. ما ساده ترین را در نظر خواهیم گرفت - خروجی بیت ها با ابزار کاملاً نرم افزاری. و در اجرای دیگران (استفاده از USI/USART/SPI/TWI) می توانید دست خود را امتحان کنید.

برای گونه ای از نمایشگر انتخاب شده قبلی از 6 فضای کاراکتر هفت بخش، از 2 شیفت ثبات از نوع استفاده می کنیم. 74HC595. این رجیستر توسط سه سیگنال کنترل می شود: ساعت ورودی داده سریال CLK، داده های واقعی داده هاو پالس خروجی موازی همزمان اطلاعات نوشته شده در رجیستر تنظیم. بیایید ماکروهای مربوطه را اعلام کنیم (برای سادگی، همه سیگنال‌ها را به یک پورت می‌آوریم):

#define CLK _BV(PB0) #define DATA _BV(PB1) #define SET _BV(PB2) #define REG_PORT PORTB

برای نوشتن در رجیستر، نوشتن یک تابع جداگانه راحت است:

جابجایی خالی استاتیک (کاراکتر بدون علامت d) ( char i بدون علامت; برای (i=0; i< 8; i++){ // устанавливаем нужный уровень DATA if(d & 1) REG_PORT |= DATA; else REG_PORT &= ~DATA; REG_PORT |= CLK; // даем импульс CLK REG_PORT &= ~CLK; d >>= 1; } }

بسیار مطلوب است که این تابع ثابت شود، زیرا در کنترل کننده وقفه استفاده خواهد شد. کامپایلر به احتمال زیاد توابع استاتیک را در فرم ایجاد می کند خطی-درج کننده وقفه، i.e. استفاده غیر ضروری از پشته وجود نخواهد داشت، که برای عملکردهای غیر استاتیک تضمین نمی شود.

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

ISR(TIMER0_OVF_vect)(کاراکتر بدون علامت ثابت = 0؛ shift(SCR)؛ shift(~(1<< pos)); REG_PORT |= SET; // выдаем импульс SET REG_PORT &= ~SET; if(++pos == SCR_SZ) pos = 0; }

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

4 برای کسانی که هرگز کافی نیستند

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

4.1 آندها، کاتدها - چه چیزی را انتخاب کنیم؟

هر آنچه قبلاً در نظر گرفتیم به اندیکاتورهایی با کاتدهای مشترک اشاره داشت. و اگر می خواهید با آندهای رایج استفاده کنید؟ به طور کلی، همه چیز ثابت می ماند، به جز اینکه قبل از خروجی لازم است داده ها معکوس شوند - خالی کردن آشنایی با خروجی صفر انجام می شود. COLS، احتراق - به ترتیب، واحدها و بخش ها در ROWSبه جای یک ها شامل صفر می شود. بنابراین کنترل کننده وقفه چیزی شبیه به این می شود:

ISR(TIMER0_OVF_vect)( کاراکتر بدون علامت ثابت = 0؛ COLS &= 0xC0؛ ROWS = ~SCR؛ COLS |= (1<< pos); if(++pos == SCR_SZ) pos = 0; }

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

#define COMMON_ANODE 1 ISR(TIMER0_OVF_vect)( char pos unsigned static = 0; #if COMMON_ANODE != 1 COLS &= 0xC0; ROWS = ~SCR; COLS |= (1<< pos); #else COLS |= 0x3F; ROWS = SCR; COLS &= ~(1 << pos); #endif if(++pos == SCR_SZ) pos = 0; }

کمی دست و پا گیر است، اما اگر یک بار آن را بنویسید، تقریباً بدون هیچ تغییری می توانید از آن در همه پروژه ها استفاده کنید.

4.2 سوسو زدن

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

انجام این کار بسیار آسان است. بیایید یک متغیر سراسری را معرفی کنیم که هر بیت آن نشان دهنده یک آشنایی چشمک زن است:

چشمک زدن کاراکتر بدون علامت = 0;

اکنون کنترل کننده وقفه را کمی تغییر می دهیم:

ISR(TIMER0_OVF_vect)( کاراکتر بدون علامت ثابت = 0؛ ورودی کاراکتر بدون علامت ثابت = 0؛ COLS |= 0x3F؛ if(!(چشمک زدن و (1)<

همانطور که می بینید، تنها یک متغیر استاتیک اضافه شده است - شمارنده ورودی ها به کنترل کننده وقفه ورودو یک اپراتور تست شرایط. منطق ساده است: خروجی آشنایی بعدی تنها در صورتی انجام می شود که در بیت مربوطه باشد چشمک زدنصفر یا مهم ترین بیت شمارنده ورودبرابر با 1. اگر، فرض کنید، چشمک زدنشامل تمام صفرها است، سپس این شرط همیشه برآورده می شود - تمام آشنایی نمایش داده می شود. اگر چشمک زدنشامل 1 در یکی از بیت های خود است، سپس کاراکتر مربوطه تنها در زمانی نمایش داده می شود که مهم ترین بیت شمارنده 1 باشد. از آنجایی که شمارنده هر بار که کنترل کننده وقفه وارد می شود، افزایش می یابد، کاراکتر مربوطه در یک سوسو می شود. فرکانس 128 برابر کمتر از فرکانس وقفه.

4.3 تنظیم روشنایی بخش ها

من در مورد تنظیم روشنایی در مقاله جداگانه ای نوشتم که به این نام بود.

4.4 توزیع خودسرانه نتیجه گیری

پیش از این گفته شده بود که خوشحالی برای اختصاص کل پورت MK برای نشان دادن به ندرت از بین می رود. اما حتی اگر یک پورت به طور کامل برای ردیف ها استفاده شود و پورت دیگر برای ستون های ماتریس نمایشگر استفاده شود، حتی کمتر اوقات خوش شانس است که یک ردیابی PCB راحت به دست آوریم. اغلب اوقات، مسیریابی بهینه تنها زمانی به دست می آید که سطرها و ستون ها بین دو یا حتی چند پورت میکروکنترلر مخلوط شوند. در صورت سازماندهی تعویض بیت نرم افزاری در حین نمایش، نیازی نیست زیبایی برد مدار چاپی را قربانی کنید.

بیایید چند مثال انتزاعی را در نظر بگیریم. اجازه دهید بهترین ردیابی با توزیع سیگنال های زیر در امتداد خطوط پورت های MC ارائه شود:

بخش A

بخش B

بخش H

بخش C

بخش D

بخش G

بخش E

بخش F

همانطور که می بینید، خطوط ماتریس در بین سه پورت مخلوط شده اند و البته تمام خطوط استفاده نشده این پورت ها نباید در طول فرآیند نشان دادن سطوح خود را تغییر دهند.

بهتر است با توزیع بخش ها روی بیت های نماد شروع به توسعه یک تابع نشانگر پویا برای این مورد کنید. قبلاً آن را در آرایه در نظر گرفتیم SCRما ماسک های بیت شخصیت ها را ذخیره می کنیم، به عنوان مثال. واحدهای یک بایت نشان دهنده بخش های نورانی هستند. ما به این فکر نکردیم که کدام بیت با کدام بخش مطابقت دارد. بنابراین، اکنون زمان آن است که در مورد آن فکر کنید.

راحت است که هدف خطوط پورت را در قالب سه صفحه رنگ کنید:

1

آ

0

4

اچ

3

2

ب

اف

E

5

جی

D

سی

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

اگر قطعه بیت شود FEGDCدر نماد بگذارید تا در آن بیفتند پورتبدون شیفت، سپس بخش اچهمچنین می تواند در بیت ششم کاراکتر باقی بماند و همچنین لازم نیست قبل از خروجی جابجا شود PORTC، اما برای بخش ها ولیو ATبیت های 7 و 3 باقی خواهند ماند، یعنی به احتمال زیاد یک بخش ATقبل از خروجی، و بخش باید 3 موقعیت جابجا شود ولی- توسط 6. من در این گزینه متوقف می شوم و شما می توانید به جستجوی حداقل شیفت ها ادامه دهید (تغییر در چندین موقعیت عملیات چندان سریعی نیست، بنابراین مطلوب است که تعداد آنها را به حداقل کاهش دهید).

بنابراین، در مورد ما، توزیع زیر از بیت ها را بر اساس بایت-نویسه دریافت کردیم:

آ

اچ

اف

E

ب

جی

D

سی

به بیت ماسک ها برای خروجی در پورت های مناسب توجه کنید:

D

0

0

1

1

0

1

1

1

0x37

ب

1

0

0

0

0

0

0

0

0x80

سی

0

1

0

0

1

0

0

0

0x48

با استفاده از این ماسک ها با استفاده از عملیات “bitwise AND” بیت های لازم را برای خروجی به پورت انتخاب می کنیم.

بیایید ثابت های ماسک را اعلام کنیم:

#define MASKD 0x37 #define MASKC 0x80 #define MASKC 0x48

قبلاً یک کاراکتر را به یک پورت واحد خروجی می‌دادیم ROWS، اکنون این روش به سه بخش تقسیم می شود:

PORTD = (PORTD & ~MASKD) | (SCR & MASKD)؛ PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6); PORTC = (PORTC & ~MASKC) | ((SCR & _BV(6)) | (((SCR & _BV(3)) >> 3);

لطفا توجه داشته باشید که برای خروجی به PORTCیک بیت باید بدون تغییر خروجی باشد، و دومی - با تغییر، بنابراین به جای MASKCباید از ماکروهای جداگانه استفاده می کرد _BV().

اکنون باید تصمیم گرفت که چگونه آشنایی مربوطه را خاموش و روشن کنیم. بیایید ثابت های مربوط به بیت های کنترل آشنایی را اعلام کنیم:

#define COM0 _BV(0) #define COM1 _BV(3) #define COM2 _BV(4) #define COM3 _BV(5) #define COM4 _BV(7) #define COM5 _BV(3) #define COM_D (COM5) #define COM_C (COM2 | COM3 | COM4) #define COM_B (COM0 | COM1)

برای از بین بردن تمام آشنایی، خروجی ثابت های مربوطه به پورت ها ضروری است COM_x:

PORTD |= COM_D; PORTC |= COM_C; PORTB |= COM_B;

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

Switch(pos)( case 0: PORTB &= ~COM0; break; case 1: PORTB &= ~COM1; break; case 2: PORTC &= ~COM2; break; case 3: PORTC &= ~COM3; break; case 4: PORTC &= ~COM4; break; case 5: PORTD &= ~COM5; break;)

این زیباترین راه نیست، اما کار می کند.

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

ISR(TIMER0_OVF_vect)( کاراکتر بدون علامت ثابت = 0؛ ورودی کاراکتر بدون علامت ثابت = 0؛ // خاموش کردن PORTD |= COM_D؛ PORTC |= COM_C؛ PORTB |= COM_B؛ // خروجی PORTD = (PORTD و ~MASKD) | SCR & MASKD؛ PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6)؛ PORTC = (PORTC & ~MASKC) | ((SCR & _BV(6)) | (((SCR & _BV) (3)) >> 3؛ // چشمک زدن اگر(!(چشمک زدن و (1<< pos)) || (++entry & 0x80)) { switch(pos){ case 0: PORTB &= ~COM0; break; case 1: PORTB &= ~COM1; break; case 2: PORTC &= ~COM2; break; case 3: PORTC &= ~COM3; break; case 4: PORTC &= ~COM4; break; case 5: PORTD &= ~COM5; break; } } if(++pos == SCR_SZ) pos = 0; }

اکنون باقی مانده است که چگونه نمادها را برای خروجی به روشی راحت تر توصیف کنیم ... من پیشنهاد می کنم موارد زیر را انجام دهید: ثابت های مربوط به بیت های بخش ها را تعریف کنید و سپس نمادهای لازم را از این ثابت ها "ساخت" کنید:

// بخش های ابتدایی #تعریف _A _BV(7) #تعریف _B _BV(3) #تعریف _C _BV(0) #تعریف _D _BV(1) #تعریف _E _BV(4) #تعریف _F _BV(5) #تعریف _G _BV (2) #تعریف _H _BV(6) // نمادهای رقمی #تعریف d_0 (_A | _B | _C | _D | _E | _F) #define d_1 (_B | _C) #define d_2 (_A | _B | _G | _D | _E) // و غیره

بنابراین، اگر نیاز به چاپ صفر در سمت راست نمایشگر دارید، فقط باید در جای مناسب بنویسید:

SCR = d_0;

اگر در پروژه دیگری نیاز به توزیع متفاوت بیت ها دارید، فقط اعداد را در ماکروها تغییر خواهید داد. _BV()برای بخش های ابتدایی، و همه شخصیت ها به طور خودکار "بازسازی" می شوند. برای ساده‌ترین مواردی که در ابتدا توضیح داده شد، اصلاً نیازی به انجام کار دیگری نخواهید داشت، اما برای گزینه «تعویض بیت»، مطمئناً باید دستکاری کنید.

4.5 پشتیبانی از دکمه

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

به صورت شماتیک، این در شکل نشان داده شده است.

و از نظر برنامه نویسی به این صورت است:

#define keypin() (!(PIND & _BV(KEY))) ISR(TIMER0_OVF_vect)( کاراکتر بدون علامت استاتیک pos = 0؛ ورودی کاراکتر بدون علامت ثابت = 0؛ کاراکتر بدون علامت استاتیک tmp_key = 0؛ ROWS = 0؛ if(keypin( )) tmp_key |= 1<< pos; COLS |= 0x3F; if(!(blink & (1<< pos)) || (++entry &0x80)){ ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1 << pos); } if(++pos == SCR_SZ){ pos = 0; key = tmp_key; tmp_key = 0; } }

اینجا کلید- این یک ماکرو است که بیت پورت انتخاب شده را تنظیم می کند که همه دکمه ها روی آن "متصل شده اند" ، ماکرو keypin()اگر پین انتخابی منطقی کم باشد، مقدار بولی TRUE را برمی‌گرداند. در مثال، دکمه ها وصل شده اند پورت.

هر بار که یک وقفه تایمر رخ می دهد، ابتدا تمام بخش ها خاموش می شوند - این امر ضروری است تا جریان عبوری از LED ها منجر به عدم تشخیص اشتباه دکمه فشرده نشود. پس از آن، ورودی دکمه نظرسنجی می شود - اگر سطح پایینی وجود داشته باشد، دکمه متصل به کاتد pos مربوطه فشار داده می شود. در یک متغیر tmp_keyحالت های دکمه انباشته می شوند که در یک متغیر سراسری بازنویسی می شوند کلیدپس از اتمام چرخه نمایش شما فقط باید هر از گاهی ارزش را تجزیه و تحلیل کنید کلیدو پرس های شناسایی شده را مدیریت کنید:

کاراکتر بدون علامت static get_key()( char unsigned tmp = 0; tmp = key; _delay_ms(10)؛ if(key == tmp) return tmp; else return 0; )

این ویژگی ساده تضمین می‌کند که هیچ حرف زدن دکمه‌ای وجود نخواهد داشت، حتی اگر به دلیل ماهیت «پویا» نظرسنجی دکمه‌ای، احتمال چت کردن در حال حاضر کم است.

5 دیگه چی؟

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

همانطور که قبلاً گفتم، می توانید هر بخش را تا حد تنظیم مستقل اضافه کنید.

شما می توانید در مورد بهینه بودن کنترل کننده وقفه فکر کنید - برای اهداف آموزشی، من کد نسبتاً خشن نوشتم، به عنوان مثال، من در همه جا استفاده کردم SCR، اگرچه بهینه تر است که مقدار را یک بار در یک متغیر محلی خوانده شود و سپس با مقدار آن کار کند. اگرچه بهینه ساز مطمئناً به رویکرد من کمک خواهد کرد، اما به خاطر تمرین، ارزش آن را دارد که سعی کنید و خودتان را بهینه کنید و خودتان را با اندازه کد حاصل و / یا سرعت برنامه کنترل کنید.

می توانید به ایده جالب تنظیم خودکار روشنایی صفحه نمایش بسته به سطح نور محیط فکر کنید. همانطور که می دانید، نشانگرهای LED بدتر قابل تشخیص هستند، هر چه اطراف آن تیره تر باشد - آنها فقط تار می شوند. بنابراین، در تاریکی، معقول است که روشنایی نشانگرها را کاهش دهید و آن را در روز افزایش دهید. ساده ترین کار این است که از یک مقاومت نوری یا LED جداگانه به عنوان سنسور نور استفاده کنید، اما می توانید آن را متفاوت انجام دهید: مشخص است که LED می تواند به عنوان یک فتودیود نیز کار کند، بنابراین اگر از پورت متصل به ورودی برای نشان دادن استفاده کنید. ADC، سپس در صورت تمایل می توانید photo-emf بخش غیر درخشان نشانگر را اندازه گیری کنید و از این مقدار برای تنظیم روشنایی استفاده کنید ...

می توانید در مورد استفاده از خروجی سریال سخت افزاری فکر کنید که قبلاً به آن اشاره کرده ام.

یک نسخه جالب از یک رویکرد کاملاً جهانی برای نشانگر پویا، که من نیز توصیه می کنم با آن آشنا شوید، توسط MOLCHEC. به طور خلاصه، ماهیت: توزیع بخش ها بر اساس بیت های کاراکتر، تخصیص پورت ها برای کنترل نشانگر، و حتی نوع نشانگر - به طور خلاصه، همه پارامترها - در قالب یک جدول پیکربندی در EEPROM. از نظر برنامه‌ریزی، همه چیز بر اساس این جدول سازماندهی می‌شود: از وارونگی بسته به نوع نشانگر، تا تعویض بیت در پورت‌های مختلف. در عین حال، کد منبع برنامه نشانگر پویا همیشه بدون تغییر باقی می ماند و جدول پیکربندی بسته به ترجیحات کاربر نهایی توسط کاربر جمع آوری می شود. این روش در واقع جهانی و انعطاف پذیر است، با این حال، با افزایش مصرف حافظه برنامه همراه است.


3 نوشته شده توسط ARV، در 06:48 2010/08/25
میشا، اگر من جای شما بودم، چنین جملات اجباری "تو نمی توانی انجامش دهی"، "کسی ننوشت" یا "حق نشر" را نمی دادم، زیرا اولاً این مودبانه نیست و ثانیا:
1. من خیلی وقت پیش یک خط در حال اجرا روی یک ماتریس 10x16 درست کردم (آنچه بود) - می توانید ویدیویی از کار آن را در این یادداشت پیدا کنید http://site/content/view/160/38/
2. من مقاله ای نوشتم (در اخبار خواهید یافت - آخرین مورد برای امروز) در مورد نحوه ساخت تیک روی LCD. اگر کمی به مغز خود فشار بیاورید، انجام مجدد الگوریتم خروجی به یک ماتریس یک چیز جزئی است.
3. حتی یک مقاله در سایت من وجود ندارد که از جایی کپی شده باشد (کپی پیست کپی رایت نیست، شما آن را مهر و موم کرده اید)، همه مطالب کاملا اورجینال هستند. بسیاری از سایت ها کپی هایی از این مطالب را با اجازه من دارند (یا اجازه نویسندگان مطالب، که حق دارند مطالب خود را به طور همزمان در بسیاری از مکان ها منتشر کنند).

تنها کاربرانی که ثبت نام کرده اند می توانند نظرات خود را بگذارند.
لطفا ثبت نام کنید یا وارد حساب کاربری خود شوید.

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

با کارکردن نشانگرها در حالت پالسی می توان تعداد هادی های اتصال را کاهش داد. چشم انسان دارای اینرسی است و اگر نشانگرها مجبور شوند اطلاعات را به طور متناوب با سرعت کافی نشان دهند، به نظر می رسد که همه نشانگرها اطلاعات خود را به طور مداوم نمایش می دهند. در نتیجه امکان انتقال متناوب اطلاعات نمایش داده شده روی همان هادی ها وجود دارد. معمولا نرخ تازه سازی 50 هرتز کافی است، اما بهتر است این فرکانس به 100 هرتز افزایش یابد.

بیایید به بلوک دیاگرام گنجاندن نشانگرهای LED هفت بخش، نشان داده شده در شکل 1 نگاه کنیم. این مدار می تواند یک نشانه پویا از اطلاعات دیجیتال خروجی ارائه دهد.


شکل 1. نمودار ساختاری نشانگر دینامیکی

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

در نتیجه هنگامی که سوئیچ یک کد BCD را از ورودی A به ورودی های یک رمزگشای هفت قطعه ای ارائه می کند، این کد روی نشانگر HL1 نمایش داده می شود. هنگامی که سوئیچ یک کد BCD را از ورودی B به ورودی های رمزگشای هفت قطعه ای ارائه می دهد، این کد در یک چرخه بر روی نشانگر HL2 و غیره نمایش داده می شود.

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

در نتیجه چند بار تعداد هادی های اتصال را کاهش داده ایم؟ بستگی به این دارد که مقطع مدار را کجا رسم کنیم. اگر فقط نشانگرها را روی صفحه نمایش بگذاریم، عملکرد آنها به 7 سیگنال اطلاعاتی برای بخش ها و چهار سیگنال سوئیچینگ نیاز دارد. در مجموع 11 هادی وجود دارد. در یک مدار نشانگر استاتیک، به 7 × 4 = 28 هادی نیاز داریم. همانطور که می بینید، یک برد وجود دارد. هنگام اجرای یک واحد نمایشگر 8 بیتی، بهره حتی بیشتر خواهد بود.

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

حال بیایید جریان عبوری از هر بخش از LED را هنگام روشن شدن محاسبه کنیم. برای این کار از مدار معادل جریان در یکی از بخش های نشانگر استفاده می کنیم. این طرح در شکل 2 نشان داده شده است.


همانطور که قبلا ذکر شد، یک LED برای عملکرد صحیح به جریانی بین 3 تا 10 میلی آمپر نیاز دارد. اجازه دهید حداقل جریان LED را روی 3 میلی آمپر تنظیم کنیم. با این حال، در حالت عملکرد پالس، روشنایی درخشش نشانگر N برابر کاهش می یابد، جایی که ضریب N برابر با چرخه کاری پالس های جریان ارائه شده به این نشانگر است.

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

I seg din = من seg stat× ن= 3mA×8 = 24mA.

فقط برخی از سری های ریز مدار دیجیتال به سختی می توانند چنین جریانی را ارائه دهند. برای اکثر سری‌های ریزمدار، تقویت‌کننده‌های ساخته شده روی کلیدهای ترانزیستوری مورد نیاز است.

حال بیایید جریانی را که از کلید عبور می‌کند، تعیین کنیم و برق را به تک تک بیت‌های یک واحد نمایشگر هشت بیتی تغییر دهیم. همانطور که از مدار نشان داده شده در شکل 2 مشاهده می شود، جریان هر بخش از نشانگر می تواند از طریق کلید عبور کند. هنگامی که عدد 8 نمایش داده می شود، لازم است هر هفت بخش نشانگر را روشن کنید، به این معنی که جریان پالسی که در این لحظه از کلید عبور می کند را می توان به صورت زیر تعیین کرد:

I cl \u003d I Seg می کنمدین× N seg= 24mA×7 = 168mA.

این جریان را چگونه دوست دارید؟! در مدارهای رادیویی آماتور اغلب با راه حل هایی مواجه می شوم که جریان سوئیچینگ مستقیماً از خروجی رسیور گرفته می شود که نمی تواند جریانی بیش از 20 میلی آمپر را ارائه دهد و از خودم این سوال را می پرسم - کجا می توانم چنین نشانگری را ببینم؟ در تاریکی مطلق؟ معلوم می شود یک "دستگاه دید در شب"، یعنی دستگاهی که خوانش آن فقط در تاریکی کامل قابل مشاهده است.

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



شکل 3. نمودار شماتیک بلوک نشانگر پویا

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

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

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

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

اگر به دلایلی، برای مثال، نیاز به استفاده از نشانگرهای ماتریسی، باید از نشانگرهای پویا استفاده کنید، پس باید تمام اقدامات را برای سرکوب تداخل انجام دهید.

به عنوان اقداماتی برای سرکوب تداخل از نشانه های دینامیکی، محافظ واحد، کابل اتصال و بردها را می توان نام برد. استفاده از حداقل طول سیم های اتصال، استفاده از فیلترهای برق. هنگام محافظت از یک بلوک، ممکن است لازم باشد که خود نشانگرها محافظت شوند. در این حالت معمولاً از توری فلزی استفاده می شود. این شبکه می تواند به طور همزمان کنتراست کاراکترهای نمایش داده شده را افزایش دهد.

ادبیات:

آنها همراه با مقاله "نشان دهنده پویا" می خوانند:

اندیکاتورها برای نمایش انواع مختلف اطلاعات برای افراد طراحی شده اند. ساده ترین نوع اطلاعات این است که ...
http://website/digital/Indic.php

نشانگرهای تخلیه هم برای نشان دادن اطلاعات بیت و هم برای نمایش اطلاعات اعشاری استفاده می شوند. هنگام ساخت نشانگرهای اعشاری کاتد ...
http://website/digital/GazIndic/

در حال حاضر، LED ها تقریبا در همه جا برای نمایش اطلاعات باینری استفاده می شوند. این ناشی از...
http://website/digital/LED.php

اصول عملکرد نشانگرهای کریستال مایع ... نحوه عملکرد نشانگرهای کریستال مایع ... تشکیل تصویر رنگی ...
http://website/digital/LCD.php

Dبرای نمایش یک عدد چند رقمی روی نشانگر، ابتدا باید یک دستکاری پیچیده با آن انجام دهید، که شامل شکستن عدد به اجزای آن است. به عنوان مثال، من نمایش عدد 1234 را روی یک نشانگر چهار قطعه ای با یک آند مشترک ارائه می دهم.


برای نمایش یک عدد چهار رقمی، باید یک متغیر مشترک ایجاد کنید که در آن عددی که می خواهید نمایش دهید (متغیر دبلیو)، چهار متغیر که داده ها را برای هر کاراکتر ذخیره می کند (ن) و چهار متغیر دیگر برای تبدیل های میانی (م) تا به متغیر اصلی دست نزنید. متغیر باید با مقداری که در آن ذخیره می شود مطابقت داشته باشد.من. بنابراین برای یک متغیردبلیونوع کافی خواهد بودعدد صحیح ، از آنجایی که متغیری از این نوع قابلیت xp را داردمتحرک کردن مقادیر از -32768 تا +32767 (یاکلمه مگر اینکه قصد استفاده از اعداد منفی را داشته باشید). در متغیرهاناعداد از 0 تا 9 را نشان می دهد، بنابراین استفاده از یک متغیر از نوع کافی استبایت
. و در متغیرهام خواهد بودهمان مقادیر موجود در متغیردبلیو، بنابراین نوع را تنظیم می کنیم عدد صحیح .

کم نور W به عنوان عدد صحیح
کم نور N1 به عنوان بایت
کم نور N2 به عنوان بایت
کم نور N3 به عنوان بایت
کم نور N4 به عنوان بایت
کم نور M1 به عنوان عدد صحیح
کم نور M2 به عنوان عدد صحیح
کم نور M3 به عنوان عدد صحیح
کم نور M4 به عنوان عدد صحیح


پس از اعلام متغیرها، پورت هایی را برای خروجی تنظیم می کنیمکه برای اتصال نشانگر استفاده می شود:

DDRC = &B11111111
DDRD = &B11111111


DDRC=&B 00001111 و DDRD=&B 01111111 (چهار پایه اول پورت Cبرای آندها و شش پورت اولبخش های فرعی D).

سپس به یک متغیر اختصاص دهیددبلیو مقداری که قرار است روی نشانگر نمایش دهیم:

W=1234

"Arial", "sans serif""> در حلقه اصلی برنامه به متغیرهای M مقدار متغیر را نسبت می دهیمW ، من این کار را انجام می دهم:

M1=W
M2 = M1
M3 = M1
M4 = M1


"Arial", "sans serif""> این پارانویا نیست))، این کار با این هدف انجام می شود که در همه متغیرهای M یک عدد وجود داشته باشد، زیرا در حین عملیات تخصیص یک وقفه (اگر وجود داشته باشد و غیرفعال نباشد) می تواند به راحتی وارد شود، که در کنترل کننده آن متغیردبلیو می تواند تغییر کند. و اگر انتساب به این صورت بود: М1= W , M 2 = W , M 3 = W , M 4 = W در متغیرهای M قرار خواهد گرفت معانی مختلفکه منجر به آشفتگی در خواندن خواهد شد.

پس از تعیین تکلیف مقادیر متغیرشروع به کار کنید
هر یک از آنها به گونه ای تبدیل می شوند که به یک متغیر تبدیل می شوندن به ارزشی که خواهد بود رسید
روی نشانگر نمایش داده می شود: در یک متغیر
ن 1 باید "1" باشد، در N 2 - "2"، در N 3 - "3" و در N 4 - "4".

M1=M1/1000" M1=1234/1000=1.234
N1=Abs(m1)" N1=Abs(1.234)=1

عضلات شکم – تابعی که یک عدد صحیح از یک متغیر را به یک متغیر برمی گرداندن 1 ضربه به واحد، که در واقع مورد نیاز بود.

برای اختصاص دو به یک متغیرن 2 عملیات کمی پیچیده تر خواهد بود:

M2= M2 Mod 1000 "M2 =1234 Mod 1000 = 234
M2=M2/100"M2=234/100=2.34
N2 = Abs (m2) "N2 = Abs (2.34) = 2

"Arial", "sans serif""> برای شروع با تابعمد ما سه مورد اول را برمی گردانیم
ارقام عدد (باقی مانده تقسیم بر 1000) و سپس همه چیز مانند حالت اول است.

با دو رقم آخر، تقریباً یکسان است:

M3 = M3 Mod100
M3=M3/10
N3 = Abs (m3)

M4 = M4 Mod 10
N4 = شکم (m4)


اکنون متغیرهای ما حاوی مقادیری هستند که می خواهیم نمایش دهیم، وقت آن است که میکروکنترلر پاهای خود را به پا کند و این مقادیر را روی نشانگر نمایش دهد، برای این کار ما زیرروال پردازش نمایشگر را می نامیم:

"Arial"،"sans serif"">

Gosub Led

"Arial"،"sans serif""> پردازنده به زیربرنامه برچسب زده شده می پردرهبری:

رهبری:

پورت = &B00001000

"Arial", "sans serif""> در اینجا ما در سطح بالایی خدمت می کنیمPORTC .3، آند دسته اول را به این پایه متصل کرده ایم. سپس انتخاب می کنیم که کدام بخش ها را روشن کنیم تا مقدار متغیر اول نمایش داده شود. او یکی از ماست، پس صفر روی پایش خواهد بود Portd .1 و Portd .2 که مربوط به بخش هاستنشانگر B و C

مورد N1 را انتخاب کنید









پایان انتخاب کنید
منتظر 5

"Arial", "sans serif""> پس از روشن شدن بخش های لازم، 5 میلی ثانیه صبر می کنیم و اعداد زیر را نمایش می دهیم:

پورت = &B00000100
مورد N2 را انتخاب کنید
مورد 0: Portd = &B11000000
مورد 1: Portd = &B11111001
مورد 2: Portd = &B10100100
مورد 3: Portd = &B10110000
مورد 4: Portd = &B10011001
مورد 5: Portd = &B10010010
مورد 6: Portd = &B10000010
مورد 7: Portd = &B11111000
مورد 8: Portd = &B10000000
مورد 9: Portd = &B10010000
پایان انتخاب کنید

منتظر 5

پورت = &B00000010

Case N3 را انتخاب کنید
مورد 0: Portd = &B11000000
مورد 1: Portd = &B11111001
مورد 2: Portd = &B10100100
مورد 3: Portd = &B10110000
مورد 4: Portd = &B10011001
مورد 5: Portd = &B10010010
مورد 6: Portd = &B10000010
مورد 7: Portd = &B11111000
مورد 8: Portd = &B10000000
مورد 9: Portd = &B10010000
پایان انتخاب کنید

منتظر 5

پورت = &B00000001

Case N4 را انتخاب کنید
مورد 0: Portd = &B11000000
مورد 1: Portd = &B11111001
مورد 2: Portd = &B10100100
مورد 3: Portd = &B10110000
مورد 4: Portd = &B10011001
مورد 5: Portd = &B10010010
مورد 6: Portd = &B10000010
مورد 7: Portd = &B11111000
مورد 8: Portd = &B10000000
مورد 9: Portd = &B10010000
پایان انتخاب کنید

منتظر 5

"Arial", "sans serif""> پس از نمایش اطلاعات روی نشانگر، باید به حلقه اصلی برنامه برگردید، جایی که باید حلقه را کامل کنید و پایان برنامه را علامت بزنید.

"Arial"،"sans serif""> این چیزی است که در پایان به دست می آوریم:

"Arial"،"sans serif"">

"Arial", "sans serif""> به دلیل تاخیر کم، سوئیچینگ برای چشم انسان قابل رویت نخواهد بود و عدد صحیح 1234 را مشاهده خواهیم کرد.

می توانید کد منبع و پروژه را در Proteus در زیر دانلود کنید:"Arial"،"sans serif"">