Pamokoje sužinosime apie septynių segmentų LED indikatorių prijungimo prie mikrovaldiklių schemas, kaip valdyti indikatorius.

Septynių segmentų LED indikatoriai išlieka vienu populiariausių skaitmeninės informacijos rodymo elementų.

Tai palengvina šios savybės.

  • Žema kaina. Indikacinėse priemonėse nėra nieko pigesnio už LED skaitmeninius indikatorius.
  • Dydžių įvairovė. Mažiausias ir didžiausias indikatoriai yra LED. Žinau LED indikatorius, kurių skaitmenų aukštis nuo 2,5 mm iki 32 cm.
  • Šviesti tamsoje. Kai kuriose programose ši savybė yra beveik lemiama.
  • Jie turi skirtingas šviesos spalvas. Yra net dvi spalvos.
  • Pakankamai mažos valdymo srovės. Šiuolaikinius LED indikatorius galima prijungti prie mikrovaldiklių išėjimų be papildomų mygtukų.
  • Jie leidžia dirbti atšiauriomis sąlygomis (temperatūros diapazonas, didelė drėgmė, vibracija, agresyvi aplinka ir kt.). Pagal šią kokybę LED indikatoriai neturi lygių kitų tipų ekrano elementų.
  • Neribotas tarnavimo laikas.

LED indikatorių tipai.

Septynių segmentų LED indikatorius rodo simbolį, naudodamas septynis LED skaitmens segmentus. Aštuntasis šviesos diodas apšviečia dešimtainį tašką. Taigi septynių segmentų indikatoriuje yra 8 segmentai.

Segmentai žymimi lotyniškomis raidėmis nuo „A“ iki „H“.

Kiekvieno šviesos diodo anodai arba katodai yra sujungti indikatoriuje ir sudaro bendrą laidą. Todėl yra indikatoriai su bendru anodu ir bendru katodu.

LED indikatorius su bendru anodu.

Bendras katodinis LED indikatorius.

Statinis LED valdymas.

Būtina prijungti LED indikatorius prie mikrovaldiklio per rezistorius, kurie riboja srovę.

Rezistorius apskaičiuojamas taip pat, kaip ir atskiriems šviesos diodams.

R = (U tiekimas – U segmentas) / I segmentas

Šiai grandinei: I segmentas = (5–1,5) / 1000 = 3,5 mA

Šiuolaikiniai LED indikatoriai gana ryškiai šviečia jau esant 1 mA srovei. Grandinei su bendru anodu užsidegs segmentai, kurių valdymo išėjimuose mikrovaldiklis generuos žemą lygį.

Indikatoriaus su bendru katodu jungimo schemoje keičiasi maitinimo ir valdymo signalų poliškumas.

Užsidegs segmentas, kurio valdymo išvestyje jis bus suformuotas aukštas lygis(5 V).

Daugkartinio LED valdymo režimas.

Norėdami sujungti kiekvieną septynių segmentų indikatorius prie mikrovaldiklio reikia aštuonių kaiščių. Jei yra 3 - 4 rodikliai (skaitmenys), tada užduotis tampa praktiškai neįmanoma. Tiesiog nepakanka mikrovaldiklio kaiščių. Tokiu atveju indikatoriai gali būti jungiami multipleksiniu režimu, dinaminės indikacijos režimu.

Sujungiamos kiekvieno rodiklio to paties pavadinimo segmentų išvados. Pasirodo, šviesos diodų matrica, sujungta tarp segmentų išėjimų ir bendrų indikatorių išėjimų. Čia yra trijų skaitmenų indikatoriaus su bendru anodu multipleksinio valdymo grandinė.

Norint prijungti tris indikatorius, reikėjo 11 kaiščių, o ne 24, kaip statinio valdymo režimu.

Su dinamine indikacija vienu metu dega tik vienas skaitmuo. Aukšto lygio signalas (5 V) perduodamas vieno iš bitų bendram išėjimui, o žemo lygio signalai siunčiami į segmentų išėjimus tiems segmentams, kurie turėtų būti apšviesti šiame bite. Po tam tikro laiko kita iškrova užsidega. Jo bendram išėjimui taikomas aukštas lygis, o šio bito būsenos signalai siunčiami į segmento išvestis. Ir taip visiems bitams begalinėje kilpoje. Ciklo laikas vadinamas indikatoriaus atnaujinimo laiku. Jei regeneracijos laikas pakankamai trumpas, žmogaus akis nepastebės iškrovų perjungimo. Atrodys, kad visos iškrovos nuolat šviečia. Siekiant išvengti indikatorių mirgėjimo, manoma, kad regeneracijos ciklo dažnis turi būti ne mažesnis kaip 70 Hz. Stengiuosi naudoti bent 100Hz.

Dinaminės indikacijos grandinė šviesos diodams su bendru katodu atrodo taip.

Visų signalų poliškumas yra atvirkštinis. Dabar žemas lygis taikomas bendram aktyvaus iškrovimo laidui, o aukštas lygis taikomas segmentams, kurie turėtų švyti.

Šviesos diodų (LED) indikatorių dinaminės indikacijos elementų skaičiavimas.

Skaičiavimas yra šiek tiek sudėtingesnis nei statinio režimo atveju. Skaičiuojant būtina nustatyti:

  • vidutinė segmentų srovė;
  • impulsinės srovės segmentai;
  • segmento rezistoriaus varža;
  • išlydžių bendrųjų išvadų impulsinė srovė.

Nes paeiliui užsidega indikatoriaus skaitmenys, tada švytėjimo ryškumas nustato vidutinę srovę. Turime jį pasirinkti pagal indikatoriaus parametrus ir reikiamą ryškumą. Vidutinė srovė nustatys indikatoriaus ryškumą tokiu lygiu, kuris atitinka statinį valdymą ta pačia nuolatine srove.

Pasirinkime vidutinę 1 mA segmento srovę.

Dabar apskaičiuokime segmento impulsinę srovę. Norint užtikrinti reikiamą vidutinę srovę, impulsinė srovė turi būti N kartų didesnė. Kur N yra indikatoriaus skaitmenų skaičius.

I segm. imp. = I segm. vid. *N

Mūsų schemai aš segm. imp. = 1 * 3 = 3 mA.

Apskaičiuojame srovę ribojančių rezistorių varžą.

R \u003d (U galia - U segmentas) / I segmentas. imp.

R \u003d (5–1,5) / 0,003 \u003d 1166 omai

Nustatome išlydžių bendrų išvadų impulsines sroves. Tuo pačiu metu gali šviesti 8 segmentai, o tai reiškia, kad vieno segmento impulsų srovė turi būti padauginta iš 8.

I kategorijos imp. = I segm. imp. * aštuoni

Mūsų schemai aš išleidžiu imp. = 3 * 8 = 24 mA.

  • rezistorių varža parenkama 1,1 kOhm;
  • segmentinio valdymo mikrovaldiklio išėjimai turi užtikrinti ne mažesnę kaip 3 mA srovę;
  • indikatoriaus skaitmeniui parinkti skirto mikrovaldiklio išėjimai turi užtikrinti ne mažesnę kaip 24 mA srovę.

Esant tokioms srovės vertėms, indikatorių galima prijungti tiesiai prie Arduino plokštės gnybtų, nenaudojant papildomų klavišų. Ryškiems indikatoriams tokių srovių visiškai pakanka.

Schemos su papildomais raktais.

Jei indikatoriams reikia didesnės srovės, reikia naudoti papildomus jungiklius, ypač skaitmenų pasirinkimo signalams. Bendra iškrovimo srovė yra 8 kartus didesnė už vieno segmento srovę.

Šviesos diodo indikatoriaus su bendru anodu multipleksiniu režimu su tranzistoriniais jungikliais skaitmenims parinkti elektros schema.

Norint pasirinkti bitą šioje grandinėje, būtina generuoti žemo lygio signalą. Atitinkamas klavišas atsidarys ir tiekiamas maitinimas indikatoriaus iškrovimui.

LED indikatoriaus su bendru katodu multipleksiniu režimu su tranzistoriniais jungikliais skaitmenims parinkti elektros schema.

Norint pasirinkti bitą šioje grandinėje, būtina generuoti aukšto lygio signalą. Atitinkamas jungiklis atidarys ir uždarys bendrą išleidimo į žemę išėjimą.

Gali būti grandinių, kuriose reikia naudoti tranzistorinius jungiklius tiek segmentams, tiek bendriems iškrovimo laidams. Tokios schemos lengvai sintezuojamos iš dviejų ankstesnių. Visos parodytos grandinės naudojamos, kai indikatorius maitinamas įtampa, lygia mikrovaldiklio įtampai.

Indikatorių su padidinta maitinimo įtampa klavišai.

Yra didelių dydžių indikatoriai, kuriuose kiekvienas segmentas susideda iš kelių nuosekliai sujungtų šviesos diodų. Tokiems indikatoriams maitinti reikalingas šaltinis, kurio įtampa didesnė nei 5 V. Jungikliai turi užtikrinti aukštos įtampos perjungimą, valdomą mikrovaldiklio lygio signalais (dažniausiai 5 V).

Klavišų, uždarančių indikatoriaus signalus į žemę, grandinė išlieka nepakitusi. Ir maitinimo mygtukai turėtų būti sukurti pagal kitą schemą, pavyzdžiui, šią.

Šioje schemoje aktyvus iškrovimas parenkamas pagal aukštą valdymo signalo lygį.

Tarp indikatoriaus bitų perjungimo trumpam (1-5 µs) visi segmentai turi išsijungti. Šis laikas reikalingas pereinamiesiems klavišų perjungimo procesams užbaigti.

Struktūriškai išvadų išvadas galima sujungti kaip vienu daugiaženklio rodiklio atveju arba daugiaženklį indikatorių surinkti iš atskirų vienaženklių. Be to, galite surinkti indikatorių iš atskirų šviesos diodų, sujungtų į segmentus. Dažniausiai tai daroma, kai reikia surinkti labai didelių matmenų indikatorių. Tokioms parinktims galios visos aukščiau pateiktos schemos.

Kitoje pamokoje prie Arduino plokštės prijungsime septynių segmentų LED indikatorių, rašysime biblioteką jai valdyti.

Kategorija: . Galite pažymėti žymes.

Kartais prie mikrovaldiklio reikia prijungti kelis septynių segmentų indikatorius arba LED matricą, o informacijai rodyti naudojama dinaminė indikacija. Dinaminės indikacijos esmė yra nuoseklus informacijos rodymas ant indikatorių. Žemiau esančioje diagramoje parodytas kelių septynių segmentų indikatorių (pavyzdžiui, su bendru katodu) sujungimo pavyzdys dinaminei indikacijai įgyvendinti, apskritai, atsižvelgiant į tašką, gaunami 8 segmentai, tačiau senamadiškai jie yra taip vadino. Visos to paties pavadinimo segmentų išvados (anodai) yra sujungtos, iš viso 8 linijos, kurios yra prijungtos prie mikrovaldiklio per rezistorius. Kiekvieno indikatoriaus bendras katodas yra prijungtas prie mikrovaldiklio per tranzistorių.


Indikacijos algoritmas yra toks: pirmiausia nustatome reikiamus loginius lygius eilutėse, priklausomai nuo to, kuriuos segmentus reikia įjungti pirmajame indikatoriuje (rodymas iš kairės į dešinę), su aukštu loginiu lygiu įjungti, žemą norėdami išjungti segmentą. Toliau tranzistoriaus VT1 pagrindui taikome aukštą loginį lygį, tokiu būdu bendras pirmojo indikatoriaus katodas prijungiamas prie bendro laido, šiuo metu užsidega tie segmentai, ant kurių anodų yra loginis blokas. Po tam tikro laiko (pauzės) indikatorius išjungiamas pritaikius žemą loginį lygį tranzistoriaus pagrindui, tada vėl keičiame loginius lygius linijose pagal išvesties informaciją, skirtą antrajam indikatoriui, ir taikome įjungimo signalas į tranzistorių VT2. Taigi, eilės tvarka apskritime perjungiame visus rodiklius, tai yra visa dinaminė indikacija.

