uy - Internetni sozlash
Avr-da yetti segmentli dinamik displey. Qisqacha nazariy ma'lumotlar

Batareya bilan ishlaydigan uskunalar uchun LCD ko'rsatkichlaridan foydalanish, odatda, ikkinchisining yuqori oqim iste'moli tufayli yorug'lik chiqaradigan diod (LED) ko'rsatkichlariga qaraganda ko'proq afzalroq deb hisoblanadi. Bu postulat menga quyidagi sabablarga ko'ra umuman ravshan ko'rinmaydi: 1) zamonaviy LCD ko'rsatkichlarida 100 mA gacha iste'mol qiladigan orqa yorug'lik mavjud; 2) ular nisbatan mo'rt va quyoshning to'g'ridan-to'g'ri nurlaridan qo'rqishadi; 3) zamonaviy LED ko'rsatkichlari (ayniqsa superRED va ultraRED) ular orqali 1 mA oqim bo'lsa ham etarli yorqinlikka ega va yorug'lik sharoitlariga qarab yorqinlikni tezda sozlash bilan 4 xonali indikatorning o'rtacha oqim iste'moli 30 mA dan oshmaydi hatto tashqarida ham , bu LCD orqa yorug'lik iste'molidan kamroq.

Onlayn rejimda dinamik displey sxemalarining ko'pligiga qaramay, men PIC16-da dasturiy ta'minotning yorqinligini nazorat qiluvchi sxemani ko'rmadim. Ushbu maqola bunday vazifani amalga oshirish bo'yicha mening kamtarona nuqtai nazarimni ko'rsatadi. Bu, asosan, takroriy dizaynlardan tortib, o'z-o'zini dasturlash uchun mikrokontrollerlargacha bo'lgan birinchi qadamlarini qo'ygan radio havaskorlari uchun mo'ljallangan.

Maqolada TMR0 va TMR2 taymerlarining uzilishlari yordamida o'rta diapazonli PIC mikrokontrolleri bilan LED matritsasini qanday boshqarish kerakligi muhokama qilinadi. Taymer TMR2 yoqilgan segmentlar orqali o'rtacha oqimni PWM nazorat qilish uchun ishlatiladi. Ishni tashkil etish algoritmi quyidagicha:

1. Initializatsiya. Biz mikrokontroller portlarini indikatorning ulanish sxemasiga muvofiq sozlaymiz. 1 va 2 taymerlar uchun ichki soat rejimi 16 ga teng preskaler bilan yoqilgan. Periferik uzilishlar yoqilgan.

2. Indikatorda raqamlar va ba'zi (asosan lotin) harflar va belgilarni ko'rsatish uchun belgilar generator jadvalini yaratamiz.

3. Biz ikkita to'rt bitli o'zgaruvchilarni zahiraga olamiz. Birida biz 2-banddagi jadvalga muvofiq chiqish uchun zarur bo'lgan belgining ketma-ket raqamli kodini (raqamlar uchun - shunchaki raqam) kiritamiz. Jadvaldan o'zgartirilgan qiymatlar indikatorda doimiy ko'rsatish uchun boshqa o'zgaruvchiga o'tkaziladi.

4. TMR0 dan uzilishda belgilar bitlari jadvalga muvofiq ketma-ket ko'rsatiladi. Raqamlarni o'zgartirishdan oldin indikator o'chadi. Har bir uzilish bitta raqamni ko'rsatadi. Shundan so'ng, TMR2 taymeri qayta o'rnatiladi, TMR2 dan uzilish bayrog'i qayta o'rnatiladi va undan uzilishlar yoqiladi.

5. TMR2 uzilishida indikator o'chadi va TMR2 uzilishi o'chiriladi.

6. Asosiy dasturda X(n+1)=2* formuladan foydalanib, PR2 registriga o‘nli kasrda 7 dan 255 gacha bo‘lgan sonlarni kiritish orqali TMR2 dan uzilish davri va shuning uchun indikatorning yonish vaqti o‘rnatiladi. X(n)+1. Bu ularning orasidagi 2 baravar farq bilan oltita yorqinlikning gradatsiyasiga olib keladi. PR2=255 bilan davomiylik maksimal (4ms dan 4ms), PR2=7 bilan davomiylik taxminan 0,25ms.

Ushbu boshqaruv printsipini namoyish qilish uchun quyida arzon PIC16F628A sxemasi va indikatorda "test" so'zini aks ettiruvchi Assembly tilidagi test dasturi mavjud. Tugmani bosganingizda indikatorda yorqinlik ko'rsatiladi (odatda 0 dan 5 gacha raqamlar). Keyingi bosish bilan yorqinlik aylana bo'ylab o'zgaradi va bu darhol indikatorda ko'rinadi. Yangi boshlanuvchilarni darhol ogohlantirmoqchiman: Proteus kabi simulyatorda sxemani modellashtirish ushbu dasturning (Proteus) xususiyatlari tufayli yorqinlikning o'zgarishini ko'rishga imkon bermaydi. Sinov va tajribalar uchun sxemaning prototipi apparatda yig'ilishi kerak. Biroq, dinamik displeyning haqiqiy tashkil etilishini kuzatish uchun (yorqinlik o'zgarishidan tashqari) Proteus modeli biriktirilgan.

Minimal yorqinlikda elektron iste'moli 4 mA dan kam, maksimal - taxminan 80 mA.

Arxivda MPASM assemblerda test dasturi mavjud.

O'chirishni soddalashtirish va turli xil harakatlar uchun "oyoqlarni" bo'shatish uchun ichki generator va ichki qayta o'rnatish bilan konfiguratsiya qo'llaniladi. Shu bilan birga, Uppdan oldin MCLR signalini yuborish imkoniyati bo'lmagan uy qurilishi dasturchisidan foydalanadiganlar keyingi tekshirish, o'qish va o'chirish bilan bog'liq muammolarga duch kelishi mumkin. O'z dasturchisiga ishonchi komil bo'lmaganlar uchun, shuningdek, osilatorning yuqori barqarorligi talab qilinsa, siz "OSC_XT" konfiguratsiyasida tanlov bilan standart sxema bo'yicha 4 MGts kvartsni o'rnatishingiz mumkin. Agar oxirgi kontaktlarning zanglashiga INT0 (RB0) pinidan uzilishlar kerak bo'lsa, vergulni RA4 pin orqali boshqarish mumkin; OA bo'lgan indikator uchun indikator ochiq bo'lishiga qaramay, to'g'ridan-to'g'ri ushbu pinga ulanadi. Bo'shatilgan pin RB0 mo'ljallangan maqsadda ishlatilishi mumkin. Dasturda, TMR0 dan uzilishda, bu holda kod "movwf PORTB" dan keyin qo'shiladi:

Andlw b"00000001" bsf PORTA,4 vergulni bostirish btfsc STATUS,Z W da teskari qiymatni hisobga olish. bcf PORTA,4 agar 0-bit = 0 bo'lsa, engil vergul

Dastur haqida kichik tushuntirishlar:

Chiqish raqami raqamga mos ravishda OUT_ - OUT+3 o'zgaruvchilarga joylashtiriladi va undan konversiyadan so'ng out__ pastki dasturda OUT_LEDga joylashtiriladi. Albatta, siz OUT_ o'zgaruvchisisiz ishlashingiz va chiqish uchun hamma joyda yozishingiz mumkin:

Movlw X qo'ng'iroq Table_s movwf OUT_LED

Biroq, asl ko'rinishida hamma narsa ancha sodda va tushunarli (men uni OUT_-ga joylashtirdim va unutdim), shuningdek, dasturning turli joylaridan bir nechta chiqishlar bilan kodni tejash olinadi (1 chiqish uchun 4 ta so'z) - menimcha, bu qo'shimcha 4 bayt operativ xotira uchun yaxshi kompensatsiya.

Xuddi shu narsa vergul_ o'zgaruvchisi orqali vergul chiqarish uchun ham amal qiladi.

Table_s jadvali kichik dasturida 256 baytli bloklar kesishmasida cheklovlarsiz dastur xotirasining istalgan joyiga joylashtirilganda to'g'ri ishlash choralari ko'rilgan.

TMR0 uzilishidagi pause_ o'zgaruvchisi vaqt oralig'ini 4 ms ga o'rnatish uchun ishlatiladi.

Qolganlari, menimcha, algoritm va sharhlardan aniq.

P.S. Dasturdagi 2 yoki 3 ta raqam uchun siz minimal o'zgarishlar qilishingiz kerak, menimcha, bu hatto yangi boshlanuvchilar uchun ham mumkin. 5 dan 8 gacha raqamlar soni bo'lgan indikatorni boshqarish uchun ko'p sonli pinli kontrollerdan foydalanish yoki 3 dan 8 gacha bo'lgan dekoderdan foydalanish uchun raqamlarni boshqarish kerak.

Birinchi holda, dasturdagi o'zgarishlar ham minimaldir (A porti o'rniga boshqa portdan foydalanish va hokazo). Agar dekoder ishlatilsa, TMR0 uzilishi bilan bog'liq dastur juda jiddiy o'zgaradi.

Radioelementlar ro'yxati

Belgilash Turi Denominatsiya Miqdori EslatmaDo'konMening bloknotim
U1 MK PIC 8-bit

PIC16F628A

1 Bloknot uchun
H1 Ko'rsatkich4x7 FIQ-3641A1 Bloknot uchun
1-4 chorak Bipolyar tranzistor

