Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2018_264_33
V tem nadaljevanju bomo predstavili knjižnico LED&KEY$SE.sub, namenjeno modulom s komercialnimi imeni LED&KEY, JY-MCU (JY-LKM1638) in QYF-TM1638. Poleg podobnega namena jim je skupno to, da uporabljajo isto LED krmilno integrirano vezje, TM1638. Spoznajmo se najprej s samimi moduli.
LED&KEY in JY-MCU (JY-LKM1638)
Modula LED&KEY (slika 32) in JY-MCU (JY-LKM1638, slika 33) vsebujeta osem 7-segmentnih displejev, niz osem LEDic in niz osem tipk. Displeji imajo skupno katodo in so z integriranim vezjem povezani na identičen način. Tipke so tudi spojene na isti vhod za branje njihovega stanja, K3. Edina razlika je v LEDicah: LED&KEY uporablja rdeče LEDice, katerih anode so povezane na SEG9, medtem ko so v JY-MCU vgrajene dvobarvne, zeleno/rdeče LEDice s skupno katodo, katerih anode so povezane na SEG9 in SEG10. Problem je v tem, ker projektanti niso bili usklajeni in so pri JY-MCU modulu na SEG9 vezani zeleni segmenti LEDic, medtem ko so rdeči vezani na SEG10. To malo nedoslednost bomo morati rešiti programsko.
Ta vsebina je samo za naročnike
QYF-TM1638
Modul QYF-TM1638 (slika 34) vsebuje osem 7-segmentnih displejev in 16 tipk, vendar pa se konstrukcijsko precej razlikuje od predhodnih dveh. Največja razlika je v tem, ker QYF-TM1638 uporablja 7-segmentne displeje s skupno anodo, pri čemer je vrstni red in način povezovanja z integriranim vezjem tudi spremenjen. Razlika je tudi v številu tipk in načinu njihovega povezovanja z integriranim vezjem: tukaj se za branje stanja uporabljata vhoda K1 in K2.
Vse navedene razlike je možno softversko kompenzirati, vendar na QYF-TM1638 modulu obstaja tudi eden konstrukcijski problem: izpuščene so diode med tipkami in SEG priključki, ki na ostalih moduli obstajajo. Takšen način povezovanja ni problematičen, če se pritiska po eno in eno tipko. Če pa pritisnete dve ali več tipk iz iste skupine hkrati, bodo nastali kratki stiki med SEG priključki. V praksi se je pokazalo, da ti kratki stiki niso uničujoči za TM1638 čip. Bo pa, odvisno od kombinacije pritisnjenih tipk, včasih izpis na 7-segmentnem displejih moten: vključili se bodo neželeni segmenti ali celo celotne številke, ki bi morale biti ugasnjene. Te napake softversko ni možno rešiti.
Knjižnica LED&KEY$SE.sub
Knjižnica LED&KEY$SE.sub vsebuje ukaze, ki olajšujejo uporabo vseh prej navedenih modulov. Podprte so mreže od enega do maksimalno 6 modulov, pri čemer morajo biti uporabljeni moduli istega tipa. Moduli so oštevilčeni od 1 do 6, številčenje mora biti po vrsti (če uporabljamo 3 module, morajo biti njihove številke 1, 2 in 3). Z namenom da bi podprogrami iz knjižnice znali pravilno komunicirati z LED&KEY moduli, moramo v glavnem programu definirati katero vrsto modulov uporabljamo, priključke mikrokontrolerja, ki so spojeni na vodilo, število modulov na vodilu in priključke mikrokontrolerja, ki krmilijo STB priključke posameznih modulov.
LED&KEY knjižnica dimenzionira in uporablja naslednje globalne spremenljivke:
Dim Led&Key$7segm(8) As Byte
Niz vsebuje podatke, ki jih je potrebno prikazati na 7-segmentnim displejih trenutno aktivnega modula, pri čemer prvi bajt v nizu ustreza prvemu (levemu) 7-segmentnemu displeju.
Dim Led&Key$leds(8) As Byte
Niz vsebuje podatke, ki jih je treba prikazati na LEDicah trenutno aktivnega modula, pri čemer prvi bajt v nizu ustreza prvi (levi) LEDici.
Dim Led&Key_backup(led_key_number_16) As Byte
Pomožni niz, v katerem se hranijo kopije podatkov 7-segmentnih displejev in LEDic modula, ki trenutno niso aktivni. Velikost niza je odvisna od konstante Led_key_number_16, ki jo Bascom-AVR prevajalnik izračuna med prevajanjem programa glede na konfigurirano število modulov.
Dim Led&Key$k1 As Byte Dim Led&Key$k2 As Byte Dim Led&Key$k3 As Byte
Spremenljivke vsebujejo stanja tipk vezanih na vhode K1, K2 in K3 TM1638 čipa, logična “1” posameznega bita pomeni, da je ustrezna tipka zaprta. Spremenljivke dopolnjuje ukaz Led&Key$sort_keys.
Ukazi iz LED&KEY$SE.sub knjižnice uporabljajo ukaze in spremenljivke iz TM1638$SE.sub knjižnice, pri čemer so posameznim spremenljivkam dodeljena alternativna imena:
Led&Key$current Alias Tm1638$current
Led&Key$current vsebuje redno številko trenutno aktivnega modula (1-6).
Led&Key$s1 Alias Tm1638$keys(1).0 Led&Key$s2 Alias Tm1638$keys(2).0 ... Led&Key$s16 Alias Tm1638$keys(4).5
Led&Key$s1 – Led&Key$s16 so alternativna imena bitov, ki vsebujejo stanja istoimenskih tipk. Koliko teh imen je dostopnih (8 ali 16), in tudi katerim bitom Tm1638$keys() niza so dodeljeni, je odvisno od uporabljenega modula; gornji primer je samo ilustracija.
Poleg navedenih, knjižnica definira še nekaj spremenljivk s prefiksom Led&Key$$; te spremenljivke uporabljajo podprogrami iz knjižnice in ni priporočljivo, da jih uporabljamo iz glavnega programa.
Sledi opis ukazov iz knjižnice:
Ukaz Led&Key$select
Led&Key$select par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno število LED&KEY modulov (1-6) |
Namen: | Shrani vsebine Led&Key$7segm() in Led&Key$leds() nizov predhodno izbranega modula v Led&Key_backup() niz.
Izbere LED&KEY modul katerega številka je definirana s parametrom par1. Dopolnjuje nize Led&Key$7segm() in Led&Key$7leds() s podatki iz Led&Key_backup() niza, ki ustrezajo trenutno izbranem modulu. |
|
Opomba: | Ukaz je veljaven za vse module. |
Ukaz Led&Key$on
Led&Key$on par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje intenzivnost svetilnosti 7-segmentnega displeja in LEDic (0-7) |
Namen: | Vključuje 7-segmentne displeje in LEDice in postavlja zadano intenzivnost. | |
Opombe: | Dovoljene vrednosti parametra par1 so &B000-&B111, ukaz ignorira bite par1.7-par1.3.
Zasvetili bodo samo tisti segmenti in LEDice, katerih biti v displej registru TM1638 čipa so postavljeni v stanje “1”. Ukaz je veljaven za vse module. |
Ukaz Led&Key$off
Led&Key$off
Parametri: | nima |
Namen: | Izključuje 7-segmentne displeje in LEDice. |
Opombe: | Ukaz ne menja vsebine Led&Key$7segm() in Led&Key$7leds() nizov.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$rled_on
Led&Key$rled_on par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko LEDice (1-8) |
Namen: | Vključuje rdečo LEDico na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$leds(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za module tipa 1 (LED&KEY) in 2 (JY-MCU JY-LKM1638). |
Ukaz Led&Key$rled_off
Led&Key$rled_off par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko LEDice (1-8) |
Namen: | Izključuje rdečo LEDico na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$leds(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za module tipa 1 (LED&KEY) in 2 (JY-MCU JY-LKM1638). |
Ukaz Led&Key$gled_on
Led&Key$gled_on par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko LEDice (1-8) |
Namen: | Vključuje zeleno LEDico na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$leds(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven samo za module tipa 2 (JY-MCU JY-LKM1638). |
Ukaz Led&Key$gled_off
Led&Key$gled_off par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko LEDice (1-8) |
Namen: | Izključuje zeleno LEDico na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$leds(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven samo za module tipa 2 (JY-MCU JY-LKM1638). |
Ukaz Led&Key$yled_on
Led&Key$yled_on par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko LEDice (1-8) |
Namen: | Vključuje rdečo in zeleno LEDico na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$leds(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven samo za module tipa 2 (JY-MCU JY-LKM1638). |
Ukaz Led&Key$yled_off
Led&Key$yled_off par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko LEDice (1-8) |
Namen: | Izključuje rdečo in zeleno LEDico na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$leds(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven samo za module tipa 2 (JY-MCU JY-LKM1638). |
Ukaz Led&dp$dp_on
Led&Key$dp_on par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko 7-segmentnega displeja (1-8) |
Namen: | Vključuje decimalno piko na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$7segm(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$dp_off
Led&Key$dp_off par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko 7-segmentnega displeja (1-8) |
Namen: | Izključuje decimalno piko na danem mestu. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$7segm(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$7seg_clear
Led&Key$7seg_clear par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko 7-segmentnega displeja (1-8) |
Namen: | Briše vse segmente zadanega displeja, vključujoč decimalno piko. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$7segm(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$7seg_set
Led&Key$7seg_set par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko 7-segmentnega displeja (1-8) |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje podatek o segmentih, ki jih je potrebno vključiti (0-255) | |
Namen: | Vključuje segmente danega displeja, pri čemer posameznemu segmentu ustrezajo naslednji biti: “a” = par2.0, “b” = par2.1, “c” = par2.2, “d” = par2.3, “e” = par2.4, “f” = par2.5, “g” = par2.6, “dp” = par2.7. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$7segm(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$7seg_hex
Led&Key$7seg_set par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje zaporedno številko 7-segmentnega displeja (1-8) |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje heksadecimalni podatek, ki ga je potrebno izpisati (&H0-&Hf) | |
Namen: | Izpisuje heksadecimalno številko na danem displeju. | |
Opombe: | Sprememba se izvaja samo v nizu Led&Key$7segm(), vidna bo postala šele po izvršitvi ukaza Led&Key$refresh.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$refresh
Led&Key$refresh
Parametri: | nima |
Namen: | Prenaša vsebino Led&Key$7segm() in Led&Key$7leds() nizov v spomin TM1638 čipa za displej. |
Opombe: | Po izvršitvi tega ukaza, bodo spremembe v Led&Key$7segm() in Led&Key$7leds() nizih prikazane na modulu.
Ukaz je veljaven za vse module. |
Ukaz Led&Key$read_keys
Led&Key$read_keys
Parametri: | nima |
Namen: | Ažurira stanja Led&Key$s1 – Led&Key$s16 bitov v skladu s trenutnim stanjem tipk. Za pritisnjeno tipko postavlja pridruženi bit v stanje “1”. |
Opombe: | Ukaz je predpogoj za izvršitev ukaza Led&Key$sort_keys.
Pri modulih tipa 1 (LED&KEY) in 2 (JY-MCU JY-LKM1638) so dostopni samo biti Led&Key$s1 – Led&Key$s8. |
Ukaz Led&Key$sort_keys
Led&Key$sort_keys
Parametri: | nima |
Namen: | Ažurira stanja Led&Key$k1 – Led&Key$k3 spremenljivk v skladu s trenutnim stanjem tipk. Za pritisnjeno tipko postavlja pridruženi bit v stanje “1”. |
Opombe: | Predhodno je potrebno izvršiti ukaz Led&Key$read_keys.
Pri modulih tipa 1 (LED&KEY) in 2 (JY-MCU JY-LKM1638) se bo ažurirala samo vsebina spremenljivke Led&Key$k3. Pri modulu tipa 3 (QYF-TM1638) se bodo ažurirale samo vsebine spremenljivk Led&Key$k1 in Led&Key$k2. |
Programi LED&KEY_1.bas, LED&KEY_2.bas in LED&KEY_3.bas
Namen teh programov je preverjanje ukazov iz knjižnice LED&KEY$SE.sub, ki upravljajo s prikazom na 7-segmentnih displejih in LEDicah. Prvi program podpira modul tipa 1 (LED&KEY), drugi modul tipa 2 (JY-MCU JY-LKM1638) tretji modul tipa 3 (QYF-TM1638). Programi so identični razen v segmentih s katerimi se moduli hardversko razlikujejo (LEDice).
Vsak program je razdeljen na 5 celot, od katerih se prva izvršuje med inicializacijo (po resetu mikrokontrolerja) ostale pa s pritiski na tipke TP1-TP4:
Inicializacijska rutina dopolnjuje displej spomin TM1638 čipa z binarnimi enicami (&Hff) od najniže lokacije do najvišje, zasvetili bodo vsi segmenti in vse LEDice. Če se uporablja ukaze Tm1638$write_control in Tm1638$write_byte, cilj pa je pokazati kako je knjižnica LED&KEY$SE.sub transparentna za ukaze iz knjižnice TM1638$SE.sub. Nato na isti način vpisuje binarne ničle (&H00) v displej spomin in s tem briše (ugaša) displeje in LEDice.
TP1: Postopno vključuje vse segmente 7-segmentnih displejev in LEDice (preverja ukaze Led&Key$7seg_set in Led&Key$rled_on in Led&Key$refresh). Izmenično vklaplja in izklaplja displeje in LEDice, nato menja intenzivnost svetilnosti od najmanjše do največje in nazaj (Led&Key$on in Led&Key$offl). Briše prikaz na displejih in LEDicah (Led&Key$7seg_clear in Led&Key$rled_off).
TP2: Dokler je tipka TP2 pritisnjena, na 7-segmentnih displejih izmenično izpisuje heksadecimalne znake “0”-“7” in “8”-“F” (preverja ukaze Led&Key$7seg_hex).
TP3: Izpisuje in nato briše decimalne pike na vseh pozicijah 7-segmentnih displejev (preverja ukaze Led&Key$dp_on in Led&Key$dp_off). Vključuje in izklaplja rdeče LEDice (Led&Key$rled_on in Led&Key$rled_on, velja za module 1 in 2), nato zelene in skupaj rdeče in zelene (Led&Key$gled_on, Led&Key$gled_on, Led&Key$yled_on in Led&Key$yled_on, velja samo za modul 2).
TP4: Menja izbrani modul (1->2->3->1…). Številka trenutno izbranega modula je prikazana na LEDicah LED0 in LED1 (slika 30).
Na začetku programa izberemo tip modula, ki ga želimo uporabljati:
Const Led_key_type = 1 'LED&KEY
Alternative so (v programu je lahko izbran samo en tip modula!):
'Const Led_key_type = 2 'JY-MCU JY-LKM1638 'Const Led_key_type = 3 'QYF-TM1638
Nato določamo, koliko modulov bo spojenih na vodilo:
Const Led_key_number = 3
zato definiramo krmilne priključke vodila:
Led_key_do Alias Portd.6 Led_key_di Alias Pind.6 Led_key_clk Alias Portd.5
Krmilni priključek za DIO linijo mora biti konfiguriran kot vhodni in kot izhodni! Predvideli smo, da bodo na vodilo spojeni 3 moduli, sledi definicija priključkov mikrokontrolerja, ki krmilijo z njihovimi STB vhodi:
Led_key_stb Alias Portd.4 Led_key_stb1 Alias Portb.2 Led_key_stb2 Alias Portb.3
Sedaj lahko vključimo LED&KEY$SE knjižnico:
$include "LED&KEY$SE.sub"
S tem nam bodo postale dostopne vse spremenljivke, konstante, definicije in ukazi iz LED&KEY$SE.sub knjižnice, vendar bodo sestavni del programa postali samo tisti ukazi, ki jih bomo uporabljali. V program se bo avtomatsko vključil samo inicijalizacijski podprogram, ki bo konfiguriral predhodno definirane CLK in STB priključke kot izhodne, postavil jih bo v ustrezno začetno stanje in izbral bo prvi LED&KEY modul. Opomba: knjižnica uporablja novi način definiranja podprogramov (Config Submode = New) zato je to treba upoštevati, če se v programu uporabljajo podprogrami iz nekih drugih knjižnic ali lastni podprogrami.
Večina ukazov iz LED&KEY$SE.sub knjižnice uporablja ukaze in podprograme iz TM1638$SE.sub knjižnice, zato so uporabniku dostopni. Včasih se isti učinek lahko doseže z uporabo podobnih ukazov iz ene ali druge knjižnice. Naj takoj poudarimo razliko na enem primeru! Če želite pobrisati prikaz na 7-segmentnih displejih, to lahko naredite z vpisom binarnih ničel na parne naslove v spomin displeja:
For I = 0 To 14 Step 2 Tm1638$write_byte I , &B00000000 Next
ali pač z uporabo ukaza Led&Key$7seg_clear:
For I = 1 To 8 Led&Key$7seg_clear I Next
Prvi primer bo imel trenutni učinek in vsi segmenti se bodo izklopili. V drugem primeru se bo zbrisala “slika” 7-segmentnih displejev v polju Led&Key$7segm(). Da bi ta sprememba postala vidna, jo je potrebno prenesti v modul oziroma osvežiti njegov prikaz:
Led&Key$refresh
To velja tudi za vse ostale Led&Key$ ukaze, ki postavljajo vsebino 7-segmentnih displejev in LEDic: da bi sprememba postala vidna, je potrebno osvežiti prikaz. To se lahko dela po vsaki spremembi, kot v tem primeru:
For I = 1 To 8 Led&Key$rled_on I Led&Key$refresh Waitms 100 Next
ali samo enkrat, ko so narejene vse želene spremembe:
For I = 1 To 8 Led&Key$rled_on I Next Led&Key$refresh
Prvi postopek uporabljamo če želimo doseči učinek animacije (LEDice se bodo vklapljale ena po ena). Drugi postopek uporabimo takrat, ko želimo da vse spremembe postanejo vidne naenkrat.
Z izmeničnim vklapljanjem in izklapljanjem displeja dosežemo učinek "utripanja": For I = 1 To 4 Led&Key$on 2 Waitms 500 Led&Key$off Waitms 500 Next
Vendar pa lahko ukaz Led&Key$on zmore več od tega; poleg tega, ko vklaplja prikaz na displeju, sočasno tudi postavlja želeno jakost svetilnosti. Tako bo zanka
For I = 0 To 7 Led&Key$on I Waitms 200 Next
postopno povečevala jakost svetilnosti od minimalne do maksimalne, zanka
For I = 7 To 0 Step -1 Led&Key$on I Waitms 200 Next
pa jo bo postopno zmanjševala do minimuma. Z ukazom Led&Key$7seg_set lahko vklopimo katero koli kombinacijo segmentov na 7-segmentnem displeju. Npr.,
Led&Key$7seg_set 1, &B00111111
bo na prvem displeju vklopila segmente “a”, “b”, “c”, “d”, “e” in “f” in tako izpisala številko “0”. Da bi olajšal izpis heksadecimalnih znakov 0-F, sem v knjižnico vključil ukaz Led&Key$7seg_hex. Sestavni del ukaza je tabela z definicijo heksadecimalnih znakov. Zanka
For I = 1 To 8 J = I - 1 Led&Key$7seg_hex I , J Next Led&Key$refresh
bo izpisala znake “0” – “7”, zanka
For I = 1 To 8 J = I + 7 Led&Key$7seg_hex I , J Next Led&Key$refresh
pa znake “8” – “F” (slika 35).
Kadar imate numerični izpis na 7-segmentnih displejih, lahko decimalno piko dodate ali zbrišete na poljubnem mestu, in pri tem ne porušimo samega izpisa. Npr.,
Led&Key$dp_on 2
bo dodal decimalno piko za 2. znakom, ukaz
Led&Key$dp_off 2
pa jo bo zbrisal. Seveda je po vsakem od teh ukazov potrebno osvežiti prikaz z ukazom Led&Key$refresh, sicer njihov učinek ne bo viden.
Kadar delate z več LED&KEY moduli na vodilu, lahko posamezni modul izberete z ukazom Led&Key$select. Predpostavimo, da je trenutno aktiven modul 1, od sedaj naprej pa želimo komunicirati z modulom 3. Ukaz
Led&Key$select 3
bo deaktiviral modul 1 in aktiviral modul 3, zato bodo vsi naslednji ukazi in podatki usmerjeni proti njemu. Razen tega bo knjižnica shranila trenutno “sliko” displej spomina modula 1 in potegnila iz shrambe predhodno shranjeno “sliko” displej spomina modula 3, da bi na njej lahko nadaljevali z delom. Sam prikaz na obeh modulih pri tem se ne bo spremenil, ker TM1638 čipi, ki upravljajo s prikazi na displejih to delajo na osnovi slike, ki jo imajo v svojem lastnem spominu.
Fotografija na sliki 31 je iz preteklega nadaljevanja in prikazuje eno takšno konfiguracijo s 3 različnimi moduli. To lahko koristno uporabimo za namene testiranja, vendar v pravilu ni dobro: knjižnica se lahko prilagodi samo eni vrsti modula, vendar pa vsi moduli, ki se nahajajo na vodilu, morajo biti iste vrste.
Programi LED&KEY_1_read.bas, LED&KEY_2_read.bas in LED&KEY_3_read.bas
Te programi ilustrirajo uporabo ukazov iz knjižnice LED&KEY$SE.sub, ki preverjajo stanje tipk. Prvi program podpira modul tipa 1 (LED&KEY), drugi modul tipa 2 (JY-MCU JY-LKM1638) tretji modul pa tipa 3 (QYF-TM1638). Programi so identični, razen v segmentih v katerih se moduli hardversko razlikujejo.
Uvodni del programa, v katerem se definira tip in številka modula na vodilu in se konfigurirajo komunikacijski in krmilni priključki je isti, kot v predhodnih primerih. Da bi lahko ugotovili stanje tipk trenutno aktivnega modula, moramo pogosto brati vsebino vhodnega registra njegovega TM1638 čipa:
Do ... Led&Key$read_keys ... Loop
Podatki, ki jih dobimo z ukazom Led&Key$read_keys so “surovi” in jih je treba interpretirati odvisno od načina na katerega so tipke povezane s TM1638 čipom. Programi ilustrirajo tri načine prikaza, ki jih izberemo s pritiskom na tipke TP1, TP2 in TP3 razvojnega sistema (tipka TP4 kot v predhodnih primerih, služi za izbor modula).
Prva možnost je, da direktno uporabljamo “surove” podatke v nizu Tm1638$keys(), ki so direktna preslikava vhodnega registra čipa. Tako lahko ugotovimo katera tipka z modula aktivira kateri bit v vhodnem registru. V programu smo vsebine niza naredili vidne z izpisom na prve štiri 7-segmentne displeje:
Disp_keys_1: ... Led&Key$7seg_set 1 , Tm1638$keys(1) Led&Key$7seg_set 2 , Tm1638$keys(2) Led&Key$7seg_set 3 , Tm1638$keys(3) Led&Key$7seg_set 4 , Tm1638$keys(4) Led&Key$refresh Return
Druga možnost je, da uporabljamo bit spremenljivke Led&Key$s1 – Led&Key$s16, katere knjižnica pridružuje ustreznim bitom v skladu z izbranim tipom modula. Tukaj nam ni treba nič preučevati, Led&Key$s1 ustreza tipki S1, Led&Key$s2 tipki S2 itd.; število definiranih bit spremenljivk ustreza številu tipk, ki se nahajajo na uporabljenem modulu. V programu smo stanja tipk prikazali s prižiganjem gornjih segmentov (segmenti “a”) za tipke S1-S8, in sredinskih segmentov (segmenti “g”) za tipke S9-S16 (samo za modul tipa 3). Programsko je prikaz rešen tako:
Disp_keys_2:
…
Led&Key$7segm(1).0 = Led&Key$s1
Led&Key$7segm(2).0 = Led&Key$s2
…
Led&Key$7segm(7).6 = Led&Key$s15
Led&Key$7segm(8).6 = Led&Key$s16
Led&Key$refresh
Return
Tretja možnost je, da uporabljamo ukaz Led&Key$sort_keys, ki bo postavil bite spremenljivke Led&Key$k3 (za module tipa 1 in 2) na naslednji način: tipka S1 je pridružena bitu Led&Key$k3.0, tipka S2 bitu Led&Key$k3.1 itd. Pri modulih tipa 3 se postavljajo biti spremenljivk Led&Key$k1 in Led&Key$k2 na naslednji način: tipka S1 je pridružena bitu Led&Key$k1.0, tipka S2 bitu Led&Key$k1.1 itd., tipka S16 je pridružena bitu Led&Key$k2.7. Programsko je to rešeno tako (bodite pozorni na Led&Key$sort_keys ukaz, ki prej ni bil potreben):
Disp_keys_3: ... Led&Key$sort_keys Led&Key$7segm(1).0 = Led&Key$k1.0 Led&Key$7segm(2).0 = Led&Key$k1.1 ... Led&Key$7segm(7).6 = Led&Key$k2.6 Led&Key$7segm(8).6 = Led&Key$k2.7 Led&Key$refresh Return
Opomba: knjižnico LED&KEY$SE.sub in vse navedene programe lahko brezplačno snamete s spletnih strani revije Svet elektronike.
Barduino (10)