Norint gauti vientisą vaizdą be mirgėjimo, perjungimas turi būti atliekamas dideliu greičiu, norint pašalinti šviesos diodų mirgėjimą, atnaujinimo dažnį reikia nustatyti nuo 70 Hz ar daugiau, aš dažniausiai nustatau 100 Hz. Aukščiau pateiktai konstrukcijai pauzė apskaičiuojama taip: 100 Hz dažniui periodas yra 10 ms, atitinkamai yra tik 4 indikatoriai, kiekvieno indikatoriaus švytėjimo laikas nustatytas 10/4 = 2,5 ms. Viename korpuse yra kelių skaitmenų septynių segmentų indikatoriai, kuriuose paties korpuso viduje sujungti to paties pavadinimo segmentai, žinoma, norint juos naudoti, būtina naudoti dinaminę indikaciją.

Norint įgyvendinti dinaminę indikaciją, būtina naudoti pertraukimus, kai perpildomas vienas iš laikmačių. Žemiau yra kodas naudojant TMR0 laikmatį:

;Dinaminės indikacijos įdiegimas 4 septynių segmentų indikatoriams swapf STATUSAS,W ; clrf STATUSAS ; movwf STATUS_TEMP ; ; bcf ind1 ;išjungti 1-ąjį indikatorių bcf ind2 ;išjungti 2-ąjį indikatorių bcf ind3 ;išjungti 3-ią indikatorių bcf ind4 ;išjungti 4-ąjį indikatorių; incf shet,F ;padidėjimo registras shet movlw .5 ;tikrinti registro turinį shet xorwf shet,W ;patikrinkite, ar jis lygus 5 btfss STATUSAS,Z ; goto met1 ;skaičius lapų registre nelygus 5 movlw .1 ;skaičius lapų registre yra 5: įrašyti numerį 1 movwf shet ;į lapų registrą ; met1 movlw .1 ; patikrinti registro turinį shet xorwf shet,W ; lygus skaičiui 1 btfss STATUS,Z ; goto met2 ;skaičius lapo registre nelygus 1: peršokti į met2 movf datind1,W ;skaičius lapo registre lygus 1: kopijuoti movwf PORTB ;datand1 registro turinys į PORTB registrą bsf ind1 ;įjungti 1-ąjį indikatorių met2 movlw .2 ;patikrinkite registro turinį xorwf shet,W ; lygus 2 btfss STATUS,Z ; goto met3 ;skaičius lapo registre nelygus 2: peršokti į met3 movf datind2,W ;skaičius lapo registre yra 2: kopijuoti movwf PORTB ;datand2 registro turinys į PORTB registrą bsf ind2 ;įjungti 2 indikatorių goto exxit ;peršokti į etiketė exxit met3 movlw .3 ; patikrinti registro turinį shet xorwf shet,W ; lygus 3 btfss STATUS,Z ; goto met4 ;skaičius lapo registre nelygus 3: peršokti į met4 movf datind3,W ;skaičius lapo registre yra 3: kopijuoti movwf PORTB ;datand3 registro turinys į PORTB registrą bsf ind3 ;įjungti 3 indikatorių goto exxit ;peršokti į etiketė exxit met4 movf datind4,W ;nukopijuokite datund3 registro movwf PORTB turinį ;į PORTB registrą bsf ind4 ;įjunkite 4 indikatorių; movlw .100 ;įrašykite 156 į laikmačio registrą TMR0 movwf TMR0 ; ; movwf STATUSAS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Pagrindinė programa ................. movlw b"11010011" ; OPTION_REG, taip nustatydami vidinį ; nustatydami išankstinio skalavimo santykį 1:16 ; clrf shet ; iš naujo nustatyti registro lapą prieš pradedant; pertraukimai dėl perpildymo TMR0, atlikti; clrf datind1 ;registrų išvalymas informacijai išvesti į clrf datind2 ;indikatorius, tai prilygsta clrf datind3 ;indikatorių, kaip indikatorių su bendru clrf datind4 ;katodu, išjungimui; bcf INTCON,T0IF; išvalyti TMR0 perpildymo nutraukimo vėliavėlę bsf INTCON,T0IE; įjungti TMR0 perpildymo pertraukimus bsf INTCON,GIE; įjungti visuotinius pertraukimus; movlw b"00000110" ; 13.52 išvesties pavyzdys movwf datind1 ; movlw b"11001111" ; movwf data2 ; movlw b"01101101" ; movwf data3 ; movlwb"01011011" ; movwf data4 ; ; . ................; .................; .................; ; pabaiga ; visos programos pabaiga;

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

;Dinaminės indikacijos įdiegimas 4 septynių segmentų indikatoriams

;Pavyzdys, laikrodžio dažnis 4 MHz, mašinos ciklas 1 µs

org 0000h ;pradėkite programos vykdymą adresu 0000h

goto Start ;eikite į etiketę Pradėti

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

;Nutraukti rutiną

org 0004h ;pradėkite paprogramės vykdymą adresu 0004h

movwf W_TEMP ;išsaugoti raktų registro reikšmes

swapf STATUSAS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;išjunkite 1 indikatorių

bcf ind2 ;išjunkite 2 indikatorių

bcf ind3 ;išjunkite 3 indikatorių

bcf ind4 ;išjunkite 4 indikatorių

incf shet,F ;prieaugio registro lapas

movlw .5 ; patikrinkite registro lapo turinį

xorwf shet, W ; lygus 5

btfss STATUSAS,Z ;

goto met1 ;skaičius registro lape nėra lygus 5

movlw .1 ;skaičius lapo registre yra 5: įrašykite skaičių 1

movwf shet ;užregistruoti lapą

met1 movlw .1 ; patikrinkite lapo registro turinį

xorwf shet,W ; lygus skaičiui 1

btfss STATUSAS,Z ;

goto met2 ;skaičius lapo registre nelygus 1: peršokti į met2

movf datind1,W ;skaičius lapų registre yra 1: kopija

movwf PORTB ; datund1 registro turinys į PORTB registrą

bsf ind1 ;įjunkite 1 indikatorių

goto exxit ;eikite prie etiketės exxit

met2 movlw .2 ; patikrinkite lapo registro turinį

xorwf shet,W ; lygus skaičiui 2

btfss STATUSAS,Z ;

goto met3 ;skaičius lapo registre nelygus 2: peršokti į met3

movf datind2,W ; skaičius lapų registre yra 2: kopija

movwf PORTB ; datund2 registro turinys į PORTB registrą

bsf ind2 ;įjunkite 2 indikatorių

goto exxit ;eikite prie etiketės exxit

met3 movlw .3 ; patikrinkite lapo registro turinį

xorwf shet,W ; lygus skaičiui 3

btfss STATUSAS,Z ;

goto met4 ;skaičius lapo registre nelygus 3: peršokti į met4

movf datind3,W ;skaičius lapų registre yra 3: kopija

movwf PORTB ; datund3 registro turinys į PORTB registrą

bsf ind3 ;įjunkite 3 indikatorių

goto exxit ;eikite prie etiketės exxit

met4 movf datind4,W ; nukopijuokite datund3 registro turinį

movwf PORTB ;į PORTB registrą

bsf ind4 ;įjunkite 4 indikatorių

exxit bcf INTCON,T0IF ;atstatyti TMR0 perpildymo nutraukimo vėliavėlę

movlw .100 ;įrašykite numerį 156 į laikmačio registrą TMR0

swapf STATUS_TEMP,W ; atkurti raktų registrų turinį

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;išeiti iš pertraukimo rutinos

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

;Pagrindinė programa

Pradėti .................. ; pradiniai nustatymai registrai

................. ;specialus tikslas

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

bsf STATUSAS,RP0 ;rašyti dvejetainis skaičius Registruotis 11010011

movlw b"11010011" ;OPTION_REG, taip nustatydami vidinį

movwf OPTION_REG ; TMR0 laikrodžio šaltinis

bcf STATUS,RP0 ;įgalinti išankstinį skalavimą prieš TMR0

;Nustatykite pirminio skalavimo santykį į 1:16

clrf shet; prieš pradėdami iš naujo nustatykite shet registrą

;perpildymo pertraukimas TMR0, atliktas

;įjungus maitinimą

clrf datind1 ; aiškūs registrai informacijai išvesti į

clrf datind2 ;indikatoriai, atitinkantys išjungimą

clrf datind3 ;rodikliai, kadangi rodikliai su bendru

clrf datand4 ;katodas

bcf INTCON,T0IF ;atstatyti TMR0 perpildymo nutraukimo vėliavėlę

bsf INTCON,T0IE ;įgalinti TMR0 perpildymo pertraukimus

bsf INTCON,GIE; įgalinti visuotinius pertraukimus

movlw b"00000110" ; 13.52 išvesties pavyzdys

movlw b"11001111" ;

movlw b"01101101" ;

movlwb"01011011" ;

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

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

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

pabaiga; visos programos pabaiga

Pagrindinėje programoje pirmiausia nustatėme laikmatį naudodami OPTION_REG registrą, anksčiau kalbėjau apie laikmačių naudojimą . Tada išvalome kiekvieno rodiklio lapų registrą, skirtą įvesti skaičių nuo 1 iki 4. Šis registras padidinamas pertraukimo rutinoje ir ten koreguojamas (jis bus skaičiuojamas nuo 1 iki 4), todėl šis valymas atliekama vieną kartą po maitinimo įjungimo. Remdamiesi šiuo registru nustatysime, kurį rodiklį įtraukti ir išduosime jį atitinkančius duomenis. Kitas žingsnis – išvalyti informacijos saugojimo registrus, keturis dataind1,2,3,4 registrus, atitinkančius keturis rodiklius. Išvalymas prilygsta indikatorių išjungimui, nes pertraukimo paslaugos rutinoje šių registrų turinys perkeliamas į PORTB registrą, prie kurio prijungiami indikatoriaus anodai. Tai būtina, kad įjungus pertraukimus indikatoriuose nebūtų rodomos šiukšlės, iš esmės to negalima padaryti, jei išvestiei nedelsiant parašyta teisinga informacija. Tada iš naujo nustatykite laikmačio perpildymo pertraukimo vėliavėlę, įgalinkite TMR0 perpildymo pertraukimus ir galiausiai įgalinkite visuotinius pertraukimus.

Pertraukimo rutinoje pirmiausia išjungiame visus indikatorius (taikant žemus logikos lygius tranzistorių bazėms), nes nežinoma, kuris įjungtas. Padidiname lapų registrą, tikrindami lygybę su skaičiumi 5, jei toks atitikmuo yra, į registrą įrašome skaičių 1, nes reikia skaičiuoti nuo 1 iki 4. Tada patikriname, kuris skaičius yra sąraše. shet registrą, kuriuo įkeliame duomenis iš PORTB į PORTB informacijos saugojimo registrus (dataind) atitinkamam indikatoriui ir įjungiame. Po to iš naujo nustatome TMR0 perpildymo pertraukimo vėliavėlę, į laikmatį įrašome skaičių 100 (šios reikšmės apskaičiavimas pateiktas žemiau), laiko uždelsimui ir išeiname iš pertraukų tvarkyklės. Pirmo pertraukimo metu įsijungia pirmasis indikatorius, antruoju – antrasis ir tt apskrito ciklo metu. Pagrindinėje programoje lieka tik įkelti duomenis į informacijos saugojimo registrus kiekvienam rodikliui. Pertraukimo paprogramėje nepamirškite išsaugoti ir atkurti raktų registrų reikšmių, apie tai rašiau straipsnyje apie.

Norėdami išvesti skaičius, geriau naudoti simbolių generatorių duomenų lentelės pavidalu. Pavyzdžiui, norint, kad indikatoriuose būtų rodomas skaičius 3456, jis turi būti padalintas į skaitmenis, tuo tarpu geriau naudoti atskirus registrus skaitmenų skaičiams (nuo 0 iki 9) saugoti, tada paleisti šiuos registrus per simbolių generatorių. gauti teisingus baitus (įkeltus į dataind registrus), kad uždegtų atitinkamus segmentus.

Laikrodžio generatoriaus dažnį laikysime 4 MHz, mašinos ciklas yra 1 μs. Tegul kiekvieno indikatoriaus atnaujinimo dažnis yra 100 Hz (periodas T = 10 ms), atitinkamai reikalingas laiko uždelsimas yra 10/4 = 2,5 ms. TMR0 išankstinio skalavimo koeficientas nustatytas į 1:16, o didžiausia galima delsa yra 256 x 16 = 4096 µs, o mums reikia 2,5 ms pauzės. Apskaičiuokime skaičių, kurį reikia įrašyti į TMR0: 256-((256x2,5)/4,096) = 256-156,25 = 99,75. Suapvalinus gauname skaičių 100.