KT361E

4 Bloknot uchun
C3 Kondensator22 nF1 Bloknot uchun
R1-R7, R14 Rezistor

150 Ohm

8 Bloknot uchun
R8 Rezistor

Darsni davom ettirib, dinamik displeyni ko'rib chiqaylik. Agar siz statik ko'rsatkichni diqqat bilan o'rgangan bo'lsangiz, segment ko'rsatkichi LEDlar to'plami ekanligini bilasiz. Indikatorni ulash uchun sizga 7 ta mikrokontroller pin kerak bo'ladi. Ammo to'satdan biz bir nechta ko'rsatkichlardan foydalanishimiz kerak edi, masalan, 2, 3, 4 ...

Keyin bizga 14, 21, 28 oyoq kerak bo'ladi va oyoqlar etarli emas ... Bu erda dinamik displey yordamimizga keladi. Dinamik displeyning asosiy maqsadi ishlatiladigan mikrokontroller pinlari sonini kamaytirishdir. Iltimos, diagrammada 14 ta emas, 9 ta oyoq borligini unutmang. Boshqaruv oyoqlari hammasi parallel ravishda ulangan.

Umumiy ma'noda ushbu dizayn quyidagicha ishlaydi: birinchi navbatda, birinchi raqamning konfiguratsiyasi umumiy avtobusga chiqariladi va biz PB1 ni yoqamiz. Birinchi indikator kerakli raqam bilan yonadi. Keyin biz uni o'chirib qo'yamiz, ikkinchi raqamning konfiguratsiyasini ma'lumotlar avtobusiga chiqaramiz, ikkinchi indikatorni yoqamiz va uni o'chirib qo'yamiz.

Batafsilroq. Birinchi daqiqada hamma narsa o'chirilgan PORTB=0x00; PORTD=0xFF; chunki sxema umumiy "+" anod bilan. Keyinchalik, birinchi raqamning konfiguratsiyasi, masalan, "0" PORTD-ga yuboriladi. Statik displeydan biz eslaymiz:

holat 0 : ( PORTD = 0xC0 ; tanaffus ; )

holat 0: ( PORTD=0xC0; tanaffus; )

Ammo "+" PORTB.1 ga ulanganligini unutmang, ya'ni. segmentni yoqish uchun PORTB.1=1 oyoqni yoqish kerak;

Vaqtning ikkinchi lahzasida biz hamma narsani yana o'chiramiz, ikkinchi raqamning konfiguratsiyasini yuboramiz va bu safar ikkinchi ko'rsatkichni yoqamiz. Keyinchalik takrorlaymiz.

Yuqori chastotalarda inson ko'zi bu kalitlarni farqlay olmaydi va indikator doimo yonib turadi. 50 Gts ga karrali chastotalarni ishlatmaslik tavsiya etiladi. Sinov loyihamda men 120 Gts dan foydalandim. Taymer 1 MGts chastotaga o'rnatiladi. Kod taymer1 uzilishida qayta ishlanadi. Interrupt sekundiga 240 marta chaqiriladi, chunki ikkita ko'rsatkich mavjud, shuning uchun biz taqqoslash registriga 1000,000/240=4166 yoki 0x1046 ni suramiz. Proteusni dinamik indikator bilan bog'lash mumkin emas edi, lekin u darhol apparatda ishladi.

Eslatma!!! Ko'rsatkichni ulashda har bir segmentga bitta umumiy emas, balki oqim cheklovchi qarshilikni ulash tavsiya etiladi. Bundan tashqari, tranzistor orqali umumiy indikator simini ulashni tavsiya etaman, aks holda siz oyoqni yoqishingiz mumkin.

Umumiy anodli sxema uchun

Umumiy katod zanjiri uchun

Men oldingi loyihadagi taymerni sinov dasturi sifatida ishlatganman.

Mikrodastur ishlashi haqida video

Ko'rsatkichlar odatda ularda ko'rsatilgan ma'lumotlarni ko'rish uchun qulay joylarda joylashgan. Raqamli sxemaning qolgan qismi boshqa bosilgan elektron platalarda joylashgan bo'lishi mumkin. Ko'rsatkichlar soni ortib borishi bilan ko'rsatkich taxtasi va raqamli taxta o'rtasidagi o'tkazgichlar soni ortadi. Bu uskunaning dizayni va ekspluatatsiyasini ishlab chiqishda muayyan noqulayliklarga olib keladi. Xuddi shu sabab uning narxining oshishiga olib keladi.

Ko'rsatkichlarning impuls rejimida ishlashini ta'minlash orqali ulash o'tkazgichlarining sonini kamaytirish mumkin. Inson ko'zi inertsiyaga ega va agar siz indikatorlarni ma'lumotlarni birma-bir etarlicha yuqori tezlikda ko'rsatishga majburlasangiz, odamga barcha ko'rsatkichlar o'z ma'lumotlarini doimiy ravishda ko'rsatayotgandek tuyuladi. Natijada, ko'rsatilgan ma'lumotni bir xil o'tkazgichlar orqali navbatma-navbat uzatish mumkin. Odatda 50 Gts yangilanish tezligi etarli, ammo bu chastotani 100 Gts ga oshirish yaxshiroqdir.

Keling, 1-rasmda ko'rsatilgan etti segmentli LED ko'rsatkichlarining blok diagrammasini ko'rib chiqaylik. Ushbu sxema chiqish raqamli ma'lumotlarning dinamik ko'rsatkichlarini ta'minlashi mumkin.


Shakl 1. Dinamik indikatsiyaning blok diagrammasi

1-rasmda ko'rsatilgan diagrammada to'rtta raqamli raqam ko'rsatilgan. Har bir bit qisqacha kalitning o'z kirishiga ulanadi. Generator ko'rsatkichlar bo'yicha ma'lumotni yangilash tezligini o'rnatish uchun ishlatiladi. Ikkilik hisoblagich ketma-ket ravishda sxemaning to'rtta holatini hosil qiladi va kalitlar orqali etti segmentli ko'rsatkichlarga muqobil quvvat manbai beradi.

Natijada, kalit A kirishidan etti segmentli dekoderning kirishlariga ikkilik kasr kodini etkazib berganda, bu kod HL1 indikatorida ko'rsatiladi. Kalit B kirishidan yetti segmentli dekoderning kirishlariga ikkilik o'nlik kodni etkazib berganda, bu kod HL2 indikatorida ko'rsatiladi va hokazo.

Ko'rib chiqilayotgan sxema bo'yicha ma'lumotni yangilash tezligi generatorning chastotasidan to'rt baravar kam bo'ladi. Ya'ni, 100 Gts chastotali miltillovchi indikatorni olish uchun 400 Gts generator chastotasi talab qilinadi.

Natijada biz birlashtiruvchi o'tkazgichlar sonini necha marta kamaytirdik? Bu kontaktlarning zanglashiga olib keladigan kesimini qayerda chizishimizga bog'liq. Agar biz ko'rsatkichlar panelida faqat ko'rsatkichlarni qoldirsak, unda ularning ishlashi segmentlar uchun 7 ta axborot signali va to'rtta kommutatsiya signalini talab qiladi. Hammasi bo'lib 11 ta o'tkazgich mavjud. Statik displey sxemasida bizga 7 × 4 = 28 o'tkazgich kerak bo'ladi. Ko'rib turganingizdek, g'alabalar aniq. 8-bitli displey blokini amalga oshirishda daromad yanada kattaroq bo'ladi.

Indikatorlarning kirishlari bo'ylab sxemaning kesimi chizilgan bo'lsa, yanada katta daromad bo'ladi. Bunday holda, to'rt raqamli displey bloki faqat oltita signal o'tkazgichlari va ikkita kontaktlarning zanglashiga olib keladigan quvvat o'tkazgichlarini talab qiladi. Biroq, dinamik displey sxemasining bunday kesma nuqtasi juda kam qo'llaniladi.

Keling, har bir LED segmenti yonib ketganda o'tadigan oqimni hisoblaylik. Buning uchun biz indikator segmentlaridan biri orqali oqim oqimining ekvivalent sxemasidan foydalanamiz. Ushbu diagramma 2-rasmda ko'rsatilgan.


Yuqorida aytib o'tilganidek, LED normal ishlashi uchun 3 dan 10 mA gacha bo'lgan oqimni talab qiladi. Minimal LED oqimini 3 mA ga o'rnatamiz. Biroq, ishning impuls rejimida indikatorning yorqinligi N marta pasayadi, bu erda N koeffitsienti ushbu indikatorga etkazib beriladigan joriy impulslarning ish aylanishiga teng.

Agar biz yorug'likning bir xil yorqinligini saqlamoqchi bo'lsak, segment bo'ylab o'tadigan impuls oqimining kattaligini N marta oshirishimiz kerak. Sakkiz raqamli ko'rsatkich uchun N koeffitsienti sakkizga teng. Keling, dastlab 3 mA ga teng LED orqali statik oqimni tanlaylik. Keyin sakkiz xonali indikatorda LEDning bir xil yorqinligini saqlab qolish uchun impulsli oqim kerak bo'ladi:

I seg din = I seg stat× N= 3mA×8 = 24mA.

Faqat ba'zi raqamli mikrosxemalar bunday oqimni ta'minlay olmaydi. Ko'pgina mikrosxemalar uchun tranzistorli kalitlarda ishlab chiqarilgan kuchaytirgichlar kerak bo'ladi.