Žemiau galite atsisiųsti „Proteus“ programos modelį, programinę-aparatinę įrangą ir šaltinio kodą su dinamine indikacija 4 skaitmenų indikatoriuje su bendru katodu, naudojant mikrovaldiklį PIC16F628A. Pavyzdžiui, indikatoriuje rodomi skaičiai 0000; 0001; 0002; 13.52 val.; 9764.

Dabar apsvarstykite galimybę prijungti 8x8 pikselių (LED) raiškos matricą. Matricos struktūra paprastai nagrinėjama eilučių ir stulpelių požiūriu. Žemiau esančiame paveikslėlyje kiekviename stulpelyje yra prijungti visų šviesos diodų katodai, o kiekvienoje eilutėje - anodai. Stygos (8 eilutės, LED anodai) jungiamos per rezistorius prie mikrovaldiklio. Kiekviena kolonėlė (LED katodai) prijungta prie mikrovaldiklio per 8 tranzistorius. Indikacijos algoritmas yra tas pats, pirmiausia eilutėse nustatome reikiamus loginius lygius, pagal kuriuos stulpelyje turėtų užsidegti šviesos diodai, tada sujungiame pirmąjį stulpelį (rodymas iš kairės į dešinę). Po tam tikros pauzės išjungiame stulpelį ir pakeičiame loginius eilučių lygius, kad būtų rodomas antrasis stulpelis, tada sujungiame antrąjį stulpelį. Ir taip pakaitomis važinėkite po visus stulpelius. Žemiau pateikta matricos prijungimo prie mikrovaldiklio schema.


Iš viso tokiai matricai prijungti reikia 16 mikrovaldiklio kontaktų, tai yra gana daug, todėl norint sumažinti valdymo linijas, geriau naudoti nuosekliuosius poslinkių registrus.

Labiausiai paplitęs serijinis registras yra 74HC595 mikroschema, kurioje yra duomenų įkėlimo poslinkio registras ir sulaikymo registras, per kurį duomenys perduodami į išvesties linijas. Duomenų įkėlimas į jį yra paprastas, SH_CP laikrodžio įėjime nustatykite loginį 0, tada DS duomenų įvestyje nustatykite reikiamą loginį lygį, po to perjungiame laikrodžio įvestį į 1, o lygio reikšmė (DS įėjime) yra saugomi pamainų registre. Tuo pačiu metu duomenys pasislenka vienu bitu. SH_CP išėjimą vėl nustatome į 0, DS įėjime nustatome reikiamą lygį ir SH_CP pakeliame iki 1. Visiškai įkrovus pamainų registrą (8 bitai), ST_CP išvestį nustatome į 1, šiuo metu duomenys perduodami. į saugojimo registrą ir tiekiamas į išvesties linijas Q0 ... Q7, po to iš naujo nustatome ST_CP išvestį. Nuoseklios įkėlimo metu duomenys perkeliami iš Q0 į Q7. Kaištis Q7' yra prijungtas prie paskutinio poslinkio registro bito, šį kaištį galima prijungti prie antrojo mikroschemos įvesties, todėl vienu metu galite įkelti duomenis į dvi ar daugiau mikroschemų. OE kaištis perjungia išvesties linijas į trečiąją (didelės varžos) būseną, kai jam taikoma logika 1. MR kaištis skirtas iš naujo nustatyti poslinkio registrą, tai yra nustatyti žemus loginius lygius registro trigerių išėjimuose. , o tai atitinka aštuonių nulių įkėlimą. Žemiau pateikiama duomenų įkėlimo į 74NS595 mikroschemą schema, nustatant reikšmę 11010001 išvesties linijose Q0 ... Q7, jei iš pradžių buvo nuliai:


Apsvarstykite galimybę prijungti 8 × 8 matricą prie PIC16F628A mikrovaldiklio naudojant du 74HC595 poslinkių registrus, diagrama parodyta žemiau:


Duomenys įkeliami į DD2 lustą (loginio lygio valdymas eilutėse, LED anodai), tada jie per Q7 kaištį perduodami į DD3 (stulpelio valdymas), atitinkamai pirmiausia įkeliame baitą, kad įjungtume stulpelį, tada baitą su loginiais lygiais eilutėse. Prie DD3 išvesties linijų prijungti tranzistorių perjungimo matricos stulpeliai (LED katodai). Žemiau yra programos kodas, skirtas vaizdui rodyti matricoje:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Dinaminės indikacijos įgyvendinimas matricai, kurios skiriamoji geba 8x8 ;Pavyzdyje laikrodžio generatoriaus dažnis yra 4 MHz, mašinos ciklas 1 μs org 0000h ;programos vykdymo pradžia nuo adreso 0000h goto Start ;peršokti į etiketę Pradėti ;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Pertraukite rutiną org 0004h ;pradėkite paprogramės vykdymą nuo adreso 0004h movwf W_TEMP ;išsaugokite raktų registro reikšmes swapf STATUS,W ; clrf STATUSAS ; movwf STATUS_TEMP ; ; movwf FSR_osn ;į FSR_osn registrą movf FSR_prer,W ;atkuria anksčiau išsaugotą FSR registro reikšmę movwf FSR ; iš FSR_prer registro ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;įkelti stolb registro turinį į lustą movf stolb,W ;nukopijuoti stolb registro turinį movwf var ;į registrą var met2 btfsc var,0 ;nustatyti išvesties ds pagal btfss var,0 ; bcf ds ; bcf sh_cp ; rrf var,F ;Shift registro var dešinė ruošti;kitas bitas goto met2 ;scetbit nelygus nuliui: peršokti į etiketę met2 ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; ;įkelkite INDF registro turinį į lustą;74HC595 (serial shift register) movf INDF,W ;nukopijuokite INDF registro turinį movwf var ;į var registrą movlw .8 ;įrašykite skaičių 8 į scetbit registrą, skaičiuojant movwf scetbit ;perkelti bitai met1 btfsc var ,7 ;nustatyti išvesties ds pagal bsf ds ;registro 7 bito reikšmė var btfss var,7 ; bcf ds ; bsf sh_cp ;laikrodis sh_cp išvestis fiksuoti duomenis bcf sh_cp ; rlf var,F ;Shift registras var paliktas paruošti;kitas bitas decfsz scetbit,F ;Sumažinti su registro sąlyga scetbit goto met1 ;scetbit nelygus nuliui: Peršokti į etiketę met1 ; bsf st_cp, laikrodis išvesties st_cp, kad perkeltų įkeltą bcf st_cp, baitus į 74HC595 lustų išvesties linijas; bcf STATUS,C ;atstatykite registro būsenos C bitą prieš perjungimą rrf stolb,F ;kairysis poslinkio registras stolb ; incf FSR,F ;Padidinkite FSR registrą, paruoškite kitą ;Užsiregistruokite siųsti duomenis į 74HC595 decfsz shet,F ;Sumažinti su registro sąlyga shet goto exxit ;Set registras nelygus 0: Peršokti į exxit movlw data1 ;Set registras lygus 0: Pirmą rašyti adresą movwf FSR ;Registeras informacijos saugojimui FSR registre movlw .8 ;Skaičiaus 8 įrašymas į lapų registrą, movwf shet priežiūrai ;Stulpelių skaičiavimas ; exxit bcf INTCON,T0IF ;atstatyti perpildymo nutraukimo vėliavėlę TMR0 movlw . 124 ;rašyti numerį 124 į laikmačio registrą TMR0 movwf TMR0 ; ; movf FSR,W ;Išsaugoti esamą FSR reikšmę movwf FSR_prer ;Į FSR_prer movf FSR_osn ,W ;Atkurti anksčiau įrašytą reikšmę movwf FSR ;FSR iš FSR_osn ; swapf STATUS_TEMP,W, atkurti raktų registrų turinį movwf STATUS; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ; išeiti iš pertraukimo paprogramės;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Pagrindinės programos pradžia ................ ;Pradinis registrų nustatymas ................. ;Specialios paskirties..... ............ bsf STATUS,RP0 ;įrašykite dvejetainį numerį 11010011 į registrą movlw b"11010010" ;OPTION_REG, taip nustatydami vidinį movwf OPTION_REG ;laikrodžio šaltinį TMR0 bcf STATUS,RP0 ;prieš įgalinkite išankstinį skalavimą TMR0; nustatykite išankstinio skalavimo santykį 1:8; movlw .8 ;rašyti 8 į shet registrą, prieš paleidžiant movwf shet ;TMR0 perpildymo pertraukimai, vykdomi;vieną kartą, įjungus movlw b"10000000" ;rašomas dvejetainis skaičius 10000000 į movwf stolb ;stolbst registras, įgalinamas vieną kartą, įjungus maitinimą; movlw data1 ;Įrašykite pirmojo registro adresą (saugyklos registrai movwf FSR_prer ;informacija) į FSR_prer registrą, atliekamas;vieną kartą po įjungimo; movlw .8 ; 8 informacijos išvesties į movwf tmp registrų išvalymas ;matrica, atitinkanti movlw data1 išjungimą ;matrica movwf FSR ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF; išvalyti TMR0 perpildymo nutraukimo vėliavėlę bsf INTCON,T0IE; įjungti TMR0 perpildymo pertraukimus bsf INTCON,GIE; įjungti visuotinius pertraukimus; m1 movlw data1, R išvesties pavyzdys 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 ; ; .................; .................; .................; ; pabaiga ; visos programos pabaiga;

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

;Dinaminės indikacijos įgyvendinimas matricai, kurios skiriamoji geba 8x8

;Pavyzdys, laikrodžio dažnis 4 MHz, mašinos ciklas 1 µs

org 0000h ;pradėkite programos vykdymą adresu 0000h

goto Start ;eikite į etiketę Pradėti

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

;Nutraukti rutiną

org 0004h ;pradėkite paprogramės vykdymą adresu 0004h

movwf W_TEMP ;išsaugoti raktų registro reikšmes

swapf STATUSAS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;išsaugokite esamą FSR registro reikšmę

movwf FSR_osn ;į FSR_osn registrą

movf FSR_prer,W; atkurti anksčiau išsaugotą vertę

movwf FSR ;FSR iš FSR_prer

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

;74HC595 (nuoseklaus poslinkio registras)

movf stolb,W; nukopijuoti stolb registro turinį

movwf var ;registruoti var

movlw .8 ;įrašykite skaičių 8 į scetbit registrą, kad būtų galima skaičiuoti

movwf scetbit ;perduodami bitai

met2 btfsc var,0 ;nustatyti ds išvestį pagal

bsf ds; 7-oji registro bitų reikšmė var

bsf sh_cp ;laikrodis sh_cp išvestis, kad užfiksuotų duomenis

rrf var,F ; pamainų registras var dešinėn pasiruošti

;kitas truputis

decfsz scetbit,F ;mažinimas su scetbit registro sąlyga

goto met2 ;scetbit nelygus nuliui: pereiti prie met2 etiketės

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

;74HC595 (nuoseklaus poslinkio registras)

movf INDF,W ; nukopijuoti INDF registro turinį

movwf var ;registruoti var

movlw .8 ;įrašykite skaičių 8 į scetbit registrą, kad būtų galima skaičiuoti

movwf scetbit ;perduodami bitai

met1 btfsc var,7 ;nustatyti ds išvestį pagal

bsf ds; 7-oji registro bitų reikšmė var

bsf sh_cp ;laikrodis sh_cp išvestis, kad užfiksuotų duomenis

rlf var,F ;kairysis poslinkis var paruošti

;kitas truputis

decfsz scetbit,F ;mažinimas su scetbit registro sąlyga

goto met1 ;scetbit nelygus nuliui: pereiti prie etiketės met1

bsf st_cp ;laikrodis st_cp išvestis, kad būtų perkelta įkelta

bcf st_cp ;baitai 74HC595 išvesties eilutėse

bcf STATUS,C ; prieš perjungimą išvalykite būsenos registro C bitą

rrf stolb,F ;kairės poslinkio registras stolb

incf FSR,F ;padidinkite FSR registrą, ruoškite kitą

; užsiregistruokite, kad galėtumėte siųsti duomenis į 74HC595

decfsz shet,F ;dekrementas su registro sąlygų shet

goto exxit ;set registras nelygus 0: pereiti prie exxit

movlw data1 ;set registras yra 0: parašykite pirmojo adresą

movwf FSR ;Užsiregistruokite, kad galėtumėte saugoti informaciją FSR

movlw .8 ;parašykite numerį 8 į lapų registrą, kad būtų nuoroda

movwf lapas; stulpelių skaičius

movlw b"10000000" ;įrašykite dvejetainį skaičių 10000000

movwf stolb ;registruokite stolb, kad įtrauktumėte 1 stulpelį

exxit bcf INTCON,T0IF ;atstatyti TMR0 perpildymo nutraukimo vėliavėlę

movlw .124 ;įrašykite numerį 124 į laikmačio registrą TMR0

movf FSR,W ;išsaugokite esamą FSR registro reikšmę

movwf FSR_prer ;į FSR_prer registrą

movf FSR_osn, W; atkurti anksčiau išsaugotą vertę

movwf FSR ;FSR iš FSR_osn

swapf STATUS_TEMP,W ; atkurti raktų registrų turinį

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;išeiti iš pertraukimo rutinos

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

;Pagrindinė programa

Pradėti ................. ;pradinis registrų nustatymas

................. ;specialus tikslas

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

bsf STATUS,RP0 ;registruodami parašykite dvejetainį numerį 11010011

movlw b"11010010" ;OPTION_REG, taip nustatydami vidinį

movwf OPTION_REG ; TMR0 laikrodžio šaltinis

bcf STATUS,RP0 ;įgalinti išankstinį skalavimą prieš TMR0

;Nustatykite išankstinio skalavimo santykį į 1:8

movlw .8 ;prieš paleisdami įrašykite skaičių 8 į lapų registrą

movwf shet ; TMR0 perpildymas pertraukia, veikia

;įjungus maitinimą

movlw b"10000000" ;įrašykite dvejetainį skaičių 10000000

movwf stolb ;registruokite stolb, kad įtrauktumėte 1 stulpelį

Informacija su loginiais lygiais kiekvieno stulpelio eilutėms yra saugoma 8 informacijos saugojimo registruose, kuriuos galima pasiekti. Pirmojo registro adresas pavadintas data1. Be pirminio shet ir stolb registrų rašymo, būtina įrašyti pirmojo informacijos saugojimo registro adresą į FSR_prer registrą (registras yra data1, įrašas FSR_prer atliekamas vieną kartą, tada taisomas tvarkyklėje) , tik po to įjunkite TMR0 perpildymo pertraukimus.

Prieš įjungiant pertraukimus, pageidautina išvalyti informacijos saugojimo registrus, ši operacija atliekama naudojant papildomą tmp registrą (kaip skaitiklį) ir netiesioginį adresavimą, išvalymas prilygsta matricos išjungimui.

Pertraukimų tvarkymo rutinoje įkeliame stolb registro turinį į DD2 lustą (pirmą kartą įėjus į tvarkyklę įjungus pertraukimus, registre yra skaičius 10000000, kaip minėta aukščiau). Įkėlimas prasideda nuo žemo stolb registro bito, kuris pakraunant pasislenka kryptimi nuo Q0 į Q7 (DD2 lusto viduje), įkrovimo algoritmas buvo aptartas aukščiau, todėl manau, kad kodą suprasti nebus sunku . Toliau įkeliame INDF registro turinį į DD2, tai vienas iš informacijos saugojimo registrų, kurio adresas yra FSR (pirmą kartą įėjus į tvarkyklę įjungus pertraukimus, FSR yra pirmojo informacijos saugojimo registras, vadinamas data1). Įkėlimas pradedamas nuo aukščiausio INDF registro bito. Įkėlę svarstytus 2 baitus, mes suaktyviname st_cp išvestį, tokiu būdu atsisiųsti duomenys perduodami į DD2, DD3 mikroschemų išvesties linijas. Taigi, pirmą kartą įvedus tvarkyklę, perjungiamas pirmasis matricos stulpelis, kuriame šviečia šviesos diodai, kurių anoduose yra aukštas loginis lygis, atsižvelgiant į duomenų1 registro turinį ( pirmasis informacijos saugojimo registras).

Toliau stolb registrą perkeliame vienu bitu į dešinę, kad paruoštume antrąjį matricos stulpelį perjungimui kitame įėjime į pertraukimų tvarkyklę. STATUS registro C vėliavėlė turi būti išvalyta prieš pamainą, nes poslinkis vyksta per šią vėliavėlę ir jos būsena pamainos metu nežinoma. Po pamainos padidiname FSR registrą, paruošdami kitą saugojimo registrą (po data1 registro) su loginiais antrojo stulpelio eilučių lygiais. Toliau sumažiname schemų registrą su sąlyga ir, jei jis nėra lygus nuliui, iš naujo nustatome TMR0 perpildymo pertraukimo vėliavėlę, įrašome numerį į laikmatį ir išeiname iš pertraukų tvarkyklės.

Kitą kartą įėjus į tvarkyklę, bus įjungtas antrasis matricos stulpelis ir pan. Nustačius lapų registrą iš naujo (perjungus 8 stulpelį), kitam stulpelių perjungimo ciklui į jį įrašomas skaičius 8, papildomai koreguojama stolb registro reikšmė, pirmojo informacijos saugojimo registro adresas ( duomenys1) įrašomi į FSR registrą.

Apskaičiuokime TMR0 laikmačio vėlavimą, laikrodžio dažnis yra 4 MHz, mašinos ciklas yra 1 µs. Norėdami išvengti šviesos diodų mirgėjimo, laikykime kiekvieno stulpelio atnaujinimo dažnį 100 Hz (periodas T = 10 ms), uždelsimas yra 10/8 = 1,25 ms. Nustatome išankstinio skalavimo koeficientą TMR0 į 1:8, o didžiausia galima delsa yra 256x8 = 2048 µs. 1,25 ms pauzės metu laikmatis turėtų skaičiuoti (256x1,25) / 2,048 = 156,25 karto, suapvalinus gauname 156 skaičius. Atitinkamai, į laikmatį reikia įrašyti skaičių 256-156 = 100. Tačiau tai ne visai teisinga reikšmė, nes pertraukimo rutinos įvykdymas užtrunka šiek tiek laiko, šiuo atveju tai trunka apie 190 µs, perskaičiuojant atsižvelgiant į Atsižvelgdami į išankstinio skalavimo koeficientą, gauname 190/8 = 23,75 arba 24 skaičius. Teisinga reikšmė, kurią reikia įrašyti į TMR0, yra: 100+24=124.

Pagrindinėje programoje įrašome 8 informacijos saugojimo registrus pagal tai, ką norime rodyti matricoje. Žemiau yra diagrama, paaiškinanti informacijos išvedimą į aukščiau pateikto kodo matricą.


Be pamainų registrų, yra ir specializuotų tvarkyklių, skirtų informacijai rodyti septynių segmentų indikatoriuose ir LED matrica, šiuo atveju dinaminę indikaciją įgyvendina pats vairuotojas, belieka tik siųsti duomenis į jį rodyti. Apžvelgiau vieną iš šių populiarių tvarkyklių straipsnyje apie.

Žemiau nuorodos galite atsisiųsti mikrovaldiklio PIC16F628A programinę-aparatinę įrangą ir šaltinio kodą, įdiegę dinaminę indikaciją 8x8 matricoje, naudodami du 74HC595 poslinkių registrus, prijungimo schema buvo aptarta aukščiau. Matricoje pakaitomis rodomos raidės R, L, skaičius 46, šypsenėlė ir tik kryžiaus pavidalo raštas, ši animacija parodyta žemiau esančiame vaizdo įraše.

su etiketėmis, . Skaityti .

Dinaminė indikacija yra viena iš problemų, su kuriomis susiduria pradedantieji mikrovaldiklių programuotojai. Apie tai buvo daug pasakyta, bet nusprendžiau tai, kas žinoma, sustiprinti nuotraukomis ir šaltinio kodų pavyzdžiais C kalboje, kad būtų lengviau įvaldyti šį rodymo metodą.

1 Pagrindų pagrindai arba įvadas

Visų pirma, apibrėžkime terminiją, kurią naudosime visame straipsnyje.

Jei norite valdyti ekraną, susidedantį iš vieno septynių segmentų simbolio, tai nesukelia jokių problemų – jis gali būti pavaizduotas kaip 8 nepriklausomi šviesos diodai. Jei reikia rodyti daugiau informacijos nei vienas simbolis, prasideda problemos: 2 pažinimas yra 16 šviesos diodų, trys - 24 ir tt, tai yra, trijų skaitmenų ekranui mikrovaldiklio išėjimų gali tiesiog neužtekti, jau nekalbant 6 ar daugiau bitų ekranai ir ypač matricos indikatoriai.

Paprastumo dėlei sutinkame, kad visi mūsų indikatoriai yra su bendru katodu. Problemos sprendimas yra gana paprastas: sujunkite visų rodiklių segmentų išvestis vienas su kitu. Dabar, jei norite, kad informacija būtų rodoma pirmą kartą, turėtumėte taikyti reikiamus lygius segmentų linijoms ir prijungti bendrą pirmojo indikatoriaus išvestį prie bendro grandinės laido. Žinoma, aukšti lygiai turi būti ant visų kitų rodiklių bendrųjų katodų. Akivaizdu, kad užsidegs norimi pirmojo indikatoriaus segmentai. Išvesties į antrą, trečią ir kt. rodikliai turėtų daryti tą patį, t.y. pritaikius loginį nulį vienam iš bendrųjų katodų, pasirenkame srovės nurodytą bitą, o segmentų linijų būsena lemia matomą simbolį.

Kad visas ekranas būtų suvokiamas kaip nuolat šviečiantis, skaitmenys turi būti perjungiami greitai – dažniau nei 25 kartus per sekundę. Kaip matote, visų išvadų lygiai (kurių, beje, tapo ženkliai mažesni nei taikant įprastą požiūrį) nuolat kinta, t.y. turi ne statinius, o dinaminius lygius, todėl ir rodymo metodo pavadinimas – dinaminis.

Vaizdas su dinaminiu ekranu

2 Techninės įrangos diegimo rūšys

2.1 Plokščios matricos

Jei abstrahuosime nuo septynių segmentų indikatorių, tai mūsų ekranas gali būti pavaizduotas kaip atskirų šviesos diodų matrica, kurių anodai yra sujungti į matricos eilutes, o katodai - į stulpelius. Tiesą sakant, būtent taip ir yra.

Akivaizdu, kad pritaikę reikiamus lygius savo matricos eilutėms ir stulpeliams, galime apšviesti bet kurį elementarų LED segmentą (dar žinomas kaip pikselis - tai labiau tradicinis matricos ekranų terminas). Priklausomai nuo to, kaip tiksliai pakeisime eilučių ir stulpelių lygius, galime gauti kelių tipų dinamines indikacijas:

  • pagal eilutę;
  • pagal stulpelius;
  • segmentas po segmento (vienam pikseliui);
  • mišriu būdu.

Ankstesniame skyriuje aptarėme parinktį pagal stulpelius. Parinktis pagal eilutes nuo jos skiriasi tik tuo, kad mūsų matricos eilutės ir stulpeliai yra sukeisti. Segmentinis metodas susideda iš to, kad bet kuriuo metu tik vienoje eilutėje ir viename stulpelyje yra lygis, reikalingas šviesos diodui apšviesti. Tai yra, bet kuriuo metu gali užsidegti tik vienas visos matricos šviesos diodas (skirtingai nei ankstesnės parinktys kai vienu metu galima apšviesti visą eilutę arba visą stulpelį). Šis metodas primena televizoriaus nuskaitymą, kai spindulys apeina visą ekraną ir apšviečiamas tinkamas vietas fosforo. Mišri versija, kaip rodo pavadinimas, yra ta, kad vienu metu „aktyvūs“ lygiai gali būti vienu metu keliose eilutėse ir stulpeliuose.

Pirmąsias dvi parinktis labai lengva įgyvendinti, todėl jos plačiai naudojamos. Trečiasis variantas naudojamas rečiau, nes. reikalauja daugiau dideliu greičiu eilučių ir stulpelių informacijos atnaujinimai, o vidutinė srovė per segmentą (t.y. segmento ryškumas) šiuo atveju yra žymiai mažesnė nei kituose. Paskutinis mišrus metodas yra rečiausias, nors jis turi daug teigiamų savybių. Visų pirma, šis metodas reikalauja, kad eilučių ir stulpelių grandinėse būtų naudojami stabilūs srovės šaltiniai, kitaip šviečiančių segmentų ryškumas neišvengiamai priklausys nuo bendro jų skaičiaus. O signalų kombinacijų eilučių ir stulpelių skaičiavimas nėra labai paprastas.

2.2 Daugiamatės matricos