Endi sakkiz bitli displey blokining alohida bitlariga quvvatni o'zgartiradigan kalit orqali oqadigan oqimni aniqlaylik. 2-rasmda ko'rsatilgan diagrammadan ko'rinib turibdiki, indikatorning har qanday segmentidan oqim kalit orqali oqishi mumkin. 8 raqami ko'rsatilganda indikatorning barcha etti segmentini yoqish kerak bo'ladi, ya'ni hozirgi vaqtda kalit orqali o'tadigan impuls oqimini quyidagicha aniqlash mumkin:

I cl = I segding× N seg= 24mA×7 = 168mA.

Bu oqim sizga qanday yoqadi?! Havaskor radio sxemalarida men tez-tez kommutatsiya oqimi to'g'ridan-to'g'ri dekoderning chiqishidan olinadigan, 20 mA dan ortiq oqim hosil qila olmaydigan echimlarga duch kelaman va men o'zimga savol beraman - bunday indikatorni qaerdan qidirish kerak? To'liq zulmatdami? Natijada "tungi ko'rish moslamasi", ya'ni o'qishlari faqat to'liq zulmatda ko'rinadigan qurilma.

Endi olingan displey birligining sxematik diagrammasini ko'rib chiqamiz. U 3-rasmda ko'rsatilgan.



Shakl 3. Dinamik displey blokining sxematik diagrammasi

Endi biz dinamik displey sxemasini oldik, biz uning afzalliklari va kamchiliklarini muhokama qilishimiz mumkin. Dinamik displeyning shubhasiz afzalligi - bu matritsa ko'rsatkichlari bilan ishlash kabi ba'zi hollarda uni ajralmas holga keltiradigan kam sonli ulanish simlari.

Kamchilik - katta impulsli oqimlarning mavjudligi va har qanday o'tkazgich antenna bo'lganligi sababli, dinamik ko'rsatkich kuchli shovqin manbai bo'lib xizmat qiladi. Interferentsiyaning yana bir manbai elektr ta'minotidir.

E'tibor bering, kommutatsiya impulslarining oldingi qirralari juda qisqa, shuning uchun ularning harmonik komponentlari radiochastota diapazonini ultra qisqa to'lqinlargacha qamrab oladi.

Shunday qilib, dinamik indikatordan foydalanish raqamli qurilma va indikator o'rtasidagi ulanish simlari sonini minimallashtirishga imkon beradi, lekin ayni paytda u kuchli shovqin manbai hisoblanadi, shuning uchun uni radio qabul qiluvchi qurilmalarda ishlatish istalmagan.

Agar biron sababga ko'ra, masalan, matritsa ko'rsatkichlaridan foydalanish zarurati paydo bo'lsa, dinamik indikatordan foydalanish kerak bo'lsa, shovqinni bostirish uchun barcha choralar ko'rilishi kerak.

Dinamik ko'rsatkichdan shovqinni bostirish choralari jihozni ekranlash, ulash kabeli va platalarni o'z ichiga oladi. Elektr ta'minoti filtrlaridan foydalangan holda, ulanish simlarining minimal uzunligidan foydalanish. Blokni himoya qilishda ko'rsatkichlarning o'zini himoya qilish kerak bo'lishi mumkin. Bunday holda, odatda, metall to'r ishlatiladi. Ushbu panjara bir vaqtning o'zida ko'rsatilgan belgilarning kontrastini oshirishi mumkin.

Adabiyot:

"Dinamik displey" maqolasi bilan birga o'qing:

Ko'rsatkichlar odamga har xil turdagi ma'lumotlarni ko'rsatish uchun mo'ljallangan. Axborotning eng oddiy turi...
http://site/digital/Indic.php

Gaz chiqarish ko'rsatkichlari bit ma'lumotlarini ko'rsatish uchun ham, o'nlik ma'lumotlarni ko'rsatish uchun ham ishlatiladi. O'nlik ko'rsatkichlarni qurishda katod...
http://site/digital/GazIndic/

Hozirgi vaqtda LEDlar ikkilik ma'lumotlarni ko'rsatish uchun deyarli hamma joyda qo'llaniladi. Buning sababi ...
http://site/digital/LED.php

Suyuq kristall indikatorlarning ishlash tamoyillari... Suyuq kristall indikatorlarning ishlash rejimlari... Rangli tasvirni shakllantirish...
http://site/digital/LCD.php

Dinamik displey mikrokontroller dasturchilariga yangi boshlanuvchilar duch keladigan muammolardan biridir. Bu haqda ko'p aytilgan, lekin men ushbu ko'rsatish usulini o'zlashtirishni osonlashtirish uchun C tilidagi manba kodining rasmlari va misollari bilan ma'lum bo'lgan narsalarni zaxiralashga qaror qildim.

1 Asoslar yoki kirish

Avvalo, maqola davomida ishlatadigan terminologiyani aniqlaymiz.

Agar bitta yetti segmentli tanishlikdan iborat displeyni boshqarish kerak bo'lsa, bu hech qanday muammo tug'dirmaydi - uni 8 ta mustaqil LED deb hisoblash mumkin. Agar siz bitta belgidan ko'ra ko'proq ma'lumotni ko'rsatishingiz kerak bo'lsa, muammolar boshlanadi: 2 ta tanish joy 16 ta LEDni, uchtasi - 24 va boshqalarni tashkil qiladi, ya'ni uch xonali displey uchun mikrokontroller pinlari etarli bo'lmasligi mumkin. 6 yoki undan ortiq raqamli displeylarni va ayniqsa, matritsa ko'rsatkichlarini eslatib o'ting.

Oddiylik uchun barcha ko'rsatkichlarimiz umumiy katodga ega ekanligiga rozi bo'laylik. Muammoni hal qilish juda oddiy: barcha ko'rsatkichlar segmentlarining terminallarini bir-biriga ulang. Endi siz ma'lumotni birinchi tanish joyga chiqarmoqchi bo'lsangiz, segment chiziqlariga kerakli darajalarni qo'llashingiz kerak va birinchi indikatorning umumiy chiqishini kontaktlarning zanglashiga olib keladigan umumiy simiga ulashingiz kerak. Albatta, boshqa barcha ko'rsatkichlarning umumiy katodlarida yuqori darajalar mavjud bo'lishi kerak. Shubhasiz, birinchi indikatorning kerakli segmentlari yonadi. Ikkinchi, uchinchi va boshqalarga chiqish uchun. ko'rsatkichlar xuddi shunday qilishlari kerak, ya'ni. Umumiy katodlardan biriga mantiqiy nol qo'llash orqali biz joriy ko'rsatilgan raqamni tanlaymiz va segment chiziqlarining holati ko'rinadigan belgini aniqlaydi.