Pavyzdžiai, kuriuos mes svarstėme, reiškia įgyvendinimą monochrominis ekranas, t.y. sudarytas iš vienos spalvos šviesos diodų. Ką daryti, jei norite gauti kelių spalvų ekraną, pavyzdžiui, iš RGB šviesos diodų? Galimi du sprendimai.

Pirmasis yra tiesiog padidinti mūsų matricos eilučių (arba stulpelių) skaičių, kiekvieną RGB šviesos diodą traktuojant kaip 3 nepriklausomus atskirus šviesos diodus. Didelis šio metodo trūkumas yra 3 kartus padidėjęs eilučių (arba stulpelių) skaičius. Ant paprastas pavyzdys nesunku suprasti, ką tai reiškia praktiškai: dviejų aštuonių bitų mikrovaldiklio iškyšų pagalba galime turėti vienspalvę 8x8 segmentų matricą arba spalvotą 4x4. Sutikite, kad antruoju atveju praktiškai neįmanoma parodyti nieko suprantamo ...

Antrasis būdas – pereiti nuo „plokščios“ segmentų matricos prie „daugiamatės“. Jei kiekvienos linijos signalas perduodamas per 1x3 multiplekserį, tai RGB šviesos diodų rodymo sistemą galime pavaizduoti kaip 3 nepriklausomas pradinio matmens matricas: kiekvieną matricą sudaro tos pačios spalvos šviesos diodai, o norimą matricą pasirenkame multiplekserio valdymo signalai. Paveikslas paaiškina tai, kas buvo pasakyta.

Akivaizdu, kad daugiamatės matricos atveju taip pat reikalingas papildomas valdymo linijų skaičius, tačiau šis skaičius nėra toks didelis: ant tų pačių dviejų valdiklio prievadų galime gauti 7x7 spalvų ekraną !!!

2.3 Matricų matmenų mažinimo būdai

Jei mikrovaldiklio kaiščių skaičius labai ribotas, teks ieškoti būdų, kaip sumažinti savo matricos eilučių ir stulpelių skaičių. Žinoma, stebuklų nebūna, ir tokiu atveju teks mokėti tuo, kad, be mikrovaldiklio, bus naudojamos papildomos mikroschemos. Kaip jau supratote, čia galite naudoti anksčiau svarstytą „daugiamatių“ matricų metodą - juk niekas nedraus vietoj RGB šviesos diodų naudoti trigubą vienspalvių šviesos diodų skaičių? Svarbiausia juos tinkamai sutvarkyti...

Taigi, matricos matmenis galime sumažinti taikydami:

  • dekoderiai arba tankintuvai;
  • pamainų registrai.

Su multiplekseriais jau buvome susitikę anksčiau, dekoderis, kaip galite atspėti, skiriasi nuo multiplekserio iš esmės. Reikėtų tik pridurti, kad naudojant dekoderius / tankintuvus tiek eilėms, tiek stulpeliams, matricos matmenis galima sumažinti iš karto abiejuose matmenyse, tačiau tokiu atveju gali prireikti naudoti tik segmentus. segmento dinaminė indikacija su visais jos trūkumais.

„Shift“ registrai gali padėti daug geriau nei dekoderiai. Apsvarstykite diagramą žemiau esančiame paveikslėlyje.

Nesunku pastebėti, kad bet koks eilučių ir stulpelių skaičius užteks tik padidinti registrų skaičių, o naudojamų mikrovaldiklio valdymo linijų skaičius išliks toks pat! Mažas minusas šis požiūris yra tai, kad grandinėje didėjant registrų skaičiui, reikės didinti nuoseklaus informacijos išvedimo juose greitį, o tai ne visada yra lengvai pasiekiama. Taigi, pavyzdžiui, bendri šeimos mikrovaldikliai AVR, praktiškai neleidžia viršyti 10 megabitų per sekundę serijinės išvesties greičio. Kita vertus, jei naudojate kitus valdiklius, galinčius greičiau išvesti signalus, gali prasidėti kitokios eilės problemos: aukšto dažnio laikrodžio signalo sklidimas ilga linija (ir kai dideli skaičiai registrus, neišvengiamai taip bus) visiškai skiriasi nuo žemo dažnio, todėl jungiant laidus reikės specialių priemonių spausdintinė plokštė ir kiti dalykai, kurių šiame straipsnyje nenagrinėsime.

3 programinės įrangos diegimo būdai

Mes nesvarstysime visų paminėtų dinaminės indikacijos parinkčių programinės įrangos įdiegimo - tai nepagrįstai išpūsti straipsnį. Apsiribosime tik trimis labiausiai „veikiančiais“ pavyzdžiais: plokščia matrica su tiesioginiu eilučių ir stulpelių valdymu, tas pats naudojant dekoderį ir, galiausiai, variantas su pamainų registrais. Visais atvejais ypatingas dėmesys bus skiriamas visiems niuansams programinės įrangos diegimas, tai yra, prie C kodo bus pateikti paaiškinimai tik tais atvejais, kai tai sutampa su autoriaus ketinimu ir jokiu būdu ne su jūsų mokymo lygiu. Tuo užsimenu, kad turėtumėte žinoti C pagrindus be manęs.

Dėl visų pavyzdžių sutiksime, kad mūsų ekranas yra pastatytas ant septynių segmentų indikatorių su bendru katodu.

3.1 Paprasčiausias būdas

Akivaizdu, kad programoje patogiausia būtų turėti masyvą, kurio turinys vienareikšmiškai nulemtų, kuriuose segmentuose yra apšviestos ekrano pažinimo sritys – savotiškas ekrano RAM analogas.

Pateikiame šių konstantų apibrėžimą:

#define SCR_SZ 6 /* rodymo simbolių tarpų skaičius */ #define ROWS PORTB /* rodymo "eilučių" prievadas, t.y. segmento valdymas */ #define COLS PORTD /* prievadas „stulpeliams“ valdyti, t.y. bendrieji katodai */

Dabar paskelbkime masyvo ekraną:

unsigned char SCR;

Pirmiausia manysime, kad kiekvienas masyvo elementas atitinka ekrano žinomumą, o kiekvienas šio elemento bitas atitinka tam tikrą indikatoriaus segmentą. Kuris bitas atitinka kurį segmentą – šiuo atveju nesvarbu, kaip šie bitai nustatyti mūsų masyvo baituose, kol kas tik manysime, kad jie jau yra. Be to, dėl paprastumo manysime, kad bendrieji katodai yra prijungti prie prievado kaiščių COLS nuosekliai: mažiausiai reikšmingas bitas yra dešinysis indikatorius, tada antrasis, trečiasis ir pan.

Kaip padaryti, kad šis masyvas „rodytų“ ekrane? Parašykime tokį kodą:

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

Ar jis atliks reikiamą funkciją? Taip. Bet tai blogai.

Pirmiausia atminkite, kad mes negalime kontroliuoti eilučių ir stulpelių turinio atnaujinimo greičio. Antra, atkreipkite dėmesį, kad tuo metu, kai naujas masyvo elementas bus išvestas į EILUTĖS linijose COLS senoji vertė tebėra! Kur tai veda? Be to, tam tikrą sekundės dalį pažįstamame bus rodomi kaimyninio pažįstamo segmentai, t.y. kai kurie segmentai bus klaidingai paryškinti.

Šio efekto galite išvengti taip: prieš atnaujindami turinį EILUTĖS, visada atšaukite pažintį, kuri buvo ankstesnė. Kad nesivargintumėte dėl ankstesnio pažinimo apibrėžimo, galite viską užgesinti iš karto. Taigi mūsų kodas atrodo taip:

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

Prieš atnaujindami segmentų linijų būseną, užtemdėme visą ekraną (padėdami aukštą bendrųjų katodų lygį, išjungsime indikatorių, neatsižvelgiant į tai, kas yra ant anodų) ir įvedėme delsą pasibaigus ciklas. Dabar ekranas veiks daug geriau. Bet ar parašėme gerą programą? Deja, ne.

Faktas yra tai, kad nesibaigiantis rodymo ciklas kol tiesiog neleis mums nieko kito daryti. Kokią programą turėsime, kuri tik žino, kaip ką nors parodyti indikatoriuje ?! Žinoma, viskas nėra 100% blogai, nes per pertraukimus galima padaryti ką nors naudingo ... ir vietoj vėlavimo uždelsimas() galite atlikti kai kuriuos veiksmus... Bet visa tai labai, labai kreiva: nepageidautina atlikti kažko sudėtingo ir sudėtingo pertraukimų tvarkytuvėse; kita vertus, jei vietoj delsimo padaroma kažkas sudėtingo ir sudėtingo, sunku užtikrinti tą patį skaičiavimo laiką, kitaip paaiškės, kad pažintis šviečia skirtingą laikotarpį, o tai vizualiai atrodys kaip jų skirtingo ryškumo švytėjimas ar mirgėjimas.

Apskritai ši parinktis gali būti leidžiama tik kaip išimtis, tik kaip mokymo pavyzdys arba tuo atveju (bet penki, tik kaip išimtis!), Kai pagrindinė problema, kurią reikia išspręsti, yra labai paprasta (tai gali būti Pavyzdžiui, matavimo problema ADCįtampą ir ją rodyti).

Ką reikėtų daryti? Atsakymas, kaip visada, paprastas: visi procesai, kurie turi būti vykdomi nepastebimai nuo pagrindinės užduoties sprendimo (o indikacija, žinoma, toks procesas), turi būti atliekami laikmačio pertraukimais.
Pertraukimai ateis griežtai nustatytais intervalais, o tai užtikrins pažinimo spindesio vienodumą. Fono indikacija leis mums tiesiog parašyti ką nors į masyvą reikiamu laiku pagrindinėje kilpoje SCR- ir jis akimirksniu pasirodys ekrane! Ir visi kodo pakeitimai bus susiję su tuo, kad vietoj kilpų mes naudojame pertraukimo tvarkyklės funkciją:

ISR(TIMER0_OVF_vect)(statinis nepasirašytas simbolis poz. = 0; COLS = 0xFF; ROWS = SCR; COLS = ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

Keletas komentarų.

kintamasis poz, žymintį dabartinės švytinčios pažinties skaičių, sudarome vietinį statinį kintamąjį, kad jis išlaikytų savo vertę nuo pertraukimo iki pertraukimo. Pasibaigus funkcijai, mes patys (juk jau nebeturime ciklo) didiname familiarumo skaičių, kol pasiekiame ribą – tokiu atveju grįžtame į pradžią.

Pagrindinėje programoje mums reikės tik inicijuoti prievadus ir laikmatį (šiuo atveju - Laikmatis 0), kad jis persipildytų mums reikalingais intervalais ir leistų pertraukimus. Po to jūs negalite prisiminti indikacijos - jis veiks tyliai ir ramiai. Bet kaip nustatyti norimą laikmačio perpildymo intervalą? Labai paprasta. Žmogaus akis suvokia mirgėjimą, kurio dažnis didesnis nei 25 Hz, kaip nuolatinį švytėjimą. Turime 6 indikatorius, kiekvienas iš jų turėtų mirgėti tokiu dažniu, o tai reiškia, kad informacija ekrane turėtų būti atnaujinama 25 x 6 = 150 Hz ar didesniu dažniu. Dabar apskaičiuokime laikmačio išankstinio skalavimo vertę: padalinkite MK laikrodžio dažnį iš 256 ( Laikmatis 0 kiekvienas turi AVR aštuonių bitų, o tai reiškia, kad jis persipildo, skaičiuojant iki 256) - tai bus norima laikmačio išankstinio skalavimo vertė. Žinoma, mažai tikėtina, kad rezultatas atitiks vieną iš standartinių išankstinio skalavimo verčių - tai nėra problema, galite paimti artimiausią mažesnę tinkamą vertę. Indikacija veiks didesniu dažniu, tačiau tai nepablogins jos kokybės! Šalutinis poveikis bus didelė MK šerdies apkrova indikacijai. Jei tai labai trukdo pagrindinei programai, turėsite perkelti indikaciją į kitą laikmatį, pavyzdžiui, 16 bitų. 1 laikmatis, arba įveskite skaitiklį, kad praleistumėte laikmačio perpildymą:

#define SKIP 15 /* praleidžiamų laikmačio pertraukimų skaičius */ ISR(TIMER0_OVF_vect)( statinis nepasirašytas simbolis poz = 0; statinis nepasirašytas simbolis, praleistas = SKIP; jei (--praleisti) grįžti; praleisti = PRAleisti; COLS = 0xFF; ROWS = SCR ; COLS = ~ (1<< pos); if(++pos == SCR_SZ) pos = 0; }

Šiuose supaprastintuose pavyzdžiuose darome prielaidą, kad uostas COLS, išskyrus bendruosius indikatorių katodus, daugiau nieko nėra prijungta. Tačiau realiame gyvenime tokia laimė pasitaiko nedažnai, o su likusiomis šio uosto linijomis greičiausiai jungiasi dar kažkas. Todėl, organizuojant dinaminį rodymą, visada reikia užtikrinti visų uosto linijų, kurios tiesiogiai nedalyvauja indikacijoje, būklės nekintamumą. Tai daroma paprastai: užuot tiesiog įrašius naują reikšmę prievadui, reikia maskuoti nereikalingus bitus:

COLS |= 0x3F; // todėl užgesiname visus pažįstamus COLS &= ~(1<

Abu teiginiai nekeičia prievado aukštųjų bitų vertės COLS.

3.2 Dekoderio metodas

Dekoderis gali būti naudojamas konvertuoti HEX arba BCD kodą į septynių segmentų simbolius arba pasirinkti vieną iš matricos stulpelių. Abi parinktys nuo anksčiau svarstyto paprasčiausio metodo skirsis tik tuo, kaip bus organizuojama išvestis į prievadus. EILUTĖS ir/arba COLS prie kurių bus prijungti dekoderio įėjimai.
Galimybė naudoti dekoderį, norint gauti septynių segmentų simbolį:

ISR(TIMER0_OVF_vect)(statinis nepasirašyto simbolio poz. = 0; COLS |= 0x3F; EILTELĖS = (EILUS & 0xF0) | (SCR & 0x0F); COLS &= ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

Kaip matote, pakeitimai yra minimalūs – prieš juos rodant EILUTĖS simbolio kodas iš masyvo SCR, aukštieji bitai yra užmaskuoti, po to žemieji bitai nustatomi pagal simbolio kodą. Tai yra, manome, kad dekoderis yra prijungtas prie 4 mažiausiai reikšmingų prievado bitų EILUTĖS.

Tikiuosi, nėra prasmės pateikti stulpelių dekodavimo pavyzdį - vis tiek viskas aišku.

3.3 Metodas su registrais

Nors dinaminis rodymas naudojant poslinkių registrus iš esmės nesiskiria nuo anksčiau aptartų metodų, tačiau yra keletas jo įgyvendinimo variantų. Apsvarstysime paprasčiausią - bitų išvestį grynai programinėmis priemonėmis. Ir įgyvendinant kitus (naudojant USI/USART/SPI/TWI) galite išbandyti savo jėgas patys.

Anksčiau pasirinktam 6 septynių segmentų simbolių tarpų rodymo variantui naudojame 2 tipo pamainų registrus 74HC595. Šis registras valdomas trimis signalais: nuosekliosios duomenų įvesties laikrodžiu CLK, faktinius duomenis DUOMENYS ir į registrą įrašytos informacijos vienu metu lygiagrečio išvesties impulsas NUSTATYTI. Paskelbkime atitinkamas makrokomandas (paprastumo dėlei visus signalus „perkelsime“ į vieną prievadą):

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

Norėdami rašyti į registrą, patogu parašyti atskirą funkciją:

Statinis negaliojimo poslinkis(nežymėtas simbolis d)(nežymėtas simbolis 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; } }

Labai pageidautina, kad ši funkcija būtų statinė, nes jis bus naudojamas pertraukimų tvarkyklėje. Tikėtina, kad kompiliatorius formoje atliks statines funkcijas eilutę-įterpia į pertraukų tvarkyklę, t.y. nebus bereikalingo kamino naudojimo, o tai negarantuojama atliekant nestatines funkcijas.

Dabar mūsų pertraukimų tvarkytuvas atrodys taip:

ISR(TIMER0_OVF_vect)(statinis nepasirašyto simbolio poz. = 0; shift(SCR); shift(~(1)<< pos)); REG_PORT |= SET; // выдаем импульс SET REG_PORT &= ~SET; if(++pos == SCR_SZ) pos = 0; }

Kadangi į registrus įrašyti duomenys jo išėjimuose pasirodo tuo pačiu metu, iš pradžių nereikia išjungti indikatorių. Reikėtų prisiminti, kad programinės įrangos nuoseklioji išvestis yra gana ilgas procesas, ypač didelių matmenų matricoms, todėl turėtumėte ją kuo labiau optimizuoti greičio atžvilgiu. Tai geriausiai galima padaryti naudojant nuosekliosios išvesties aparatinę įrangą, esančią MCU.

4 Tiems, kuriems niekada negana

Taigi, jūs susipažinote su dinaminės indikacijos diegimo pagrindais. Tačiau, kaip įprasta, klausimų ne mažėja, o daugėja. Numatydamas kai kuriuos iš jų, pasistengsiu nedelsiant pateikti reikiamus atsakymus.

4.1 Anodai, katodai – ką pasirinkti?

Viskas, ką mes svarstėme anksčiau, buvo susiję su indikatoriais su bendrais katodais. O jei norite naudoti su įprastais anodais? Apskritai viskas išlieka taip pat, išskyrus tai, kad prieš išvedant duomenis reikės invertuoti - pažinimo ištuštinimas atliekamas išvedant nulius į COLS, uždegimas – atitinkamai vienetai ir segmentai in EILUTĖS vietoj vienetų bus įtraukti nuliai. Taigi pertraukimų tvarkytuvas tampa maždaug taip:

ISR(TIMER0_OVF_vect)(statinis nepasirašytas simbolis poz. = 0; COLS &= 0xC0; ROWS = ~SCR; COLS |= (1)<< pos); if(++pos == SCR_SZ) pos = 0; }

Viskas paprasta. Nebent, žinoma, bandysite parašyti universalų kodą, kuris tinka tiek įprastiems anodams, tiek katodams. Tai galima padaryti dviem būdais: arba naudojant sąlygines kompiliavimo direktyvas, arba naudojant transformavimo funkciją. Pirmąjį variantą pademonstruosiu, o apie antrąjį siūlau pagalvoti savarankiškai.

#define COMMON_ANODE 1 ISR(TIMER0_OVF_vect)(statinis nepasirašytas simbolis poz = 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; }

Tai šiek tiek sudėtinga, bet jei parašysite vieną kartą, galėsite jį naudoti visuose projektuose beveik be pakeitimų.

4.2 Mirgėjimas

Daugeliu atvejų ekranas naudojamas ne tik kaip iš įrenginio vidaus gaunamos informacijos atvaizdavimo priemonė, bet ir vartotojo įvestos informacijos atvaizdavimui. Ir šiuo atveju reikia mokėti kažkaip atskirti nepakitusią nuo keičiamo ekrane. Lengviausias būdas tai padaryti – priversti atitinkamą familiarumą (arba kelis pažįstamus) mirgėti.

Tai padaryti labai paprasta. Įveskime visuotinį kintamąjį, kurio kiekvienas bitas žymės mirksinčią pažintį:

beženklio simbolio mirksėjimas = 0;

Dabar šiek tiek modifikuojame pertraukimų tvarkyklę:

ISR(TIMER0_OVF_vect)(statinis nepasirašyto simbolio poz. = 0; statinio nepasirašyto simbolio įrašas = 0; COLS |= 0x3F; if(!(mirksi & (1)<

Kaip matote, buvo pridėtas tik vienas statinis kintamasis - pertraukimų tvarkyklės įėjimų skaitiklis įrašas, ir būklės tikrinimo operatorius. Logika paprasta: kito pažinimo išvestis vykdoma tik tuo atveju, jei atitinkamame bite mirksėti nulis arba reikšmingiausias skaitiklio bitas įrašas lygus 1. Jei, tarkime, mirksėti yra visi nuliai, tada ši sąlyga visada tenkinama – rodomi visi pažįstami. Jeigu mirksėti kurio viename iš bitų yra 1, tada atitinkamas simbolis bus rodomas tik tuo metu, kai reikšmingiausias skaitiklio bitas yra 1. Kadangi skaitiklis didėja kiekvieną kartą, kai įvedamas pertraukimo tvarkytuvas, atitinkamas simbolis mirksi dažnis 128 kartus mažesnis už pertraukimo dažnį.

4.3 Segmentų ryškumo reguliavimas

Apie ryškumo reguliavimą rašiau atskirame straipsnyje, kuris taip ir vadinosi.

4.4 Savavališkas išvadų platinimas

Anksčiau buvo kalbama, kad laimė indikacijai skirti visą MK uostą iškrenta gana retai. Tačiau dar rečiau pasiseka gauti patogų PCB pėdsaką, jei vienas prievadas naudojamas tik eilutėms, o kitas - ekrano matricos stulpeliams. Daug dažniau optimalus maršruto parinkimas gaunamas tik tada, kai eilutės ir stulpeliai sumaišomi tarp dviejų ar net daugiau mikrovaldiklio prievadų. Jums nereikės paaukoti spausdintinės plokštės grožio, jei indikacijos metu surengsite programinės įrangos bitų keitimą.

Panagrinėkime abstraktų pavyzdį. Tegul geriausias sekimas užtikrinamas tokiu signalų pasiskirstymu pagal MC prievadų linijas:

A segmentas

B segmentas

segmentas H

C segmentas

D segmentas

G segmentas

E segmentas

F segmentas

Kaip matote, matricos linijos yra sumaišytos tarp trijų prievadų, ir visos nepanaudotos šių prievadų linijos, žinoma, neturėtų keisti savo lygių indikacijos proceso metu.

Geriausia pradėti kurti dinaminės indikacijos funkciją šiuo atveju paskirstant segmentus per simbolių bitus. Anksčiau mes tai svarstėme masyve SCR saugome veikėjų bitų kaukes, t.y. vienetai baite žymi šviečiančius segmentus. Mes negalvojome, kuris bitas atitinka kurį segmentą. Taigi, dabar pats laikas apie tai pagalvoti.

Uosto linijų paskirtį patogu nudažyti trijų plokščių pavidalu:

1

A

0

4

H

3

2

B

F

E

5

G

D

C

Turime surinkti visus segmentus į vieną baitą. Turėsite tai padaryti su pamainomis, todėl turėtumėte pabandyti jas paskirstyti taip, kad būtų kuo mažiau pamainų. Aptarkime.

Jei segmentas bitai FEGDC palikite simbolį, kad jie įkristų PORTD be poslinkių, tada segmentas H taip pat gali likti 6-ajame simbolio bite ir jo taip pat nereikia perstumti prieš išvedant PORTC, bet segmentams BET ir AT 7 ir 3 bitai išliks, tai yra greičiausiai segmentas AT turės būti paslinktas 3 pozicijomis prieš išvestį ir segmentą BET- iki 6. Sustosiu ties šiuo variantu, o jūs galite toliau ieškoti pamainų minimumo (pamainos keliomis pozicijomis nėra toks greitas veiksmas, todėl pageidautina jų skaičių sumažinti iki minimumo).

Taigi, mūsų atveju, gavome tokį bitų pasiskirstymą pagal baito simbolius:

A

H

F

E

B

G

D

C

Atkreipkite dėmesį į išvesties į atitinkamus prievadus bitų kaukes:

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

Šių kaukių pagalba, naudodami operaciją „bitwise AND“, parenkame reikiamus bitus išvestims į prievadą.

Paskelbkime kaukės konstantas:

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

Anksčiau simbolį išvesdavome į vieną prievadą EILUTĖS, dabar ši procedūra suskirstyta į tris dalis:

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

Atkreipkite dėmesį, kad norint išvesti į PORTC vienas bitas turi būti išvestas be poslinkio, o antrasis – su poslinkiu, taigi vietoj MASKC turėjo naudoti atskiras makrokomandas _BV().

Dabar belieka nuspręsti, kaip užgesinti ir uždegti atitinkamą pažįstamą. Deklaruojame žinomumo valdymo bitus atitinkančias konstantas:

#apibūdinti COM0 _BV(0) #apibrėžti COM1 _BV(3) #apibrėžti COM2 _BV(4) #apibrėžti COM3 _BV(5) #apibrėžti COM4 _BV(7) #apibrėžti COM5 _BV(3) #apibrėžti COM_D (COM5) #apibrėžti COM_C (COM2 | COM3 | COM4) #define COM_B (COM0 | COM1)

Norint užgesinti visas pažintis, reikia išvesti atitinkamas konstantas į prievadus COM_x:

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

Bet kad įgalintumėte pažinimą, turėsite būti protingi (nėra prasmės išvesti į visus tris prievadus, nes tam tikrame prievade bus aktyvus tik vienas bitas, priklausomai nuo reikšmės poz), pavyzdžiui, naudojant operatorių jungiklis:

Jungiklis (poz.) (0 atvejis: PORTB &= ~COM0; pertrauka; 1 atvejis: PORTB &= ~COM1; pertrauka; 2 atvejis: PORTC &= ~COM2; pertrauka; 3 atvejis: PORTC &= ~COM3; pertrauka; dėklas 4: PORTC &= ~COM4; pertrauka; 5 atvejis: PORTD &= ~COM5; pertrauka; )

Tai nėra pats gražiausias būdas, bet jis veikia.

Taigi mūsų pertraukimų tvarkyklės forma yra tokia:

ISR(TIMER0_OVF_vect)(statinis nepasirašyto simbolio poz. = 0; statinio nepasirašyto simbolio įrašas = 0; // užgesinti PORTD |= COM_D; PORTC |= COM_C; PORTB |= COM_B; // rodyti PORTD = (PORTD & ~MASKD) | ( SCR & MASKD); PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6); PORTC = (PORTC & ~MASKC) | ((SCR & _BV(6)) | (((SCR & _BV) (3) >> 3); // mirksėti if(!(mirksi & (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; }

Dabar belieka išsiaiškinti, kaip patogiau apibūdinti išvesties simbolius ... Siūlau padaryti taip: apibrėžti konstantas, atitinkančias segmentų bitus, ir tada iš šių konstantų „sukonstruoti“ reikiamus simbolius:

// elementarieji segmentai #apibrėžti _A _BV(7) #apibrėžti _B _BV(3) #apibrėžti _C _BV(0) #apibrėžti _D _BV(1) #apibrėžti _E _BV(4) #apibrėžti _F _BV(5) #apibrėžti _G _BV (2) #apibrėžti _H _BV(6) // skaitmenų simboliai #apibūdinti d_0 (_A | _B | _C | _D | _E | _F) #apibūdinti d_1 (_B | _C) #apibrėžti d_2 (_A | _B | _G | _D | _E) // ir pan

Taigi, jei jums reikia atspausdinti nulį ekrano dešinėje, tiesiog turite parašyti tinkamoje vietoje:

SCR = d_0;

Jei kitame projekte reikia kitaip paskirstyti bitus, pakeisite tik skaičius makrokomandose _BV() elementariems segmentams, o visi simboliai bus „perdaryti“ automatiškai. Paprasčiausiais atvejais, aprašytais pradžioje, jums nereikės nieko daugiau daryti, tačiau norint pasirinkti „bitų keitimo“ parinktį, žinoma, teks padirbėti.

4.5 Mygtukų palaikymas

Tradiciškai trūkstant MK išėjimų, daugybės mygtukų, be kurių retai kuris įrenginys gali išsiversti, problema yra labai opi. Naudojami įvairūs matriciniai inkliuzai ir kt. gudrybės, tačiau, šiek tiek apsunkinus dinaminės indikacijos funkciją, lengva disponuoti tiek mygtukų, kiek yra pažįstamas ekrane, o papildomai reikia naudoti tik vieną mikrovaldiklio prievadą. Tiesa, kiekvieną mygtuką vis tiek tenka uždėti ant diodo.

Schematiškai tai parodyta paveikslėlyje.

O programiškai tai atrodo taip:

#define keypin() (!(PIND & _BV(KEY))) ISR(TIMER0_OVF_vect)( statinis nepasirašytas simbolis poz = 0; statinis nepasirašytas simbolis = 0; statinis nepasirašytas simbolis 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; } }

Čia Raktas- tai makrokomanda, kuri nustato pasirinkto prievado bitą, prie kurio "prijungti" visi mygtukai, makrokomandą klaviatūros segtukas () grąžina loginę reikšmę TRUE, jei pasirinktas kaištis yra logiškai žemas. Pavyzdyje mygtukai yra prijungti prie PORTD.

Kiekvieną kartą, kai įvyksta laikmačio pertraukimas, visi segmentai pirmiausia užgęsta - tai būtina, kad srovė per šviesos diodus nesukeltų klaidingo paspausto mygtuko neaptikimo. Po to mygtuko įvestis yra apklausiama - jei yra žemas lygis, tada paspaudžiamas mygtukas, prijungtas prie atitinkamo poz katodo. Kintamajame tmp_key kaupiamos mygtukų būsenos, kurios perrašomos į globalų kintamąjį Raktas pasibaigus rodymo ciklui. Jums tiesiog reikia retkarčiais išanalizuoti vertę Raktas ir tvarkyti aptiktus paspaudimus:

Statinis nepasirašytas simbolis get_key()(nepasirašytas simbolis tmp = 0; tmp = raktas; _delay_ms(10); if(key == tmp) return tmp; kitaip grąžina 0; )

Ši paprasta funkcija garantuoja, kad mygtukais nebus plepėjimo, nors dėl „dinamiško“ mygtukų apklausos pobūdžio plepėjimo tikimybė jau maža.

5 Kas dar?

Taigi, jūs įvaldėte gana tipiškus dinaminės indikacijos įgyvendinimo būdus. Manau, kad to tau užteks pirmam kartui, o gal net visam gyvenimui. Galų gale svarbiausia yra suprasti metodus ir algoritmus, o subtilybes ir niuansus visada galite pridėti patys. Bet kas dar gali laukti „šalia“ dinaminės indikacijos?

Kaip jau sakiau anksčiau, galite pridėti ir iki nepriklausomo kiekvieno segmento reguliavimo.

Galite pagalvoti apie pertraukimų tvarkyklės optimalumą - švietimo tikslais parašiau gana grubų kodą, pavyzdžiui, naudojau visur SCR, nors optimaliau būtų vieną kartą perskaityti reikšmę į vietinį kintamąjį ir tada operuoti su jo verte. Nors optimizatorius tikrai padės mano požiūriui, praktikos dėlei verta pabandyti ir optimizuoti save, kontroliuojant gauto kodo dydį ir (arba) programos greitį.

Galite pagalvoti apie įdomią idėją automatiškai reguliuoti ekrano ryškumą, atsižvelgiant į aplinkos apšvietimo lygį. Kaip žinia, šviesos diodų indikatoriai yra prasčiau išsiskiriantys, kuo tamsesnė aplink – jie tiesiog susilieja. Todėl tamsoje tikslinga sumažinti indikatorių ryškumą, padidinant jį dienos metu. Paprasčiausias dalykas yra naudoti atskirą fotorezistorių arba LED kaip šviesos jutiklį, bet galite tai padaryti kitaip: žinoma, kad šviesos diodas gali veikti ir kaip fotodiodas, todėl jei indikacijai naudosite prie įvesties prijungtą prievadą ADC, tada, jei norite, galite išmatuoti nešviečiančio indikatoriaus segmento foto-emf ir naudoti šią vertę ryškumui reguliuoti ...

Galite pagalvoti apie aparatinės įrangos nuosekliosios išvesties naudojimą, apie kurią jau užsiminiau.

Įdomią visiškai universalaus požiūrio į dinaminę indikaciją versiją, su kuria taip pat rekomenduoju susipažinti, pasiūlė MOLCHEC. Trumpai tariant, esmė: segmentų pasiskirstymas simbolių bitais, indikatoriui valdyti skirtų prievadų priskyrimas ir net indikatoriaus tipas - trumpai tariant, visi visi parametrai - nustatomi konfigūracijos lentelės pavidalu. EEPROM. Programiškai viskas organizuojama šios lentelės pagrindu: nuo inversijos, priklausomai nuo indikatoriaus tipo, iki bitų keitimo skirtinguose prievaduose. Tuo pačiu metu dinaminės indikacijos programos šaltinio kodas visada išlieka nepakitęs, o konfigūracijos lentelę sudaro galutinis vartotojas, atsižvelgdamas į savo pageidavimus. Metodas iš tiesų yra universalus ir lankstus, tačiau jis susijęs su padidėjusiu programos atminties suvartojimu.


3 Parašyta ARV, 06:48 2010-08-25
Miša, jūsų vietoje nedaryčiau tokių nepaprastų teiginių „tu negali to padaryti“, „niekas neparašė“ ar „autorių teisės“, nes, pirma, tai nemandagu, antra:
1. Aš seniai sukūriau bėgimo liniją ant 10x16 matricos (kas ji buvo) - jos darbo vaizdo įrašą rasite šiame užraše http://site/content/view/160/38/
2. Parašiau straipsnį (rasite naujienose – šiandien paskutinis), kaip padaryti stulpelį LCD. Jei šiek tiek įtempiate savo smegenis, tada perdaryti išvesties į matricą algoritmą yra smulkmena.
3. mano svetainėje nėra nei vieno iš kur nors nukopijuoto straipsnio (copy-paste nėra autorinės teisės, jūs jį užantspaudavote), visa medžiaga yra visiškai originali. daugelis svetainių turi šios medžiagos kopijas su mano leidimu (arba gavus medžiagos autorių leidimą, kurie turi visas teises publikuoti savo medžiagą iš karto daugelyje vietų).

Komentuoti gali tik registruoti vartotojai.
Prašome užsiregistruoti arba prisijungti prie savo paskyros.

Rodikliai dažniausiai yra išdėstyti vietose, kuriose patogu peržiūrėti juose rodomą informaciją. Likusi skaitmeninės grandinės dalis gali būti ant kitų spausdintinių plokščių. Didėjant indikatorių skaičiui, didėja laidininkų skaičius tarp indikatoriaus plokštės ir skaitmeninės plokštės. Tai sukelia tam tikrų nepatogumų kuriant įrangos dizainą ir eksploatavimą. Ta pati priežastis lemia jo vertės padidėjimą.

Jungiamųjų laidininkų skaičių galima sumažinti, kai indikatoriai veiktų impulsiniu režimu. Žmogaus akis turi inerciją, ir jei indikatoriai yra priversti rodyti informaciją pakaitomis pakankamai dideliu greičiu, tada žmogui atrodys, kad visi indikatoriai nuolat rodo savo informaciją. Dėl to galima pakaitomis perduoti rodomą informaciją tais pačiais laidininkais. Paprastai pakanka 50 Hz atnaujinimo dažnio, tačiau geriau šį dažnį padidinti iki 100 Hz.

Pažvelkime į septynių segmentų LED indikatorių įtraukimo blokinę schemą, parodytą 1 paveiksle. Ši grandinė gali dinamiškai parodyti išėjimo skaitmeninę informaciją.


1 pav. Dinaminės indikacijos struktūrinė schema

1 paveiksle parodyta grandinė rodo keturis skaitmeninius skaitmenis. Kiekvienas bitas trumpam prijungiamas prie jungiklio įvesties. Generatorius naudojamas indikatorių informacijos atnaujinimo greičiui nustatyti. Dvejetainis skaitiklis nuosekliai generuoja keturias grandinės būsenas ir per klavišus tiekia alternatyvų maitinimą septynių segmentų indikatoriams.

Dėl to, kai jungiklis tiekia BCD kodą iš įvesties A į septynių segmentų dekoderio įvestis, šis kodas rodomas HL1 indikatoriuje. Kai jungiklis tiekia BCD kodą iš B įvesties į septynių segmentų dekoderio įvestis, šis kodas ciklo metu rodomas HL2 indikatoriuje ir pan.

Informacijos atnaujinimo greitis nagrinėjamoje grandinėje bus keturis kartus mažesnis už generatoriaus dažnį. Tai yra, norint gauti 100 Hz indikatoriaus mirgėjimo dažnį, reikalingas 400 Hz generatoriaus dažnis.

Kiek kartų dėl to sumažinome jungiamųjų laidininkų skaičių? Tai priklauso nuo to, kur nubrėžiame grandinės skerspjūvį. Jei ekrano lentoje paliksime tik indikatorius, tai jų veikimui reikės 7 informacinių signalų segmentams ir keturių perjungimo signalų. Iš viso yra 11 laidininkų. Statinės indikacijos grandinėje mums reikės 7 × 4 = 28 laidininkų. Kaip matote, yra pergalė. Įdiegus 8 bitų ekraną, pelnas bus dar didesnis.

Dar didesnis pelnas bus, jei grandinės skerspjūvis bus nubrėžtas išilgai indikatorių įvesties. Šiuo atveju keturių skaitmenų ekrano blokui reikės tik šešių signalų laidų ir dviejų grandinės maitinimo laidų. Tačiau toks dinaminės indikacijos grandinės skerspjūvio taškas naudojamas labai retai.

Dabar apskaičiuokime srovę, tekančią per kiekvieną šviesos diodo segmentą, kai jis užsidega. Norėdami tai padaryti, naudojame lygiavertę srovės srauto grandinę per vieną iš indikatoriaus segmentų. Ši schema parodyta 2 paveiksle.


Kaip minėta anksčiau, kad šviesos diodas tinkamai veiktų, reikia nuo 3 iki 10 mA srovės. Nustatykime minimalią šviesos diodo srovę iki 3 mA. Tačiau veikiant impulsiniu režimu, indikatoriaus švytėjimo ryškumas sumažėja N kartų, kur koeficientas N yra lygus šiam indikatoriui tiekiamų srovės impulsų darbo ciklui.

Jei ketiname išlaikyti tą patį švytėjimo ryškumą, turime N kartų padidinti impulsinės srovės, tekančios per segmentą, vertę. Aštuonių skaitmenų rodiklio koeficientas N yra lygus aštuoniems. Tarkime, kad iš pradžių pasirinkome statinę srovę per šviesos diodą, lygią 3 mA. Tada, norint išlaikyti tą patį šviesos diodo ryškumą aštuonių skaitmenų indikatoriuje, reikalinga impulsinė srovė:

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

Tik kai kurios skaitmeninių mikroschemų serijos vargu ar gali užtikrinti tokią srovę. Daugeliui mikroschemų serijų reikės stiprintuvų, pagamintų ant tranzistorių jungiklių.

Dabar nustatykime srovę, kuri tekės per raktą, perjungdami maitinimą į atskirus aštuonių bitų ekrano bloko bitus. Kaip matyti iš 2 pav. parodytos grandinės, bet kurio indikatoriaus segmento srovė gali tekėti per raktą. Kai rodomas skaičius 8, reikės apšviesti visus septynis indikatoriaus segmentus, o tai reiškia, kad šiuo metu mygtuku tekančią impulsinę srovę galima nustatyti taip:

I cl \u003d I segdin× N seg= 24 mA × 7 = 168 mA.

Kaip tau patinka ši srovė?! Mėgėjiškose radijo grandinėse dažnai susiduriu su sprendimais, kai perjungimo srovė imama tiesiai iš dekoderio išvesties, kuri negali tiekti didesnės nei 20 mA srovės, ir užduodu sau klausimą - kur galiu pamatyti tokį indikatorių? Visiškoje tamsoje? Pasirodo, „naktinio matymo prietaisas“, tai yra prietaisas, kurio rodmenys matomi tik visiškoje tamsoje.

O dabar pažvelkime į gauto ekrano bloko schemą. Tai parodyta 3 paveiksle.



3 pav. Dinaminių indikacijų bloko schema

Dabar, gavę dinaminės indikacijos grandinę, galime aptarti jos pranašumus ir trūkumus. Neabejotinas dinaminės indikacijos pranašumas yra nedidelis jungiamųjų laidų skaičius, todėl kai kuriais atvejais jis yra būtinas, pavyzdžiui, dirbant su matricos indikatoriais.

Kaip trūkumą reikėtų paminėti didelių impulsinių srovių buvimą, o kadangi bet kuris laidininkas yra antena, dinaminė indikacija yra galingas trikdžių šaltinis. Kitas trukdžių būdas yra maitinimo šaltinis.

Atkreipkite dėmesį, kad perjungimo impulsų frontai yra labai trumpi, todėl jų harmoniniai komponentai apima radijo dažnių diapazoną iki ultratrumpųjų bangų.

Taigi dinaminės indikacijos naudojimas leidžia sumažinti jungiamųjų laidų skaičių tarp skaitmeninio įrenginio ir indikatoriaus, tačiau kartu tai yra galingas trikdžių šaltinis, todėl jo naudojimas radijo imtuvuose yra nepageidautinas.

Jei dėl kokių nors priežasčių, pavyzdžiui, dėl poreikio naudoti matricinius indikatorius, turite naudoti dinaminę indikaciją, tuomet turite imtis visų priemonių trukdžiams slopinti.

Kaip dinaminės indikacijos trikdžių slopinimo priemones galima paminėti įrenginio, jungiamojo kabelio ir plokščių ekranavimą. Minimalaus jungiamųjų laidų ilgio naudojimas, galios filtrų naudojimas. Ekranuojant bloką, gali prireikti ekranuoti pačius indikatorius. Šiuo atveju dažniausiai naudojamas metalinis tinklelis. Šis tinklelis vienu metu gali padidinti rodomų simbolių kontrastą.

Literatūra:

Kartu su straipsniu „Dinaminė indikacija“ rašoma:

Rodikliai skirti rodyti įvairaus tipo informaciją asmeniui. Paprasčiausia informacija yra...
http://website/digital/Indic.php

Iškrovos indikatoriai naudojami bitų informacijai rodyti ir dešimtainei informacijai rodyti. Konstruojant katodo dešimtainius rodiklius...
http://website/digital/GazIndic/

Šiuo metu šviesos diodai beveik visur naudojami dvejetainei informacijai rodyti. Tai yra dėl to...
http://website/digital/LED.php

Skystųjų kristalų indikatorių veikimo principai ... Skystųjų kristalų indikatorių veikimo režimai ... Spalvoto vaizdo formavimas ...
http://website/digital/LCD.php

DKad indikatoriuje būtų rodomas kelių skaitmenų skaičius, pirmiausia turite su juo atlikti sudėtingą manipuliavimą, kurį sudaro skaičių suskaidymas į jo komponentus. Kaip pavyzdį pateiksiu skaičių 1234 ant keturių septynių segmentų indikatoriaus su bendru anodu.


Kad būtų rodomas keturių skaitmenų skaičius, reikia sukurti vieną bendrą kintamąjį, kuriame bus norimas rodyti skaičius (kintamasis W), keturi kintamieji, kuriuose bus saugomi kiekvieno ženklo duomenys (N) ir dar keturi kintamieji tarpinėms transformacijoms (M), kad nepaliestumėte pagrindinio kintamojo. Kintamasis turi atitikti reikšmę, kuri bus jame saugoma.aš. Taigi kintamajamWtipo pakakssveikasis skaičius , nes šio tipo kintamasis gali xpAnimuoti reikšmes nuo -32768 iki +32767 (arbažodį nebent planuojate naudoti neigiamus skaičius). KintamuosiuoseNbus skaičiai nuo 0 iki 9, todėl pakaks naudoti tipo kintamąjįbaitas
. Ir kintamaisiaisM bustos pačios reikšmės kaip ir kintamajameW, todėl nustatome tipą sveikasis skaičius .

Dim W Kaip sveikasis skaičius
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Pritemdytas M1 kaip sveikasis skaičius
Pritemdytas M2 kaip sveikasis skaičius
Dim M3 kaip sveikasis skaičius
Dim M4 kaip sveikasis skaičius


Deklaravus kintamuosius, nustatome išvesties prievaduskuris bus naudojamas indikatoriui prijungti:

DDRC = &B11111111
DDRD = &B11111111


DDRC=&B 00001111 ir DDRD=&B 01111111 (keturios pirmosios C prievado dalysanodams ir šešiems pirmiesiems prievadams D poskyrius).

Tada priskirkite kintamąjį W reikšmė, kurią rodysime indikatoriuje:

W = 1234

"Arial", "sans serif""> Pagrindinėje programos kilpoje kintamiesiems M priskiriame kintamojo reikšmęW, darau taip:

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


"Arial", "sans serif""> Tai nėra paranoja)), tai daroma siekiant, kad visuose kintamuosiuose M būtų vienodas skaičius, nes priskyrimo operacijos metu gali lengvai įsilaužti pertrauka (jei ji yra ir nėra išjungta), kurios tvarkyklėje kintamasisW gali keistis. O jei užduotis vyko taip: М1= W , M 2 = W , M 3 = W , M 4 = W kintamuosiuose M bus skirtingos reikšmės dėl ko skaitymuose kils netvarka.

Po paskyrimo kintamos reikšmės pradėti dirbti su
kiekvienas iš jų, konvertuodamas į kintamąjį N gavo vertę, kuri bus
rodomas indikatoriuje: kintamajame
N 1 turėtų būti „1“, in N 2 - "2", N 3 - "3", o N 4 - "4".

M1 = M1 / ​​1000" M1 = 1234 / 1000 = 1,234
N1 = Abs (m1)" N1 = Abs (1,234) = 1

abs – funkcija, kuri grąžina sveikąjį kintamojo skaičių.Į kintamąjį N 1 pataikė į įrenginį, ko iš tikrųjų reikėjo.

Kintamajam priskirti du N 2 operacija bus šiek tiek sudėtingesnė:

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""> Norėdami pradėti nuo funkcijosMod grąžiname pirmus tris
skaičiaus skaitmenys (likęs dalybos iš 1000), o tada viskas yra kaip pirmuoju atveju.

Su paskutiniais dviem skaitmenimis beveik tas pats:

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

M4 = M4 10 modifikacija
N4 = Abs (m4)


Dabar mūsų kintamuosiuose yra reikšmės, kurias norime rodyti, laikas mikrovaldikliui spirti kojas ir rodyti šias reikšmes indikatoriuje, tam mes vadiname ekrano apdorojimo paprogramę:

"Arial", "sans serif"">

Gosub Led

"Arial", "sans serif""> Procesorius pereis prie paprogramės, pažymėtosLed:

Led:

Portc = &B00001000

"Arial", "sans serif""> Čia mes aptarnaujame aukštą lygįPORTC .3, prie šios kojos prijungėme pirmos kategorijos anodą. Tada pasirenkame, kuriuos segmentus apšviesti, kad būtų rodoma pirmojo kintamojo reikšmė. Ji yra viena iš mūsų, taigi nulis bus ant kojų Portd .1 ir Portd .2, kuris atitinka segmentus B ir C indikatorius.

Pasirinkite atvejį N1









Pabaigos pasirinkimas
Laukia 5

"Arial", "sans serif""> Užsidegę reikiamus segmentus, laukiame 5 ms ir toliau rodomi šie skaičiai:

Portc = &B00000100
Pasirinkite atvejį N2
0 atvejis: Portd = &B11000000
1 atvejis: Portd = &B11111001
2 atvejis: Portd = &B10100100
3 atvejis: Portd = &B10110000
4 atvejis: Portd = &B10011001
5 atvejis: Portd = &B10010010
6 atvejis: Portd = &B10000010
7 atvejis: Portd = &B11111000
8 atvejis: Portd = &B10000000
9 atvejis: Portd = &B10010000
Pabaigos pasirinkimas

Laukia 5

Portc = &B00000010

Pasirinkite atvejį N3
0 atvejis: Portd = &B11000000
1 atvejis: Portd = &B11111001
2 atvejis: Portd = &B10100100
3 atvejis: Portd = &B10110000
4 atvejis: Portd = &B10011001
5 atvejis: Portd = &B10010010
6 atvejis: Portd = &B10000010
7 atvejis: Portd = &B11111000
8 atvejis: Portd = &B10000000
9 atvejis: Portd = &B10010000
Pabaigos pasirinkimas

Laukia 5

Portc = &B00000001

Pasirinkite Case N4
0 atvejis: Portd = &B11000000
1 atvejis: Portd = &B11111001
2 atvejis: Portd = &B10100100
3 atvejis: Portd = &B10110000
4 atvejis: Portd = &B10011001
5 atvejis: Portd = &B10010010
6 atvejis: Portd = &B10000010
7 atvejis: Portd = &B11111000
8 atvejis: Portd = &B10000000
9 atvejis: Portd = &B10010000
Pabaigos pasirinkimas

Laukia 5

"Arial", "sans serif""> Rodydami informaciją apie indikatorių, turite grįžti į pagrindinį programos ciklą, kur reikia užbaigti kilpą ir pažymėti programos pabaigą.

"Arial", "sans serif""> Štai ką mes gauname pabaigoje:

"Arial", "sans serif"">

"Arial", "sans serif""> Dėl nedidelio delsimo perjungimas nebus matomas žmogaus akiai ir pamatysime sveikąjį skaičių 1234.

Žemiau galite atsisiųsti šaltinio kodą ir projektą „Proteus“:"Arial", "sans serif"">