Butun displey doimiy ravishda yonib turuvchi sifatida qabul qilinishi uchun raqamlarni tezda almashtirish kerak - soniyada 25 martadan ko'proq. Ko'rib turganingizdek, barcha chiqishlarning darajalari (aytmoqchi, odatdagi yondashuvga qaraganda sezilarli darajada kichikroq bo'lgan) doimiy ravishda o'zgarib turadi, ya'ni. statik darajalarga ega emas, balki dinamik darajalarga ega, shuning uchun ko'rsatkich usulining nomi - dinamik.

Dinamik displey tasviri

2 Uskunani amalga oshirish turlari

2.1 Yassi matritsalar

Agar biz etti segmentli ko'rsatkichlardan mavhum olsak, bizning displeyimiz alohida LEDlarning matritsasi sifatida taqdim etilishi mumkin, ularning anodlari matritsaning qatorlariga, katodlari esa ustunlarga birlashtirilgan. Aslida, aynan shunday.

Shubhasiz, matritsamizning satrlari va ustunlariga kerakli darajalarni etkazib berish orqali biz har qanday elementar LED segmentini yoritishimiz mumkin (aka piksel - bu matritsali displeylarga nisbatan an'anaviy atama). Biz satrlar va ustunlardagi darajalarni qanday aniq o'zgartirishimizga qarab, biz bir necha turdagi dinamik displeyni olishimiz mumkin:

  • chiziqlar bo'yicha;
  • ustunlar bo'yicha;
  • segment bo'yicha segment (har bir piksel uchun);
  • aralash tarzda.

Biz oldingi bobda ustun variantini ko'rib chiqdik. Qator varianti undan faqat matritsamiz satrlari va ustunlari almashtirilganligi bilan farq qiladi. Segment-segment usuli shuni anglatadiki, har qanday vaqtda faqat bitta satr va bitta ustun LEDni yoqish uchun zarur bo'lgan darajani o'z ichiga oladi. Ya'ni, istalgan vaqtda butun matritsaning faqat bitta LED yoritgichi yonishi mumkin (oldingi variantlardan farqli o'laroq, butun satr yoki butun ustun bir vaqtning o'zida yonishi mumkin). Bu usul televizorni skanerlashni eslatadi, nur butun ekran bo'ylab yugurib, to'g'ri joylarda fosforni yoritadi. Aralash variant, nomidan ko'rinib turibdiki, "faol" darajalar bir vaqtning o'zida bir nechta satr va ustunlarda mavjud bo'lishi mumkin.

Birinchi ikkita variantni amalga oshirish juda oson va shuning uchun keng qo'llaniladi. Uchinchi variant kamroq ishlatiladi, chunki satrlar va ustunlar bo'yicha yuqori ma'lumotni yangilash tezligini talab qiladi va bu holda segment orqali o'rtacha oqim (ya'ni, segment yorqinligi) boshqalarga qaraganda sezilarli darajada past bo'ladi. Oxirgi aralash usul bir qator ijobiy fazilatlarga ega bo'lsa-da, eng kam tarqalgan. Avvalo, bu usul satr va ustunli davrlarda barqaror oqim manbalarini qo'llashni talab qiladi, aks holda yorug'lik segmentlarining yorqinligi muqarrar ravishda ularning umumiy soniga bog'liq bo'ladi. Va satrlar va ustunlardagi signallarning kombinatsiyasini hisoblash juda oson emas.

2.2 Ko'p o'lchovli matritsalar

Biz ko'rib chiqqan misollar monoxrom displeyni amalga oshirishni nazarda tutadi, ya'ni. bitta rangli LEDlardan iborat. Ko'p rangli displeyni, masalan, RGB LED-lardan olishni istasangiz nima qilish kerak? Ikkita mumkin bo'lgan yechim mavjud.

Birinchisi, har bir RGB LEDni 3 ta mustaqil individual LED sifatida ko'rib, matritsamizning satrlari (yoki ustunlari) sonini ko'paytirishdir. Ushbu yondashuvning katta kamchiliklari qatorlar (yoki ustunlar) sonining 3 barobar ko'payishi hisoblanadi. Oddiy misol, bu amalda nimani anglatishini osonlik bilan ko'rsatadi: ikkita sakkiz bitli mikrokontroller mikrokontrolleri yordamida biz monoxrom 8x8 segmentli matritsaga yoki 4x4 rangli matritsaga ega bo'lishimiz mumkin. Qabul qiling, ikkinchi holda, tushunarli narsani ko'rsatish deyarli mumkin emas ...

Ikkinchi yo'l - segmentlarning "tekis" matritsasidan "ko'p o'lchovli" ga o'tish. Agar har bir chiziqning signali 1x3 multipleksor orqali uzatilsa, u holda biz RGB LEDlarning displey tizimini asl o'lchamdagi 3 ta mustaqil matritsa sifatida tasavvur qilishimiz mumkin: har bir matritsa bir xil rangdagi LEDlardan iborat va biz multipleksor yordamida kerakli matritsani tanlaymiz. nazorat signallari. Rasmda nima aytilganligi tushuntiriladi.

Shubhasiz, ko'p o'lchovli matritsada qo'shimcha nazorat chiziqlari soni ham talab qilinadi, ammo bu raqam unchalik katta emas: bir xil ikkita kontroller portida biz 7x7 rangli displeyni olishimiz mumkin!!!

2.3 Matritsalar o'lchamini kichraytirish yo'llari

Agar mikrokontroller pinlarining soni juda cheklangan bo'lsa, biz matritsamizning qatorlari va ustunlari sonini kamaytirish yo'llarini izlashimiz kerak. Albatta, mo''jizalar sodir bo'lmaydi va bu holda biz mikrokontrollerga qo'shimcha ravishda qo'shimcha mikrosxemalar yordamida to'lashimiz kerak bo'ladi. Siz taxmin qilganingizdek, bu erda siz ilgari muhokama qilingan "ko'p o'lchovli" matritsalar usulidan foydalanishingiz mumkin - axir, hech kim bizga RGB LEDlar o'rniga bitta rangli LEDlarning uch baravar ko'p ishlatilishini taqiqlamaydi? Asosiysi, ularni to'g'ri tartibga solish ...

Shunday qilib, biz matritsaning o'lchamini kamaytirishimiz mumkin:

  • dekoderlar yoki multipleksorlar;
  • siljish registrlari.

Biz allaqachon multipleksorlar bilan uchrashganmiz, dekoder, siz taxmin qilganingizdek, multipleksordan tubdan farq qilmaydi. Shuni qo'shimcha qilish kerakki, ikkala satr va ustunlar uchun dekoderlar/multiplekserlar yordamida bir vaqtning o'zida ikkala o'lchov bo'yicha matritsa o'lchamini kamaytirish mumkin, ammo bu holda faqat segment-segment dinamik displeydan foydalanish kerak bo'lishi mumkin, barcha kamchiliklari bilan.

Shift registrlari shifrlovchilarga qaraganda yaxshiroq yordam berishi mumkin. Quyidagi rasmdagi diagrammani ko'rib chiqing.

Ko'rish oson, har qanday qator va ustunlar faqat registrlar sonini ko'paytirishni talab qiladi va mikrokontroller nazorati qatorlari soni bir xil bo'lib qoladi! Ushbu yondashuvning kichik kamchiliklari shundaki, zanjirdagi registrlar soni ortishi bilan ularga ma'lumotlarni ketma-ket chiqarish tezligini oshirish kerak bo'ladi, bunga erishish har doim ham oson emas. Masalan, oilaning umumiy mikrokontrollerlari AVR, ketma-ket chiqish tezligini 10 megabit/sek dan oshib ketishiga amalda ruxsat bermang. Boshqa tomondan, agar siz signallarni tezroq chiqaradigan boshqa kontrollerlardan foydalansangiz, boshqa tartibdagi muammolar paydo bo'lishi mumkin: yuqori chastotali soat signalining uzun chiziq bo'ylab tarqalishi (va ko'p sonli registrlar bilan u muqarrar ravishda bitta bo'ladi. ) past chastotalidan butunlay boshqacha tarzda sodir bo'ladi, shuning uchun bosilgan elektron platani va biz ushbu maqolada ko'rib chiqmaydigan boshqa narsalarni yotqizishda maxsus choralar talab qilinadi.

3 Dasturiy ta'minotni amalga oshirish usullari

Biz barcha aytib o'tilgan dinamik displey opsiyalarining dasturiy ta'minotini ko'rib chiqmaymiz - bu maqolani asossiz ravishda shishiradi. Biz eng mashhur uchta misol bilan cheklanamiz: satrlar va ustunlarni to'g'ridan-to'g'ri boshqaradigan tekis matritsa, dekoderdan foydalanish bilan bir xil va nihoyat, siljish registrlaridan foydalanadigan variant. Barcha holatlarda, dasturiy ta'minotni amalga oshirishning barcha nuanslariga alohida e'tibor qaratiladi, ya'ni C kodiga tushuntirishlar faqat muallifning niyatiga to'g'ri keladigan hollarda qo'shiladi va sizning tayyorgarlik darajangiz bilan emas. . Bu bilan men C tili asoslarini mensiz bilishingiz kerakligiga ishora qilaman.

Barcha misollar uchun biz displeyimiz umumiy katodli etti segmentli ko'rsatkichlar asosida qurilganiga rozi bo'lamiz.

3.1 Eng oddiy usul

Shubhasiz, dasturda ma'lum bir massivga ega bo'lish eng qulay bo'lar edi, uning mazmuni displeyning qaysi segmentlarida qaysi segmentlarda yonishini aniq aniqlaydi - bu ekrandagi operativ xotiraning o'ziga xos analogidir.

Keling, quyidagi konstantalarning ta'rifini kiritamiz:

#define SCR_SZ 6 /* ko'rsatuvchi tanishlar soni */ #define ROWS PORTB /* “satrlar” portini ko'rsatish, ya'ni. segmentni boshqarish */ #define COLS PORTD /* "ustun" boshqaruv porti, ya'ni. umumiy katodlar */

Endi ekran massivini e'lon qilamiz:

Unsigned char SCR;

Boshlash uchun biz massivning har bir elementi displeyning tanishligiga mos keladi va bu elementning har bir biti indikatorning ma'lum bir segmentiga mos keladi deb taxmin qilamiz. Qaysi bit qaysi segmentga to'g'ri keladi - bu holda bu muhim emas, xuddi bu bitlar massiv baytlarida qanday o'rnatilganligi muhim emas, biz hozircha ular allaqachon mavjud deb taxmin qilamiz. Oddiylik uchun, shuningdek, umumiy katodlar port pinlariga ulangan deb taxmin qilamiz COLS ketma-ket: eng kam ahamiyatli bit - eng o'ngdagi ko'rsatkich, keyin ikkinchi, keyin uchinchi va hokazo.

Ushbu massivni displeyda qanday qilib “displey” qilish mumkin? Quyidagi kodni yozamiz:

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

U kerakli funktsiyani bajaradimi? Ha. Lekin bu yaxshi emas.

Avvalo, satr va ustunlar mazmuni qanchalik tez yangilanishini nazorat qila olmaymiz. Ikkinchidan, yangi massiv elementi chop etilgunga qadar e'tibor bering QATLAR chiziqlar ustida COLS Eski ma'no hali ham mavjud! Qayerga olib boradi? Bundan tashqari, bir soniyaning bir qismi uchun tanishlik maydoni qo'shni tanish hududining segmentlarini ko'rsatadi, ya'ni. ba'zi segmentlar noto'g'ri yoritilgan bo'ladi.

Buni amalga oshirish orqali bu ta'sirdan qochishingiz mumkin: tarkibni yangilashdan oldin QATLAR, har doim oldingi bo'lgan tanish joyni o'chiring. Oldingi tanishlikni aniqlash bilan bezovtalanmaslik uchun siz hamma narsani birdaniga o'chirib qo'yishingiz mumkin. Shunday qilib, bizning kodimiz quyidagi shaklni oladi:

Unsigned char pos; while(1) for(pos = 0; pos< SCR_SZ; pos++){ COLS = 0xFF; ROWS = SCR; COLS = ~(1 << pos); delay(); }

Segment chiziqlarining holatini yangilashdan oldin biz butun displeyni bo'shatishni qo'shdik (umumiy katodlarni yuqoriga yuborish orqali biz anodlarda mavjud bo'lgan narsadan qat'iy nazar indikatorni o'chirib qo'yamiz) va tsikl oxirida kechikish kiritdik. Endi displey ancha yaxshi ishlaydi. Lekin biz yaxshi dastur yozdikmi? Afsuski yo `q.

Haqiqat shundaki, cheksiz displey tsikli esa bu bizga boshqa hech narsa qilishimizga imkon bermaydi. Bizda faqat indikatorda biror narsani ko'rsatadigan qanday dastur bo'ladi?! Albatta, hamma narsa 100% yomon emas, chunki uzilishlar yordamida foydali narsalarni qilish mumkin ... va kechiktirish o'rniga kechikish() ba'zi harakatlarni bajarishingiz mumkin ... Lekin bularning barchasi juda va juda qiyshiq: uzilishlar bilan ishlov beruvchilarda murakkab va noqulay narsalarni bajarish tavsiya etilmaydi; boshqa tomondan, agar siz kechikish o'rniga murakkab va mashaqqatli ish qilsangiz, unda bir xil hisoblash vaqtini ta'minlash qiyin, aks holda tanish joylar turli vaqtlarda porlashi aniq bo'ladi, bu esa vizual ravishda ularning joylariga o'xshaydi. turli yorqinlikdagi porlash yoki miltillash.

Umuman olganda, ushbu variantga faqat istisno tariqasida, faqat o'qitish misoli sifatida yoki hal qilinayotgan asosiy muammo juda oddiy bo'lgan hollarda (lekin yana, istisno sifatida!) ruxsat berilishi mumkin (masalan, bu bo'lishi mumkin). , yordamida o'lchash muammosi ADC kuchlanish va uni displeyda ko'rsatish).

Nima qilish kerak? Javob, har doimgidek, oddiy: asosiy vazifani hal qilishda sezilmasdan bajarilishi kerak bo'lgan barcha jarayonlar (va ko'rsatma, albatta, bunday jarayon) taymer uzilishlari yordamida amalga oshirilishi kerak.
Uzilishlar qat'iy belgilangan vaqt oralig'ida keladi, bu tanish belgilarning bir xilda yoritilishini ta'minlaydi. Fon ko'rsatkichi bizga asosiy tsiklda kerakli vaqtda massivga biror narsani yozishga imkon beradi SCR- va u darhol displeyda paydo bo'ladi! Va kodga kiritilgan barcha o'zgarishlar shuni anglatadiki, biz tsikllar o'rniga uzilishni qayta ishlash funktsiyasidan foydalanamiz:

ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; COLS = 0xFF; ROWS = SCR; COLS = ~(1)<< pos); if(++pos == SCR_SZ) pos = 0; }

Bir nechta sharhlar.

O'zgaruvchan pos, joriy yoritilgan belgining sonini ko'rsatib, biz uni lokal statik o'zgaruvchiga aylantiramiz, shunda u uzilishdan uzilishgacha o'z qiymatini saqlab qoladi. Funktsiyaning oxirida biz mustaqil ravishda (oxir-oqibat, bizda pastadir yo'q) chegaraga yetguncha tanish joyning sonini oshiramiz - bu holda biz yana boshiga o'tamiz.

Asosiy dasturda biz faqat portlar va taymerni ishga tushirishimiz kerak (bu holda - Taymer 0), shuning uchun u bizga kerak bo'lgan vaqt oralig'ida toshib ketadi va uzilishlarga yo'l qo'ying. Shundan so'ng, siz ko'rsatma haqida o'ylamasligingiz kerak - u o'z-o'zidan tinch va osoyishta ishlaydi. Ammo kerakli taymerni to'ldirish oralig'ini qanday aniqlash mumkin? Juda oddiy. Inson ko'zi 25 Gts dan ortiq chastotali miltillashni doimiy porlash sifatida qabul qiladi. Bizda 6 ta indikator bor, ularning har biri bu chastota bilan miltillashi kerak, ya'ni displeydagi ma'lumotlar 25 x 6 = 150 Gts yoki undan ortiq chastota bilan yangilanishi kerak. Keling, taymerni oldindan o'lchash moslamasining qiymatini hisoblaylik: MK soat chastotasini 256 ga bo'ling ( Taymer 0 hammada bor AVR sakkiz bitli, ya'ni u 256 ga sanagandan keyin to'lib ketadi) - bu taymer oldindan o'lchovchining kerakli qiymati bo'ladi. Albatta, natija standart oldindan o'lchov qiymatlaridan biriga to'g'ri kelishi dargumon - bu muammo emas, siz eng yaqinroq mos qiymatni olishingiz mumkin. Displey yuqori chastotada ishlaydi, lekin bu uning sifatini pasaytirmaydi! Yon ta'sir displey uchun MK yadrosiga katta yuk bo'ladi. Agar bu asosiy dasturga katta xalaqit bersa, siz displeyni boshqa taymerga, masalan, 16 bitli taymerga o'tkazishingiz kerak bo'ladi. Taymer 1, yoki o'tkazib yuborilgan taymer to'lib ketishi uchun hisoblagichni kiriting:

#define SKIP 15 /* oʻtkazib yuborish uchun taymer uzilishlar soni */ ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; statik unsigned char skip = SKIP; agar (--skip) qaytsa; oʻtkazib yubor = SKIP; COLS = 0xFF; ROWS = SCR; COLS = ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

Ushbu soddalashtirilgan misollarda biz portga buni taxmin qilamiz COLS, ko'rsatkichlarning umumiy katodlaridan tashqari, boshqa hech narsa bog'lanmagan. Biroq, haqiqiy hayotda bunday omad tez-tez sodir bo'lmaydi va bu portning qolgan liniyalariga boshqa narsa ulangan bo'lishi mumkin. Shuning uchun, dinamik displeyni tashkil qilishda siz doimo displeyda bevosita ishtirok etmaydigan barcha port liniyalarining holati o'zgarmasligini ta'minlashingiz kerak. Bu oddiygina amalga oshiriladi: portga yangi qiymat yozish o'rniga, keraksiz bitlarni maskalashdan foydalanishingiz kerak:

COLS |= 0x3F; // shuning uchun biz barcha tanish joylarni o'chiramiz COLS &= ~(1<

Ikkala operator ham portning eng muhim bitlarining qiymatini o'zgartirmaydi COLS.

3.2 Dekoder bilan usul

Dekoder yoki konvertatsiya qilish uchun ishlatilishi mumkin HEX yoki BCD kodni etti segmentli belgilarga kiriting yoki matritsa ustunlaridan birini tanlang. Ikkala variant ham avval muhokama qilingan eng oddiy usuldan faqat portlarga chiqish qanday tashkil etilishi bilan farq qiladi QATLAR va/yoki COLS, dekoder kirishlari ulanadi.
Etti segmentli belgini olish uchun dekoderdan foydalanish varianti:

ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; COLS |= 0x3F; ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1)<< pos); if(++pos == SCR_SZ) pos = 0; }

Ko'rib turganingizdek, o'zgarishlar minimal - ko'rsatishdan oldin QATLAR massivdan belgilar kodi SCR, eng muhim bitlar maskalanadi, shundan so'ng eng kam ahamiyatli bitlar belgilar kodiga muvofiq o'rnatiladi. Ya'ni, dekoder portning 4 ta ahamiyatsiz bitiga ulangan deb hisoblaymiz QATLAR.

Umid qilamanki, ustunlarni dekodlash uchun misol keltirishning ma'nosi yo'q - hamma narsa allaqachon aniq.

3.3 Ro'yxatdan o'tish usuli

Shift registrlari yordamida dinamik ko'rsatkich ilgari muhokama qilingan usullardan tubdan farq qilmasa ham, uni amalga oshirishning bir nechta variantlari mavjud. Biz eng oddiyini ko'rib chiqamiz - bitlarni faqat dasturiy ta'minot orqali chiqarish. Va boshqalarni amalga oshirishda (foydalanish USI/USART/SPI/TWI) siz o'zingizni sinab ko'rishingiz mumkin.

Oldin tanlangan 6 va etti segmentli tanish joylarni ko'rsatish varianti uchun biz 2 turdagi siljish registrlaridan foydalanamiz. 74HC595. Ushbu registr uchta signal bilan boshqariladi: ketma-ket ma'lumotlarni kiritish takt pulslari CLK, haqiqiy ma'lumotlar DATA va registrda yozilgan ma'lumotlarning bir vaqtning o'zida parallel chiqishi pulsi SET. Tegishli makroslarni e'lon qilaylik (oddiylik uchun biz barcha signallarni bitta portga yuboramiz):

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

Registrga yozish uchun alohida funktsiyani yozish qulay:

Statik bekor siljishi(insigned char d)( unsigned char i; for (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; } }

Bu funktsiyani statik qilish juda tavsiya etiladi, chunki u uzilish ishlovchisida qo'llaniladi. Kompilyator, ehtimol, shaklda statik funktsiyalarni bajaradi mos ravishda-uzilish ishlovchisiga qo'shimchalar, ya'ni. keraksiz steklardan foydalanish bo'lmaydi, bu statik bo'lmagan funksiyalar uchun kafolatlanmaydi.

Endi bizning interrupt ishlovchimiz quyidagicha ko'rinadi:

ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; shift(SCR); shift(~(1)<< pos)); REG_PORT |= SET; // выдаем импульс SET REG_PORT &= ~SET; if(++pos == SCR_SZ) pos = 0; }

Registrlarga yozilgan ma'lumotlar bir vaqtning o'zida uning chiqishlarida paydo bo'lganligi sababli, birinchi navbatda ko'rsatkichlarni o'chirishga hojat yo'q. Shuni esda tutish kerakki, dasturiy ta'minotning ketma-ket chiqishi juda uzoq jarayon, ayniqsa katta o'lchamli matritsalar uchun, shuning uchun uni iloji boricha tezlik uchun optimallashtirish kerak. Buni MCUda joylashgan ketma-ket chiqish apparati yordamida amalga oshirish mumkin.

4 Hech qachon yetmaydiganlar uchun

Shunday qilib, siz dinamik displeyni amalga oshirish asoslari bilan tanishdingiz. Lekin, odatdagidek, savollar kamaymayapti, balki ko'paymoqda. Ulardan ba'zilarini oldindan bilib, darhol kerakli javoblarni berishga harakat qilaman.

4.1 Anodlar, katodlar - nimani tanlash kerak?

Biz ilgari ko'rib chiqqan hamma narsa umumiy katodli ko'rsatkichlar bilan bog'liq. Agar uni umumiy anodlar bilan ishlatmoqchi bo'lsangiz nima bo'ladi? Umuman olganda, hamma narsa bir xil bo'lib qoladi, faqat chiqarishdan oldin ma'lumotlarni o'zgartirish kerak bo'ladi - tanishlikni tozalash nollarni chiqarish orqali amalga oshiriladi. COLS, ateşleme - mos ravishda, birliklar va segmentlar QATLAR birlar o'rniga nollar kiritiladi. Shunday qilib, uzilishni ishlov beruvchisi quyidagicha ko'rinadi:

ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; COLS &= 0xC0; ROWS = ~SCR; COLS |= (1)<< pos); if(++pos == SCR_SZ) pos = 0; }

Hammasi oddiy. Albatta, siz umumiy anodlar va umumiy katodlar uchun mos universal kod yozishga harakat qilmasangiz. Buning ikki yo'li mavjud: shartli kompilyatsiya direktivalari yoki konversiya funktsiyasidan foydalanish. Men birinchi variantni ko'rsataman va ikkinchisini o'zingiz o'ylab ko'rishingizni maslahat beraman.

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

Bu biroz og'ir bo'lsa-da, uni bir marta yozganingizdan so'ng, uni deyarli hech qanday o'zgarishsiz barcha loyihalarda ishlatishingiz mumkin.

4.2 Miltillash

Ko'pgina hollarda displey nafaqat qurilma ichidan keladigan ma'lumotlarni ko'rsatish vositasi sifatida, balki foydalanuvchi kiritgan ma'lumotlarni ko'rsatish uchun ham ishlatiladi. Va bu holda, displeydagi o'zgarmasni o'zgaruvchandan qandaydir tarzda ajrata olish kerak. Buning eng oson yo'li - mos keladigan tanish joyni (yoki bir nechta tanish joylarni) miltillashdir.

Buni qilish juda oson. Keling, global o'zgaruvchini kiritaylik, uning har bir birligi miltillovchi belgini bildiradi:

unsigned char miltillash = 0;

Endi uzilish ishlovchisini biroz o'zgartiramiz:

ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; statik unsigned char entry = 0; COLS |= 0x3F; if(!(blink & (1)<

Ko'rib turganingizdek, faqat bitta statik o'zgaruvchi qo'shilgan - uzilish ishlovchisiga kirishlar hisoblagichi kirish, va shartni tekshirish operatori. Mantiq oddiy: keyingi tanishishning chiqishi faqat mos keladigan bitda amalga oshiriladi miltillash nol yoki hisoblagichning eng muhim biti kirish 1 ga teng. Agar, deylik, miltillash barcha nollarni o'z ichiga oladi, keyin bu shart har doim bajariladi - barcha tanish joylar ko'rsatiladi. Agar miltillash uning bitlaridan birida 1 bo'lsa, tegishli belgi faqat hisoblagichning eng muhim biti 1 ga teng bo'lgan vaqtda yonadi. Hisoblagich har safar uzilish ishlovchisi kiritilganda ortib borgani uchun, mos keladigan belgi yonadi. uzilish chastotasidan 128 marta kamroq chastotali miltillash.

4.3 Segmentlarning yorqinligini sozlash

Yorqinlikni sozlash haqida men shunday deb nomlangan alohida maqolada yozdim.

4.4 Pinlarni o'zboshimchalik bilan taqsimlash

Yuqorida aytilgandek, butun MK portini namoyish qilish uchun bag'ishlash baxti juda kam uchraydi. Biroq, agar bitta port butunlay satrlar uchun, ikkinchisi esa displey matritsasining ustunlari uchun ishlatilsa, bosilgan elektron plataning qulay izini olish kamdan-kam uchraydi. Ko'pincha, optimal kuzatish faqat ikki yoki undan ortiq mikrokontroller portlari o'rtasida satrlar va ustunlar aralashtirilganda olinadi. Displey paytida bitlarning dasturiy ta'minotini qayta tashkil etishni tashkil qilsangiz, bosilgan elektron plataning go'zalligini qurbon qilishingiz shart emas.

Keling, mavhum misolni ko'rib chiqaylik. MK portlarining chiziqlari bo'ylab signallarni quyidagi taqsimlash bilan eng yaxshi kuzatuv ta'minlansin:

A segmenti

B segmenti

H segmenti

C segmenti

D segmenti

G segmenti

E segmenti

F segmenti

Ko'rib turganingizdek, matritsa chiziqlari uchta port o'rtasida aralashtiriladi va ushbu portlarning barcha foydalanilmagan chiziqlari, tabiiy ravishda, ko'rsatish jarayonida o'z darajalarini o'zgartirmasligi kerak.

Segmentlarni belgilar bitlari bo'ylab taqsimlash orqali bu holat uchun dinamik ko'rsatkich funksiyasini ishlab chiqishni boshlash yaxshidir. Ilgari biz massivda bunga ishonardik SCR Biz belgilarning bit niqoblarini saqlaymiz, ya'ni. Baytdagilar nurli segmentlarni bildiradi. Qaysi bit qaysi segmentga mos kelishi haqida o'ylamadik. Demak, hozir bu haqda o'ylash vaqti keldi.

Port liniyalarining maqsadini uchta plastinka shaklida bo'yash qulay:

1

A

0

4

H

3

2

B

F

E

5

G

D

C

Biz barcha segmentlarni bitta baytga to'plashimiz kerak. Bu smena operatsiyalari bilan amalga oshirilishi kerak, shuning uchun siz ularni minimal smenalarni amalga oshirish uchun taqsimlashga harakat qilishingiz kerak. Keling gaplashamiz.

Agar segment bit bo'lsa FEGDC ramzda qoldiring, shunda ular ichiga tushadi PORTD siljishlarsiz, keyin segment H belgining 6-bitida ham qolishi mumkin va uni chiqarishdan oldin siljitish ham shart emas PORTC, lekin segmentlar uchun A Va IN 7 va 3 bitlari qoladi, ya'ni katta ehtimollik bilan segment IN chiqishdan oldin 3 ta pozitsiyaga siljitish kerak bo'ladi va segment A- tomonidan 6. Men ushbu variantga e'tibor qarataman va siz minimal siljishlarni qidirishni davom ettirishingiz mumkin (bir nechta pozitsiyalar bo'yicha siljishlar unchalik tez operatsiya emas, shuning uchun ularning sonini minimal darajaga kamaytirish tavsiya etiladi).

Shunday qilib, bizning holatlarimizda biz belgilar bayti bo'yicha quyidagi bit taqsimotini oldik:

A

H

F

E

B

G

D

C

Tegishli portlarga chiqish uchun bit maskalarini belgilaymiz:

D

0

0

1

1

0

1

1

1

0x37

B

1

0

0

0

0

0

0

0

0x80

C

0

1

0

0

1

0

0

0

0x48

Ushbu maskalardan foydalanib, "bit bo'yicha AND" operatsiyasidan foydalanib, biz portga chiqish uchun kerakli bitlarni tanlaymiz.

Maska konstantalarini e'lon qilaylik:

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

Ilgari biz belgini bitta portga chiqardik QATLAR, endi bu protsedura uch qismga bo'linadi:

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

E'tibor bering, pul olish uchun PORTC bir bit siljishsiz, ikkinchisi esa siljish bilan chiqishi kerak, shuning uchun o'rniga MASKC Men alohida makroslardan foydalanishim kerak edi _BV().

Endi tegishli tanish joylarni qanday o'chirish va yoritishni hal qilish kerak. Keling, tanishlikni boshqarish bitlariga mos keladigan konstantalarni e'lon qilaylik:

#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) #def COM_C (COM2 | COM3 | COM4) #COM_B ni aniqlang (COM0 | COM1)

Barcha tanishlarni o'chirish uchun siz portlarga mos keladigan konstantalarni chiqarishingiz kerak COM_x:

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

Ammo tanishlikni yoqish uchun siz hiyla-nayrang bo'lishingiz kerak (har uchta portga chiqishning ma'nosi yo'q, chunki qiymatga qarab ma'lum bir portda faqat bitta bit faol bo'ladi. pos), masalan, operator yordamida almashtirish:

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

Bu eng chiroyli usul emas, lekin u ishlaydi.

Shunday qilib, bizning uzilish ishlov beruvchimiz quyidagi shaklni oladi:

ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; statik unsigned char pos = 0; // PORTD ni bostirish |= COM_D; PORTC |= COM_C; PORTB |= COM_B; // PORTD = (PORTD & ~MASKD) ni ko'rsatish | ( SCR va MASKD); PORTB = (PORTB va ~MASKB) | ((SCR va MASKB) >> 6); PORTC = (PORTC va ~MASKC) | ((SCR va _BV(6)) | (((SCR va _BV) (3)) >> 3); // miltillash if(!(miltillash va (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; }

Endi chiqish uchun belgilarni qanday qilib qulayroq tasvirlashni aniqlash qoladi... Men quyidagilarni qilishni taklif qilaman: segmentlarning bitlariga mos keladigan konstantalarni aniqlang, so'ngra ushbu konstantalardan kerakli belgilarni "konstruktsiya qiling":

// elementar segmentlar #aniqlash _A _BV(7) #aniqlash _B _BV(3) #aniqlash _C _BV(0) #aniqlash _D _BV(1) #aniqlash _E _BV(4) #aniqlash _F _BV(5) #aniqlash _G _ (2) #define _H _BV(6) // raqamli belgilar #aniqlash d_0 (_A | _B | _C | _D | _E | _F) #aniqlash d_1 (_B | _C) #aniqlash d_2 (_A | _B | _G | _D | _E) // va boshqalar

Shunday qilib, agar siz displeyning o'ng tomonida nolni ko'rsatishingiz kerak bo'lsa, shunchaki kerakli joyga yozishingiz kerak:

SCR = d_0;

Agar boshqa loyihada siz bitlarni boshqacha taqsimlashingiz kerak bo'lsa, siz faqat makrolardagi raqamlarni o'zgartirasiz _BV() elementar segmentlar uchun va barcha belgilar avtomatik ravishda "qayta tiklanadi". Boshida tasvirlangan eng oddiy holatlar uchun siz boshqa hech narsa qilishingiz shart emas, lekin "bitni qayta tartibga solish" varianti uchun siz, albatta, o'ylashingiz kerak bo'ladi.

4.5 Tugmalarni qo'llab-quvvatlash

MK pinlarining an'anaviy etishmasligi bilan har qanday qurilma kamdan-kam hollarda qila oladigan ko'p sonli tugmalar muammosi juda keskin. Har xil matritsali qo'shimchalar va boshqalar qo'llaniladi. fokuslar, ammo dinamik displey funktsiyasini biroz murakkablashtirgan holda, displeyda tanishlar bo'lganidek, sizning ixtiyoringizda shuncha tugmachalarga ega bo'lish oson va bu holda siz qo'shimcha ravishda faqat bitta mikrokontroller portidan foydalanishingiz kerak bo'ladi. To'g'ri, siz hali ham har bir tugmachaga diod o'rnatishingiz kerak.

Bu rasmda sxematik tarzda ko'rsatilgan.

Va dastur quyidagicha ko'rinadi:

#define keypin() (!(PIND & _BV(KEY))) ISR(TIMER0_OVF_vect)( statik unsigned char pos = 0; static unsigned char entry = 0; static unsigned char 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; } }

Bu yerga KEY- bu tanlangan portning bitini o'rnatadigan makros, unda barcha tugmalar "ulangan", makro. keypin() tanlangan pin mantiqiy past bo'lsa, TRUE mantiqiy qiymatini qaytaradi. Misolda, tugmalar ulangan PORTD.

Har safar taymer uzilishi sodir bo'lganda, barcha segmentlar birinchi bo'lib o'chadi - bu LEDlar orqali oqim bosilgan tugmachaning noto'g'ri aniqlanmasligiga olib kelmasligi uchun kerak. Shundan so'ng, tugmani kiritish so'raladi - agar daraja past bo'lsa, bu mos keladigan pos katodiga ulangan tugma bosilganligini anglatadi. O'zgaruvchida tmp_key tugma holatlari to'planadi va global o'zgaruvchiga qayta yoziladi kalit ko'rsatish davri tugagandan so'ng. Vaqti-vaqti bilan ma'noni tahlil qilish kifoya kalit va aniqlangan kliklarni qayta ishlash:

Static unsigned char get_key())( unsigned char tmp = 0; tmp = key; _delay_ms(10); if(key == tmp) tmp qaytaradi; aks holda 0; )

Ushbu oddiy funktsiya tugmachalar so'rovining "dinamik" tabiati tufayli, sakrash ehtimoli allaqachon past bo'lishiga qaramay, tugmalar sakrab chiqmasligini ta'minlaydi.

5 Yana nima?

Shunday qilib, siz dinamik displeyni amalga oshirishning odatiy usullarini o'zlashtirgansiz. O'ylaymanki, bu sizga birinchi marta va hatto butun umringiz uchun etarli bo'ladi. Oxir-oqibat, asosiy narsa texnika va algoritmlarni tushunishdir va siz har doim noziklik va nuanslarni o'zingiz qo'shishingiz mumkin. Ammo dinamik displeyga "yaqin" yana nima kutishi mumkin?

Yuqorida aytganimdek, siz har bir segmentni mustaqil tartibga solishgacha qo'shishingiz mumkin.

Siz uzilishni qayta ishlovchining optimalligi haqida o'ylashingiz mumkin - ta'lim maqsadlarida men juda qo'pol kod yozganman, masalan, men hamma joyda foydalanardim. SCR, garchi qiymatni mahalliy o'zgaruvchiga bir marta o'qib, keyin uning qiymati bilan ishlash optimalroq bo'lar edi. Optimizator, albatta, mening yondashuvimga yordam berishiga qaramay, amaliyot uchun o'zingizni sinab ko'rish va optimallashtirish, natijada olingan kod hajmi va/yoki dastur tezligi nuqtai nazaridan o'zingizni kuzatib borish kerak.

Atrofdagi yorug'lik darajasiga qarab displeyning yorqinligini avtomatik ravishda sozlashning qiziqarli g'oyasi haqida o'ylashingiz mumkin. Ma'lumki, LED ko'rsatkichlari qanchalik qorong'i bo'lsa, kamroq ko'rinadi - ular shunchaki xiralashadi. Shuning uchun qorong'uda indikatorlarning yorqinligini pasaytirish, kunduzgi soatlarda oshirish maqsadga muvofiqdir. Eng oddiy narsa yorug'lik sensori sifatida alohida fotorezistor yoki LEDni ishlatishdir, lekin siz buni boshqacha qilishingiz mumkin: ma'lumki, LED fotodiod sifatida ham ishlashi mumkin, shuning uchun agar siz ko'rsatkich uchun kirishga ulangan portdan foydalansangiz. ADC, keyin, agar xohlasangiz, indikatorning yorug'liksiz segmentining foto-emfini o'lchashingiz mumkin va bu qiymatdan yorqinlikni sozlash uchun foydalaning...

Men allaqachon ishora qilgan ketma-ket chiqish uskunasidan foydalanish haqida o'ylashingiz mumkin.

Dinamik displeyga mutlaqo universal yondashuvning qiziqarli versiyasini taklif qildim, men u bilan tanishishni tavsiya qilaman. MOLCHEC. Qisqacha aytganda, mohiyat: segmentlarni ramz bitlari bo'yicha taqsimlash, indikatorni boshqarish uchun portlarni belgilash va hatto indikatorning turi - qisqasi, barcha, barcha, barcha parametrlar - konfiguratsiya jadvali shaklida ko'rsatilgan. EEPROM. Ushbu jadvalga asoslanib, hamma narsa dasturiy tarzda tashkil etilgan: indikator turiga qarab inversiyadan tortib, turli portlardagi bitlarni qayta tartibga solishgacha. Bunday holda, dinamik displey dasturining manba kodi har doim o'zgarishsiz qoladi va konfiguratsiya jadvali oxirgi foydalanuvchi tomonidan uning afzalliklariga qarab tuziladi. Usul haqiqatan ham universal va moslashuvchan, ammo dastur xotirasini ko'paytirish bilan bog'liq.


3 Muallif: ARV, 06:48 da 25/08/2010
Misha, agar men sizning o'rningizda bo'lsam, "siz buni qila olmaysiz", "hech kim yozmagan" yoki "mualliflik huquqi" kabi qat'iy gaplarni aytmagan bo'lardim, chunki birinchidan, bu xushmuomalalik emas, ikkinchidan:
1. Men uzoq vaqt oldin 10x16 matritsada sudraluvchi chiziq yasaganman (bu shunday edi) - uning ishlashi videosini ushbu eslatmada topishingiz mumkin http://site/content/view/160/38/
2. LCD displeyda tickerni qanday qilish haqida maqola yozdim (buni yangiliklarda topasiz - bugungi kun uchun oxirgi). Agar siz miyangizni biroz chalg'itsangiz, matritsaga chiqish algoritmini qayta tiklash - bu arzimas narsa.
3. Mening veb-saytimda biron bir joydan ko'chirilgan bironta ham maqola yo'q (nusxalash-joylashtirish mualliflik huquqi emas, siz matn terish xatosi qildingiz), barcha materiallar butunlay original. Ko'pgina saytlarda ushbu materiallarning nusxalari mening ruxsatim bilan (yoki o'z materiallarini bir vaqtning o'zida ko'p joylarda nashr etish huquqiga ega bo'lgan materiallar mualliflarining ruxsati bilan) mavjud.

Faqat ro'yxatdan o'tgan foydalanuvchilar izoh qoldirishlari mumkin.
Iltimos, ro'yxatdan o'ting yoki hisobingizga kiring.

DKo'rsatkichda ko'p xonali raqamni ko'rsatish uchun birinchi navbatda u bilan murakkab manipulyatsiyani amalga oshirishingiz kerak, bu raqamni uning tarkibiy qismlariga ajratishdan iborat. Misol sifatida, men umumiy anodli to'rtta etti segmentli indikatorda 1234 raqamini ko'rsataman.


To'rt xonali raqamni ko'rsatish uchun siz ko'rsatmoqchi bo'lgan raqam yotadigan bitta umumiy o'zgaruvchini yaratishingiz kerak (o'zgaruvchi V), har bir belgi uchun ma'lumotlar saqlanadigan to'rtta o'zgaruvchi (N) va oraliq transformatsiyalar uchun yana to'rtta o'zgaruvchi (M), asosiy o'zgaruvchiga tegmaslik uchun. O'zgaruvchi unda saqlanadigan qiymatga mos kelishi kerakI. Shunday qilib, o'zgaruvchi uchunVturi etarli bo'ladibutun son , chunki bu turdagi o'zgaruvchi saqlashga qodirQiymatlarni -32768 dan +32767 ga o'zgartiring (yokiso'z agar siz salbiy raqamlardan foydalanishni rejalashtirmasangiz). O'zgaruvchilardaN0 dan 9 gacha raqamlar bo'ladi, shuning uchun kabi o'zgaruvchidan foydalaningbayt
. Va o'zgaruvchilardaM bo'ladio'zgaruvchidagi kabi bir xil qiymatlarV, shuning uchun biz turni o'rnatdik butun son .

Xira W butun son sifatida
Dim N1 Bayt sifatida
Dim N2 Bayt sifatida
Dim N3 bayt sifatida
Dim N4 bayt sifatida
Xira M1ni butun son sifatida
Xira M2 butun son sifatida
Xira M3 butun son sifatida
Xira M4 butun son sifatida


O'zgaruvchilarni e'lon qilgandan so'ng, biz chiqish portlarini sozlaymizindikatorni ulash uchun ishlatiladi:

DDRC = &B11111111
DDRD = &B11111111


DDRC =&B 00001111 va DDRD =&B 01111111 (C portining to'rtta birinchi oyog'ianodlar va birinchi oltita portlar uchun segmentlar uchun D).

Keyin o'zgaruvchiga tayinlaymiz V biz indikatorda ko'rsatmoqchi bo'lgan qiymat:

W=1234

"Arial", "sans-serif""> Dasturning asosiy siklida M o'zgaruvchilarga o'zgaruvchining qiymatini beramizW, men buni qilaman:

M1 = Vt
M2 = M1
M3 = M1
M4 = M1


"Arial", "sans-serif""> Bu paranoya emas)), bu barcha o'zgaruvchilar M bir xil raqamni o'z ichiga olishi uchun amalga oshiriladi, chunki tayinlash operatsiyasi davomida uzilish osongina buzilishi mumkin (agar mavjud bo'lsa va o'chirilmasa), ishlov beruvchida o'zgaruvchanV o'zgarishi mumkin. Va agar topshiriq shunday bo'lsa: M1 = W , M 2= Vt , M 3= Vt , M 4= Vt M o'zgaruvchilari turli qiymatlarni o'z ichiga oladi, bu esa o'qishlarda tartibsizlikka olib keladi.

O'zgaruvchilarga qiymatlarni tayinlagandan so'ng, biz ishlashni boshlaymiz
ularning har biri o'zgaruvchiga aylanadigan tarzda N bo'ladigan qiymatni bosing
indikatorda ko'rsatiladi: o'zgaruvchida
N 1 "1" bo'lishi kerak 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

Abs – o‘zgaruvchiga butun sonni qaytaruvchi funksiya.O‘zgaruvchiga N 1 ta zarba, aynan shu narsa talab qilingan.

O'zgaruvchiga ikkita belgilash uchun N Operatsiya 2 biroz murakkabroq bo'ladi:

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""> Boshlash uchun, funktsiyaMod birinchi uchtasini o'zgaruvchiga qaytaramiz
raqamning raqamlari (1000 ga bo'linishning qolgan qismi), keyin hamma narsa birinchi holatda bo'lgani kabi.

Bu oxirgi ikki raqam bilan deyarli bir xil:

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

M4 = M4 Mod 10
N4= Abs (m4)


Endi bizning o'zgaruvchilarimiz biz ko'rsatmoqchi bo'lgan qiymatlarni o'z ichiga oladi, mikrokontroller oyoqlarini bosib, bu qiymatlarni indikatorda ko'rsatish vaqti keldi, buning uchun biz displeyni qayta ishlash pastki dasturini chaqiramiz:

"Arial","sans-serif"">

Gosub Led

"Arial","sans-serif""> Protsessor yorliq bilan pastki dasturga o'tadiLED:

LED:

Portc = &B00001000

"Arial", "sans-serif""> Bu yerda biz yuqori darajada xizmatPORTC .3, bizda bu oyoqqa ulangan birinchi toifali anod mavjud. Keyin birinchi o'zgaruvchining qiymatini ko'rsatish uchun qaysi segmentlarni yoqish kerakligini tanlaymiz. U biz uchun bitta, shuning uchun uning oyoqlarida nol bo'ladi Portd .1 va Portd .2, bu segmentlarga mos keladi B va C ko'rsatkichlari.

N1 holatni tanlang









Tanlovni tugatish
Kutish 5

"Arial", "sans-serif""> Kerakli segmentlar yoqilgandan so'ng, 5 ms kuting va quyidagi raqamlarni ko'rsatishga o'ting:

Portc = &B00000100
N2 holatni tanlang
0-holat: Portd = &B11000000
1-holat: Portd = &B11111001
2-holat: Port = &B10100100
3-holat: Port = &B10110000
4-holat: Port = &B10011001
5-holat: Port = &B10010010
6-holat: Port = &B10000010
7-holat: Portd = &B11111000
8-holat: Port = &B10000000
9-holat: Port = &B10010000
Tanlovni tugatish

Kutish 5

Portc = &B00000010

N3 holatni tanlang
0-holat: Portd = &B11000000
1-holat: Portd = &B11111001
2-holat: Port = &B10100100
3-holat: Port = &B10110000
4-holat: Port = &B10011001
5-holat: Port = &B10010010
6-holat: Port = &B10000010
7-holat: Portd = &B11111000
8-holat: Port = &B10000000
9-holat: Port = &B10010000
Tanlovni tugatish

Kutish 5

Portc = &B00000001

N4 holatni tanlang
0-holat: Portd = &B11000000
1-holat: Portd = &B11111001
2-holat: Port = &B10100100
3-holat: Port = &B10110000
4-holat: Port = &B10011001
5-holat: Port = &B10010010
6-holat: Port = &B10000010
7-holat: Portd = &B11111000
8-holat: Port = &B10000000
9-holat: Port = &B10010000
Tanlovni tugatish

Kutish 5

"Arial", "sans-serif""> Ko'rsatkich bo'yicha ma'lumotni ko'rsatgandan so'ng, siz asosiy dastur tsikliga qaytishingiz kerak, bu erda tsiklni bajarishingiz va dasturning oxirini ko'rsatishingiz kerak.

"Arial","sans-serif""> Oxir-oqibat biz buni olamiz:

"Arial","sans-serif"">

"Arial", "sans-serif""> Kichkina kommutatsiya kechikishi tufayli kommutatsiya inson ko'ziga sezilmaydi va biz 1234 butun sonini ko'ramiz.

Quyida Proteus-da manba va loyihani yuklab olishingiz mumkin:"Arial","sans-serif"">



 


O'qing:



Avtomatik ishga tushirish uchun dasturni qanday qo'shish mumkin?

Avtomatik ishga tushirish uchun dasturni qanday qo'shish mumkin?

Windows 7 da (Windows 10) ishga tushirish operatsion tizim bilan boshlanadigan dasturlar ro'yxatini boshqarish imkonini beradi. Dasturlar oʻchirilmoqda...

Asosiy maydonlarni aniqlash

Asosiy maydonlarni aniqlash

Birinchi holda, foydalanuvchi avval loyihada mavjud bo'lganlar orasidan ro'yxat jadvalini tanlaydi va keyin ushbu jadvaldagi qatorni tanlaydi. Boshida...

HD tayyor va Full HD televizorlari

HD tayyor va Full HD televizorlari

Bugun sotib olgan har bir televizor yoki pristavka yuqori aniqlikdagi (HD) videoni qo‘llab-quvvatlaydi. Ammo shunga qaramay, ...

Tadqiqotchilar uchun ijtimoiy tarmoqlar

Tadqiqotchilar uchun ijtimoiy tarmoqlar

Ehtimol, har bir maktab o'quvchisi butun zamonaviy dunyo ulkan virtual tarmoq ekanligini biladi. Ayirboshlash vaqti...

tasma tasviri RSS