Arduino en viercijferige zevensegmentindicator. Indicator met zeven segmenten Arduino met 4 cijfers en zeven segmenten

Er zijn parameters waarvoor het handiger zou zijn om objectieve informatie te verstrekken in plaats van slechts een indicatie te geven. Bijvoorbeeld de luchttemperatuur buiten of de tijd op de wekker. Ja, dit alles kan worden gedaan met gloeiende lampen of LED's. Eén graad – één brandende LED of gloeilamp, enz. Maar als je deze vuurvliegjes meetelt, nou ja, nee! Maar zoals ze zeggen: de eenvoudigste oplossingen zijn de meest betrouwbare. Daarom hebben de ontwikkelaars, zonder lang na te denken, eenvoudige LED-strips genomen en deze in de juiste volgorde gerangschikt.

Aan het begin van de twintigste eeuw, met de komst van vacuümbuizen, verschenen de eerste gasontladingsindicatoren

Met behulp van dergelijke indicatoren was het mogelijk om digitale informatie in Arabische cijfers weer te geven. Voorheen werden op dergelijke lampen verschillende aanduidingen gemaakt voor instrumenten en andere elektronische apparaten. Momenteel worden gasontladingselementen vrijwel nergens toegepast. Maar retro is altijd in de mode, daarom verzamelen veel radioamateurs prachtige horloges op gasontladingsindicatoren voor zichzelf en hun dierbaren.


Het nadeel van gasontladingslampen is dat ze veel elektriciteit verbruiken. Over duurzaamheid valt te twisten. Op onze universiteit worden in laboratoriumruimtes nog steeds frequentiemeters met gasontladingsindicatoren gebruikt.

Indicatoren met zeven segmenten

Met de komst van LED's is de situatie dramatisch ten goede veranderd. LED's zelf verbruiken weinig stroom. Als u ze op de juiste positie plaatst, kunt u absoluut alle informatie weergeven. Om alle Arabische cijfers te benadrukken zijn slechts zeven lichtgevende LED-strips voldoende - segmenten, op een bepaalde manier geplaatst:

Aan bijna al deze zevensegmentindicatoren wordt ook een achtste segment toegevoegd: een punt, zodat het mogelijk is de gehele en fractionele waarde van elke parameter weer te geven

In theorie krijgen we een indicator met acht segmenten, maar op de ouderwetse manier wordt dit ook wel een indicator met zeven segmenten genoemd.

Wat is het resultaat? Elke strip op de uit zeven segmenten bestaande indicator wordt verlicht door een LED of een groep LED's. Als gevolg hiervan kunnen we, door bepaalde segmenten te markeren, cijfers van 0 tot 9 weergeven, evenals letters en symbolen.

Typen en aanduiding op het diagram

Er zijn ééncijferige, tweecijferige, driecijferige en viercijferige zevensegmentindicatoren. Ik heb nog nooit meer dan vier categorieën gezien.

In de diagrammen ziet de zevensegmentindicator er ongeveer zo uit:

In feite heeft elke indicator met zeven segmenten, naast de hoofdterminals, ook een gemeenschappelijke terminal met een gemeenschappelijke anode (OA) of een gemeenschappelijke kathode (OC)

Het interne circuit van een indicator met zeven segmenten en een gemeenschappelijke anode ziet er als volgt uit:


en met een gemeenschappelijke kathode zoals deze:


Als we een indicator met zeven segmenten hebben met een gemeenschappelijke anode (OA), dan moeten we in het circuit "plus" stroom aan deze pin leveren, en als we een gemeenschappelijke kathode (OC) hebben, dan "min" of aarde.

Hoe een indicator met zeven segmenten te controleren

We hebben de volgende indicatoren:


Om een ​​moderne indicator met zeven segmenten te controleren, hebben we alleen een multimeter met diodetestfunctie nodig. Om te beginnen zijn we op zoek naar een algemene conclusie: het kan OA of OK zijn. Hier alleen willekeurig. Welnu, dan controleren we de prestaties van de resterende segmenten van de indicator volgens de bovenstaande diagrammen.

Zoals u op de onderstaande foto kunt zien, licht het geteste segment op. Andere segmenten controleren we op dezelfde manier. Als alle segmenten verlicht zijn, is een dergelijke indicator intact en kan deze in uw ontwikkelingen worden gebruikt.


Soms is de spanning op de multimeter niet voldoende om een ​​segment te testen. Daarom nemen we een voeding en stellen deze in op 5 Volt. Om de stroom door het segment te beperken, controleren we een weerstand van 1-2 kilo-Ohm.


Op dezelfde manier controleren we de indicator van de Chinese ontvanger


In de circuits zijn indicatoren met zeven segmenten op elke pin verbonden met weerstanden

In onze moderne wereld worden indicatoren met zeven segmenten vervangen door indicatoren met vloeibare kristallen die absoluut alle informatie kunnen weergeven.

maar om ze te gebruiken heb je bepaalde vaardigheden nodig in het circuitontwerp van dergelijke apparaten. Daarom worden indicatoren met zeven segmenten nog steeds gebruikt, vanwege hun lage kosten en gebruiksgemak.

Laten we een LED-indicator met zeven segmenten aansluiten op het Arduino-bord en leren hoe we deze kunnen besturen met behulp van de Led4Digits.h-bibliotheek.

In de vorige les zijn microcontrollers in detail beschreven. Laten we zo'n indicator op het Arduino-bord aansluiten.

Het diagram voor het aansluiten van de indicator op het Arduino-bord ziet er als volgt uit.

Ik heb het op een printplaat gemonteerd.

Om indicatoren te beheren, heb ik de Led4Digits.h-bibliotheek geschreven:

En betaal.

Met de bibliotheek kunt u indicatoren met zeven segmenten beheren:

  • maximaal vier cijfers groot;
  • met alle varianten van stuurpulspolariteiten (alle);
  • werkt in een parallel proces;
  • Hiermee kunt u op de indicator weergeven:
    • segmenten van elke categorie;
    • het cijfer van elk cijfer;
    • geheel getal 0 ... 9999;
  • om een ​​geheel getal uit te voeren, kan het aantal cijfers worden gespecificeerd;
  • Er is een modus voor het onderdrukken van onbeduidende cijfers.

U kunt de Led4Digits.h-bibliotheek downloaden via deze link:

En betaal. Slechts 40 wrijven. per maand voor toegang tot alle sitebronnen!

Hoe te installeren staat geschreven in .

Ik zal de bronteksten niet verstrekken. Je kunt ze opzoeken in de bibliotheekbestanden. Zoals altijd zijn er veel reacties. Ik zal gedetailleerd beschrijven, met voorbeelden, hoe u de bibliotheek kunt gebruiken.

LED-besturingsbibliotheek voor Arduino Led4Digits.

Hier is de klassebeschrijving. Ik heb alleen openbare methoden en eigenschappen opgegeven.

klasse Led4Digits (
publiek:
bytecijfer; // bitsegmentbesturingscodes
ongeldig regen(); // regeneratie, de methode moet regelmatig worden aangeroepen
void tetradToSegCod(byte dig, byte tetrad); // tetrad naar segmentcodes converteren
boolean print(niet-ondertekende int-waarde, byte digitNum, byte leeg); // gehele uitvoer



} ;

Constructeur.

Led4Digits (bytetypeLed, byte cijferPin0, byte cijferPin1, byte cijferPin2, byte cijferPin3,
byte segPinA, byte segPinB, byte segPinC, byte segPinD,
byte segPinE, byte segPinF, byte segPinG, byte segPinH);

typeLed Stelt de stuurpulspolariteiten in voor bit- en segmentselectiesignalen. Ondersteunt alle verbindingsschema's ().

typeLed Selectie van categorie Segmentselectie Circuittype
0 -_- -_- Gemeenschappelijke anode met ontladingsselectietoetsen
1 _-_ -_- Gemeenschappelijke anode
2 -_- _-_ Gemeenschappelijke kathode
3 _-_ _-_ Gemeenschappelijke kathode met ontladingsselectietoetsen

cijferPin0...cijferPin3– uitgangen voor het selecteren van cijfers. Als digitPin = 255, dan is het cijfer uitgeschakeld. Hierdoor kunt u indicatoren met minder cijfers verbinden. digitPin0 – laag (rechter) cijfer.

segPinA...segPinH– segmentbesturingsuitgangen.

Bijvoorbeeld,

betekent: indicatortype 1; afvoeruitgangen 5,4,3,2; uitgangen van segmenten 6,7,8,9,10,11,12,13.

void regen() methode

De methode moet regelmatig in een parallel proces worden aangeroepen. Het regenereert het beeld op de indicatoren. De regeneratiecyclustijd is gelijk aan de methodeaanroepperiode vermenigvuldigd met het aantal bits.

Bijvoorbeeld,

// interrupt-handler 2 ms
void timerInterrupt() (
disp.regen(); // indicator regeneratie
}

Bytecijferarray

Bevat de status van de segmenten. cijfer is het minst significante bit, het minst significante bit van een cijfer is het “A”-segment van het minst significante bit. Een bitstatus van 1 betekent dat het segment verlicht is.

Bijvoorbeeld,

cijfer = B0000101;

betekent dat in het tweede cijfer de segmenten “A” en “C” oplichten.

Een voorbeeld van een programma dat achtereenvolgens alle segmenten van elk cijfer verlicht.

// lopende segmenten
#erbij betrekken
#erbij betrekken

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

ongeldige setup() (
timeronderbreking 2 ms
MsTimer2::start(); // onderbreking inschakelen
}

lege lus() (
voor (int i = 0; ik< 32; i++) {
als (i == 0) disp.cijfer= 1;
anders als (i == 8) disp.digit= 1;
anders als (i == 16) disp.digit= 1;
anders als (i == 24) disp.digit= 1;
anders(
disp.cijfer = disp.cijfer<< 1;
disp.cijfer = disp.cijfer<< 1;
disp.cijfer = disp.cijfer<< 1;
disp.cijfer = disp.cijfer<< 1;
}
vertraging(250);
}
}

//interrupt-handler 2 ms
void timerInterrupt() (
disp.regen(); // indicator regeneratie
}

In de cijferreeks is 1 verschoven en de indicatoren geven dit aan.

Methode ongeldig tetradToSegCod(byte dig, byte tetrad)

Met deze methode kunt u cijfers en letters van een hexadecimale code in afzonderlijke cijfers weergeven. Heeft argumenten:

  • dig – cijfernummer 0 ... 3;
  • tetrad – decimale tekencode. Code 0 geeft het cijfer “0” weer, code 1 - het cijfer "1", code 14 - de letter "E".

Bijvoorbeeld,

tetrad(2, 7);

zal het nummer “7” in het derde cijfer weergeven.

Een voorbeeld van een programma dat achtereenvolgens de tekens in elk cijfer verandert.

// nummers één voor één
#erbij betrekken
#erbij betrekken

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

ongeldige setup() (
MsTimer2::set(2, timerInterrupt); // timeronderbreking 2 ms
MsTimer2::start(); // onderbreking inschakelen
}

lege lus() (
voor (int i = 0; ik< 64; i++) {
disp.tetradToSegCod(i>>4, i);
vertraging(250);
}
}

// interrupt-handler 2 ms
void timerInterrupt() (
disp.regen(); // indicator regeneratie
}

Methode boolean print(niet-ondertekende int-waarde, byte digitNum, byte leeg)

De methode geeft een geheel getal weer op de indicatoren. Het converteert het binaire getal voor elk cijfer naar BCD. Heeft argumenten:

  • waarde – het getal dat op de indicator wordt weergegeven.
  • digitNum – aantal cijfers voor het nummer. Dit moet niet worden verward met het aantal indicatorcijfers. Mogelijk wilt u een getal op twee cijfers weergeven en op de andere twee tekens met cijfers.
  • blanco – een teken van onderdrukking van onbeduidende cijfers. blanco=0 betekent dat het getal met allemaal nullen moet worden weergegeven. Het getal "7" ziet eruit als "0007". Als blanco verschillend is van 0, worden onbeduidende nullen onderdrukt.

Als de getalswaarde het toegestane aantal voor het geselecteerde aantal cijfers (digitNum) overschrijdt, geeft de functie "---" weer op de indicator en retourneert false.

Een voorbeeld van een nummeruitvoerprogramma.

// uitgangsnummer
#erbij betrekken
#erbij betrekken

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

ongeldige setup() (
MsTimer2::set(2, timerInterrupt); // timeronderbreking 2 ms
MsTimer2::start(); // onderbreking inschakelen
}

lege lus() (
voor (int i = 0; ik< 12000; i++) {
weergave.print(i, 4, 1);
vertraging(50);
}
}

// interrupt-handler 2 ms
void timerInterrupt() (
disp.regen(); // indicator regeneratie
}

De laatste twee methoden veranderen niets aan de status van het “H”-segment – ​​de komma. Om de status van een punt te wijzigen, kunt u de volgende commando's gebruiken:

cijfer |= 0x80; // verlicht de komma
cijfer &= 0x7f; // doof de komma uit

Uitvoer naar indicatoren van negatieve getallen (int).

Negatieve getallen kunnen als volgt worden uitgevoerd:

  • Controleer het teken van het nummer.
  • Als het getal negatief is, druk dan een minteken af ​​bij het meest significante cijfer en verander het teken van het getal in positief in de print() functie.
  • Als het getal positief is, schakel dan de tekenbit uit en druk het getal af met behulp van de print() functie.

Hier is een programma dat deze methode demonstreert. Het voert getallen uit van -999 tot 999.

// negatieve getallen uitvoeren
#erbij betrekken
#erbij betrekken

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

ongeldige setup() (
MsTimer2::set(2, timerInterrupt); // timeronderbreking 2 ms
MsTimer2::start(); // onderbreking inschakelen
}

lege lus() (

voor (int i = -999; i< 1000; i++) {

als (ik< 0) {
// het getal is negatief
weergave.cijfer= B01000000; // teken -
disp.print(i * -1, 3, 1);
}
anders(
weergave.cijfer= B00000000; // Wis het bord
weergave.print(i, 3, 1);
}

vertraging(50);
}
}

// interrupt-handler 2 ms
void timerInterrupt() (
disp.regen(); // indicator regeneratie
}

Uitvoer naar indicatoren van fractionele getallen, float-formaat.

Er zijn veel manieren om getallen met drijvende komma (floats) op indicatoren weer te geven met behulp van standaard C-taalfuncties. Dit is in de eerste plaats de functie sprint(). Het werkt erg langzaam, vereist extra conversies van tekencodes naar binaire decimale codes, je moet een punt uit een string halen. Dezelfde problemen met andere functies.

Ik gebruik een andere methode om de waarden van float-variabelen op indicatoren weer te geven. De methode is eenvoudig, betrouwbaar en snel. Reduceert tot de volgende bewerkingen:

  • Het getal met drijvende komma wordt vermenigvuldigd met 10 tot de macht die overeenkomt met het vereiste aantal decimalen. Als u 1 decimaal op indicatoren wilt weergeven, vermenigvuldig dan met 10, als het 2 is, vermenigvuldig dan met 100, 3 decimalen met 1000.
  • Vervolgens wordt het drijvende-kommagetal expliciet geconverteerd naar een geheel getal (int) en weergegeven op de indicatoren met behulp van de print()-functie.
  • Er wordt een punt in het gewenste cijfer geplaatst.

De volgende regels zullen bijvoorbeeld een float-variabele met twee decimalen uitvoeren naar de zeven-segment-LED's.

vlotter x = 2,12345;

weergavecijfer |= 0x80; //

We vermenigvuldigen het getal met 100 en door een punt in het derde cijfer te plaatsen, delen we het resultaat door 100.

Hier is een programma dat drijvende-kommagetallen van 0,00 tot 99,99 op de indicatoren weergeeft.

// drijvende-komma-uitvoer
#erbij betrekken
#erbij betrekken

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

ongeldige setup() (
MsTimer2::set(2, timerInterrupt); // timeronderbreking 2 ms
MsTimer2::start(); // onderbreking inschakelen
}

lege lus() (
zweven x = 0;

voor (int i = 0; ik< 10000; i++) {
x+= 0,01;

disp.print((int)(x * 100.), 4, 1);
weergavecijfer |= 0x80; // verlicht het derde niveaupunt

vertraging(50);
}
}

//interrupt-handler 2 ms
void timerInterrupt() (
disp.regen(); // indicator regeneratie
}

Zoals u kunt zien, vereenvoudigt de Led4Digits.h-bibliotheek het werken met zeven-segment light-emitting diode (LED)-indicatoren die zijn aangesloten op het Arduino-bord aanzienlijk. Ik heb geen analoog van een dergelijke bibliotheek gevonden.

Er zijn bibliotheken voor het werken met LED-displays via een schuifregister. Iemand schreef me dat ze een bibliotheek hadden gevonden die werkt met een LED-display dat rechtstreeks op het Arduino-bord is aangesloten. Maar bij gebruik gloeien de indicatorcijfers ongelijkmatig en knipperen ze.

In tegenstelling tot zijn analogen, doet de Led4Digits.h-bibliotheek het volgende:

  • Wordt uitgevoerd als een parallel proces. In de hoofdlus laadt het programma gegevens in bepaalde variabelen, die automatisch op het display worden weergegeven. Informatie-uitvoer en indicatorregeneratie vinden plaats in een timer-interrupt, onzichtbaar voor het hoofdprogramma.
  • De displaynummers lichten gelijkmatig op, zonder te knipperen. Deze eigenschap wordt verzekerd door het feit dat de regeneratie plaatsvindt in een cyclus die strikt wordt gedefinieerd door een timer-interrupt.
  • De bibliotheek heeft compacte code, wordt snel uitgevoerd en belast de controller minimaal.

In de volgende les zullen we tegelijkertijd een LED-indicator en een knoppenmatrix op het Arduino-bord aansluiten. Laten we een bibliotheek schrijven voor zo'n ontwerp.

Categorie: . U kunt er een bladwijzer van maken.

In het artikel van vandaag zullen we het hebben over 7-segmentindicatoren en hoe je "vrienden kunt maken" met Arduino. Er zijn verschillende opties. De gemakkelijkste is natuurlijk om naar toe te gaan en koop een kant-en-klare indicator met een geïntegreerd schild (zo wordt de bijpassende kaart genoemd), maar we zijn niet op zoek naar gemakkelijke manieren, dus we zullen een iets moeilijker pad volgen. Beginners - wees niet ongerust, dit artikel is net als mijn vorige artikelen ( En ) speciaal voor jou. Laat de goeroes voor dezelfde ervaren goeroes schrijven, en ik ben een beginner - ik schrijf voor beginners.

Waarom een ​​7-segmentindicator? Er zijn tenslotte zoveel verschillende schermen, met een groot aantal tekens, lijnen, verschillende diagonalen en resoluties, zwart en wit en kleur, waarvan de meest betaalbare een paar dollar kosten... En hier: de “oude” één, schandalig eenvoudig, maar vereist een groot aantal pinnen 7-segmentindicator, maar toch heeft deze "oude man" ook een voordeel. Feit is dat je met behulp van de hier gegeven schetsen niet alleen een indicator met een cijferhoogte van 14 mm kunt doen herleven, maar ook serieuzere (zij het zelfgemaakte) projecten, en de metercijfers zijn in dit geval verre van de limiet. Voor inwoners van de hoofdsteden is dit misschien niet zo interessant, maar de bevolking van Novokatsapetovka of Nizhnyaya Kedrovka zal heel blij zijn als er bij een club of dorpsraad een klok verschijnt die ook de datum en temperatuur kan weergeven, en ze zullen praten over de maker van deze klok voor een zeer lange tijd. Maar dergelijke horloges zijn het onderwerp van een apart artikel: bezoekers zullen het willen - Ik zal schrijven. Alles wat hierboven is geschreven, kan als een inleiding worden beschouwd. Net als mijn vorige artikel zal dit artikel uit delen bestaan, dit keer in tweeën. In het eerste deel zullen we de indicator eenvoudigweg 'beheren', en in het tweede deel zullen we proberen hem aan te passen voor iets dat op zijn minst een beetje nuttig is. Dus laten we doorgaan:

Deel één. Experimenteel - educatief

De basis voor dit project is de ARDUINO UNO, die ons al bekend is uit eerdere artikelen. Laat me je eraan herinneren dat de gemakkelijkste manier om het te kopen hier is: of hier: Bovendien heeft u een indicator met 4 cijfers en 7 segmenten nodig. Ik heb in het bijzonder GNQ-5641BG-11. Waarom deze? Ja, simpelweg omdat ik hem 5 jaar geleden per ongeluk kocht, ik te lui was om hem te vervangen, dus hij lag al die tijd in de coulissen te wachten. Ik denk dat iedereen met een gemeenschappelijke anode het zal doen (en met een gemeenschappelijke kathode is het mogelijk, maar je zult de arraygegevens en andere poortwaarden moeten omkeren - dat wil zeggen, ze veranderen in de tegenovergestelde), zolang het is niet te krachtig om de Arduino niet te verbranden. Bovendien kunnen 4 stroombegrenzende weerstanden, elk ongeveer 100 Ohm, en een stuk kabel (10 cm was genoeg voor mij) voor 12 pinnen (kernen) van de bredere worden "afgescheurd", wat ik deed. Of je kunt ze zelfs met afzonderlijke draden solderen, er zullen geen problemen zijn. Je hebt ook pinnen voor het bord nodig (11 stuks), maar als je voorzichtig bent, kun je het ook zonder doen. Een schets van de indicator is te zien in figuur 1, en het diagram in figuur 2. Ik zal ook opmerken dat het beter is om niet meer dan 2,1 V aan elk segment van deze indicator te leveren (beperkt door weerstanden van 100 ohm), en in dit geval zal het niet meer dan 20 mA verbruiken. Als het cijfer “8” oplicht, zal het verbruik niet hoger zijn dan 7x20=140 mA, wat zeer acceptabel is voor Arduino-uitgangen. Een nieuwsgierige lezer zal de vraag stellen: “Maar 4 ontladingen van elk 140 mA is al 4x140 = 560 mA, en dit is al te veel!” Ik zal antwoorden - er zullen er nog 140 over zijn. Hoe? Lees verder! De locatie van de pinnen op de indicator is te zien in figuur 3. En we maken de verbinding volgens tabel 1.


Rijst. 1 - Indicatorschets


Rijst. 2 - Indicatorcircuit


Rijst. 3 - Pinlocatie

Tabel 1

Pin Arduino Uno

Indicatorpen

Opmerking

Segment G

Segment F

Segment E

Segment D

Segment C

Segment B

Segment A

De gemeenschappelijke anode van segment nr. 1 wordt aangesloten via een weerstand van 100 Ohm.

De gemeenschappelijke anode van segment nr. 2 wordt aangesloten via een weerstand van 100 Ohm.

De gemeenschappelijke anode van segment nr. 3 wordt aangesloten via een weerstand van 100 Ohm.

De gemeenschappelijke anode van segment nr. 6 wordt aangesloten via een weerstand van 100 Ohm.



We vullen een eenvoudige schets in, een eenvoudige “teltafel” van 0 tot 9:


Nu even wat verduidelijking. DDRD is een register van poort D (DDRB - respectievelijk poort B) achter het "eng" woord "register" bevindt zich slechts een "verborgen" functie die aangeeft of de poort iets zal lezen met zijn pin (informatie ontvangen), of vice versa versa zal het mogelijk zijn om daar iets te doen en dan te schrijven (informatie te geven). In dit geval is de regel DDRD=B11111111; geeft aan dat alle pinnen van poort D worden uitgevoerd, d.w.z. er zal informatie uit komen. De letter “B” betekent dat er een binair getal naar het register wordt geschreven. Een ongeduldige lezer zal onmiddellijk vragen: “Is decimaal mogelijk!?!” Ik haast me om u gerust te stellen dat het mogelijk is, maar daarover later meer. Als we de helft van de poort voor invoer en de helft voor uitvoer willen gebruiken, kunnen we dit als volgt specificeren: DDRD=B11110000; de één toont de pinnen die informatie zullen verspreiden, en de nullen tonen de pinnen die deze informatie zullen ontvangen. Het belangrijkste gemak van het register ligt ook in het feit dat u niet alle pinnen 8 keer hoeft te registreren, d.w.z. we slaan 7 regels op in het programma. Laten we nu eens naar de volgende regel kijken:

POORTB=B001000; // zet pin 11 van poort B hoog

PORTB is het gegevensregister van poort B, d.w.z. Door er een getal in te schrijven, geven we aan welke pin van de poort een één zal hebben en welke een nul zal hebben. Als aanvulling op de opmerking wil ik zeggen dat als je de Arduino Uno zo neemt dat je de controller en de digitale pinnen bovenaan kunt zien, de invoer in het register duidelijk zal zijn, d.w.z. welke “nul” (of “één”) correspondeert met welke pin, d.w.z. de meest rechtse nul van poort B is verantwoordelijk voor de 8e pin, en de meest linkse is voor de 13e (die een ingebouwde LED heeft). Voor poort D is respectievelijk de rechter voor pin 0, de linker voor pin 7.
Ik hoop dat na zulke gedetailleerde uitleg alles duidelijk is, maar aangezien het duidelijk is, stel ik voor om terug te keren naar het decimale getallensysteem dat ons sinds onze kindertijd bekend en geliefd is. En nog een ding: een schets van 25 regels lijkt misschien klein, maar voor een beginner is het nog steeds enigszins omslachtig. Wij zullen het verminderen.

Laten we een nog eenvoudiger schets invullen, dezelfde “teltafel”:


Video 1.
Slechts 11 regels! Dit is onze manier, de “newbie-manier”! Houd er rekening mee dat in plaats van binaire getallen decimale getallen in de registers worden geschreven. Voor decimale getallen zijn er uiteraard geen letters voor nodig. Ik denk dat het geen kwaad zou kunnen om alle getallen in tabellen te zetten.

Tabel 2. Correspondentie van het weergegeven teken met de poortgegevens

Gemeenschappelijke anode

Gemeenschappelijke kathode

Binair systeem

Decimaal systeem

Binair systeem

Decimaal systeem

Tabel 3. Correspondentie van het weergegeven cijfer met de poortgegevens

Gemeenschappelijke anode

Gemeenschappelijke kathode

Binair systeem

Decimaal systeem

Binair systeem

Decimaal systeem



Aandacht! De gegevens in tabellen 2 en 3 zijn alleen geldig bij bedrading volgens tabel 1.
Laten we nu een schets uploaden met een “teltabel” van 0 tot 9999:




Rijst. 4 - Teltafel

Je kunt de schets in actie zien opVideo 2.

Er zijn meer opmerkingen in deze schets dan er code zelf is. Er mogen geen vragen zijn... Naast één ding: wat voor soort ‘flikkercyclus’ is dit, wat flikkert daar strikt genomen en waarom? En daar is ook een soort variabele voor...
En het hele punt is dat de segmenten met dezelfde naam van alle vier de categorieën op één punt met elkaar verbonden zijn. A1, A2, A3 en A4 hebben een gemeenschappelijke kathode; A1, B1,…..G1 gemeenschappelijke anode. Dus door tegelijkertijd “1234” toe te passen op de 4-cijferige indicator, krijgen we “8888” en zullen we hierover zeer verrast zijn. Om dit te voorkomen, moet u eerst “1” in uw categorie oplichten, vervolgens uitschakelen, vervolgens “2” in uw categorie oplichten, enz. Als je dit heel snel doet, zullen de flikkeringen van de cijfers samensmelten, zoals frames op een film, en zal het oog het praktisch niet opmerken. En de maximale waarde van de flikkerende variabele bepaalt in dit geval de snelheid van het veranderen van cijfers op de indicator. Trouwens, het is juist dankzij dit "flikkeren" dat het maximale stroomverbruik slechts 140 mA is, in plaats van 560. Nu stel ik voor om verder te gaan met iets nuttigers.

Deel twee. In ieder geval een beetje nuttig

In dit deel zullen we karakters van een personal computer uitvoeren naar een 7-segmentindicator met behulp van ARDUINO MEGA. Waarom ontstond plotseling het idee van “paarden wisselen op de oversteek”? Er zijn twee redenen: ten eerste had ik ARDUINO MEGA nog nooit eerder in mijn artikelen overwogen; en ten tweede ben ik er in ARDUINO UNO nog steeds niet achter hoe ik de COM-poort en poort D dynamisch kan verwisselen. Maar ik ben een nieuweling - het kan mij vergeven worden. Uiteraard kunt u deze controller hier aanschaffen: . Om het plan uit te voeren, moest ik een soldeerbout pakken en de kabel vanaf de Arduino-kant opnieuw solderen, en ook een nieuwe schets schrijven. Je kunt zien hoe de kabel is gesoldeerd in Figuur 5. Het punt is dat ARDUINO MEGA en ARDUINO UNO verschillende poortpinouts hebben, en Mega heeft veel meer poorten. De overeenkomst tussen de gebruikte pinnen is te zien in Tabel 4.



Rijst. 5 - Nieuwe kabelbedrading

Tabel 4

Haven Mega


Aandacht! Deze tabel is alleen geldig voor dit project!

Merk ook op dat poort C van de Arduino Mega “start” vanaf pin 37 en dan in aflopende volgorde, en poort A begint vanaf pin 22 en dan in oplopende volgorde.



Rijst. 6 - Algemeen beeld



Kleine implementatiekenmerken: we zullen 4 karakters uitvoeren. De tekens moeten cijfers zijn. Als je “1234” hebt ingevoerd en we zien “1234”, als je “123456” hebt ingevoerd, zien we nog steeds “1234”, als je “ytsuk”, “fyva1234”, “otiog485909oapom” hebt ingevoerd, zullen we niets zien. Als u “pp2345mm” heeft ingevoerd, zien we “23”, d.w.z. kleine, ingebouwde “foolproofing”.

De daadwerkelijke schets:



Hoe dit programma werkt, kunt u zien opVideo 3.



Recensie opgesteld door Pavel Sergeev


Aansluitschema voor een ééncijferige zevensegmentindicator
Aansluitschema voor een meercijferige zevensegmentindicator

Digitaal informatieweergaveapparaat. Dit is de eenvoudigste implementatie van een indicator die Arabische cijfers kan weergeven. Complexere multi-segment- en matrixindicatoren worden gebruikt om letters weer te geven.

Zoals de naam al zegt, bestaat het uit zeven display-elementen (segmenten) die afzonderlijk aan en uit gaan. Door ze in verschillende combinaties op te nemen, kunnen ze worden gebruikt om vereenvoudigde afbeeldingen van Arabische cijfers te maken.
De segmenten worden aangeduid met de letters A tot en met G; achtste segment - decimaalpunt (decimale punt, DP), ontworpen om fractionele getallen weer te geven.
Af en toe worden letters weergegeven op de uit zeven segmenten bestaande indicator.

Ze zijn verkrijgbaar in verschillende kleuren, meestal wit, rood, groen, geel en blauw. Bovendien kunnen ze verschillende afmetingen hebben.

Ook kan de LED-indicator uit één cijfer bestaan ​​(zoals in de afbeelding hierboven) of uit meerdere cijfers bestaan. In principe worden in de praktijk één-, twee-, drie- en viercijferige LED-indicatoren gebruikt:

Naast tien cijfers kunnen indicatoren met zeven segmenten ook letters weergeven. Maar weinig letters hebben een intuïtieve weergave van zeven segmenten.
In het Latijn: hoofdletter A, B, C, E, F, G, H, I, J, L, N, O, P, S, U, Y, Z, kleine letters a, b, c, d, e, g , h, ik, n, o, q, r, t, u.
In Cyrillisch: A, B, V, G, g, E, i, N, O, o, P, p, R, S, s, U, Ch, Y (twee cijfers), b, E/Z.
Daarom worden indicatoren met zeven segmenten alleen gebruikt om eenvoudige berichten weer te geven.

In totaal kan de uit zeven segmenten bestaande LED-indicator 128 tekens weergeven:

Een typische LED-indicator heeft negen aansluitingen: één gaat naar de kathodes van alle segmenten en de andere acht gaan naar de anode van elk segment. Dit schema heet "gemeenschappelijk kathodecircuit", er zijn ook regelingen met gemeenschappelijke anode(dan is het andersom). Vaak worden er niet één, maar twee gemeenschappelijke aansluitingen gemaakt aan verschillende uiteinden van de basis - dit vereenvoudigt de bedrading zonder de afmetingen te vergroten. Er zijn ook zogenaamde 'universele', maar die ben ik persoonlijk niet tegengekomen. Daarnaast zijn er indicatoren met een ingebouwd schuifregister, waardoor het aantal betrokken microcontrollerpoortpinnen aanzienlijk wordt verminderd, maar deze zijn veel duurder en worden in de praktijk zelden gebruikt. En omdat de onmetelijkheid niet te vatten is, zullen we dergelijke indicatoren voorlopig niet in overweging nemen (maar er zijn ook indicatoren met een veel groter aantal segmenten, matrix-segmenten).

Meercijferige LED-indicatoren werken vaak volgens een dynamisch principe: de uitgangen van de segmenten met dezelfde naam van alle cijfers zijn met elkaar verbonden. Om informatie over een dergelijke indicator weer te geven, moet de besturingsmicroschakeling cyclisch stroom leveren aan de gemeenschappelijke aansluitingen van alle cijfers, terwijl stroom wordt geleverd aan de segmentaansluitingen, afhankelijk van of een bepaald segment oplicht in een bepaald cijfer.

Een ééncijferige indicator met zeven segmenten aansluiten op een microcontroller

Het onderstaande diagram laat zien hoe er is een uit één cijfer bestaande indicator met zeven segmenten aangesloten naar de microcontroller.
Er moet rekening mee worden gehouden dat als de indicator met GEMEENSCHAPPELIJKE KATHODE, waarna de gemeenschappelijke uitgang ervan wordt verbonden "aarde", en de segmenten worden ontstoken door te voeren logische eenheid naar de poortuitgang.
Als de indicator dat is GEMEENSCHAPPELIJKE ANODE, vervolgens wordt het aan de gemeenschappelijke draad geleverd "plus" spanning, en de segmenten worden ontstoken door de poortuitgang naar de status te schakelen logische nul.

Indicatie in een LED-indicator met één cijfer wordt uitgevoerd door een binaire code toe te passen op de pinnen van de microcontrollerpoort van het overeenkomstige cijfer van het overeenkomstige logische niveau (voor indicatoren met OK - logische, voor indicatoren met OA - logische nullen).

Stroombegrenzende weerstanden kan wel of niet aanwezig zijn in het diagram. Het hangt allemaal af van de voedingsspanning die aan de indicator wordt geleverd en de technische kenmerken van de indicatoren. Als de aan de segmenten geleverde spanning bijvoorbeeld 5 volt is en ze zijn ontworpen voor een bedrijfsspanning van 2 volt, dan moeten stroombegrenzende weerstanden worden geïnstalleerd (om de stroom er doorheen te beperken voor een verhoogde voedingsspanning en niet te verbranden niet alleen de indicator, maar ook de microcontrollerpoort).
Het is heel eenvoudig om de waarde van stroombegrenzende weerstanden te berekenen met behulp van de formule van grootvader Ohm.
De kenmerken van de indicator zijn bijvoorbeeld als volgt (overgenomen uit het gegevensblad):
— bedrijfsspanning — 2 volt
— bedrijfsstroom — 10 mA (=0,01 A)
— voedingsspanning 5 volt
Formule voor berekening:
R= U/I (alle waarden in deze formule moeten in Ohm, Volt en Ampère zijn)
R= (voedingsspanning - bedrijfsspanning)/bedrijfsstroom
R= (5-2)/0,01 = 300 Ohm

Aansluitschema voor een meercijferige LED-indicator met zeven segmenten In principe hetzelfde als bij het aansluiten van een eencijferige indicator. Het enige is dat er stuurtransistors worden toegevoegd in de kathodes (anodes) van de indicatoren:

Het is niet in het diagram weergegeven, maar tussen de bases van de transistors en de pinnen van de microcontrollerpoort moeten weerstanden worden opgenomen, waarvan de weerstand afhangt van het type transistor (de weerstandswaarden worden berekend, maar je kunt ook proberen weerstanden te gebruiken met een nominale waarde van 5-10 kOhm).

Indicatie door lozingen gebeurt dynamisch:
— de binaire code van het overeenkomstige cijfer wordt ingesteld op de uitgangen van de PB-poort voor het eerste cijfer, waarna het logische niveau wordt toegepast op de stuurtransistor van het eerste cijfer
— de binaire code van het overeenkomstige cijfer wordt ingesteld op de uitgangen van de PB-poort voor het tweede cijfer, waarna het logische niveau wordt toegepast op de stuurtransistor van het tweede cijfer
— de binaire code van het overeenkomstige cijfer wordt ingesteld op de uitgangen van de PB-poort voor het derde cijfer, waarna het logische niveau wordt toegepast op de stuurtransistor van het derde cijfer
- dus in een cirkel
In dit geval is het noodzakelijk om rekening te houden met:
— voor indicatoren met OK Er wordt gebruik gemaakt van een regeltransistorstructuur NPN(bestuurd door logische eenheid)
- voor indicator met OA- structuurtransistor PNP(bestuurd door logische nul)

LED-indicatoren met zeven segmenten zijn erg populair onder apparaten voor digitale waardeweergave en worden gebruikt in de frontpanelen van magnetrons, wasmachines, digitale klokken, tellers, timers, enz. Vergeleken met LCD-indicatoren gloeien LED-indicatorsegmenten helder en zijn zichtbaar over over grote afstand en in een brede kijkhoek. Om een ​​4-bits indicator met zeven segmenten op een microcontroller aan te sluiten, zijn minimaal 12 I/O-lijnen nodig. Daarom is het bijna onmogelijk om deze indicatoren te gebruiken met microcontrollers met een klein aantal pinnen, bijvoorbeeld series van het bedrijf. Natuurlijk kun je verschillende multiplexmethoden gebruiken (waarvan je een beschrijving kunt vinden op de website in de sectie 'Schema's'), maar zelfs in dit geval zijn er bepaalde beperkingen voor elke methode en maken ze vaak gebruik van complexe software-algoritmen.

We zullen kijken naar de methode om een ​​indicator aan te sluiten via de SPI-interface, waarvoor slechts 3 I/O-lijnen van de microcontroller nodig zijn. In dit geval blijft de controle over alle indicatorsegmenten bestaan.

Om een ​​4-bits indicator via de SPI-bus met een microcontroller te verbinden, wordt een gespecialiseerde driverchip gebruikt die door het bedrijf wordt geproduceerd. De microschakeling kan acht indicatoren met zeven segmenten aansturen met een gemeenschappelijke kathode en omvat een BCD-decoder, segmentdrivers, een multiplexcircuit en statisch RAM voor het opslaan van cijferwaarden.

De stroom door de indicatorsegmenten wordt ingesteld met slechts één externe weerstand. Bovendien ondersteunt de chip controle van de helderheid van indicatoren (16 helderheidsniveaus) met behulp van ingebouwde PWM.

Het circuit dat in het artikel wordt besproken, is een displaymodulecircuit met een SPI-interface dat kan worden gebruikt in amateurradio-ontwerpen. En we zijn niet meer geïnteresseerd in het circuit zelf, maar in het werken met de microschakeling via de SPI-interface. De +5 V modulevoeding wordt geleverd aan de Vcc-pin, de MOSI-, CLK- en CS-signaallijnen zijn bedoeld voor communicatie tussen het masterapparaat (microcontroller) en de slave (MAX7219-chip).

De microschakeling wordt gebruikt in een standaardaansluiting; de enige externe componenten die nodig zijn, zijn een weerstand die de stroom door de segmenten instelt, een beveiligingsdiode voor de voeding en een filtercondensator voor de voeding.

Gegevens worden naar de chip overgebracht in pakketten van 16 bits (twee bytes), die op elke stijgende flank van het CLK-signaal in het ingebouwde 16-bits schuifregister worden geplaatst. We zullen een 16-bits pakket aanduiden als D0-D15, waarbij de bits D0-D7 gegevens bevatten, D8-D11 het registeradres en de bits D12-D15 geen betekenis hebben. Bit D15 is het meest significante bit en is het eerste bit dat wordt ontvangen. Hoewel de chip acht indicatoren kan aansturen, zullen we overwegen om met slechts vier indicatoren te werken. Ze worden bestuurd door de uitgangen DIG0 - DIG3, in volgorde van rechts naar links, de 4-bits adressen (D8-D11) die ermee corresponderen zijn 0x01, 0x02, 0x03 en 0x04 (hexadecimaal formaat). Het cijferregister wordt geïmplementeerd met behulp van on-chip RAM met een 8x8-organisatie en is direct adresseerbaar, zodat elk afzonderlijk cijfer op het display op elk moment kan worden bijgewerkt. De volgende tabel toont de adresseerbare cijfers en controleregisters van de MAX7219-chip.

Register

Adres

HEX-waarde

Geen operatie

Decodeermodus

Aantal indicatoren

Afsluiten

Indicatortest

Controle registers

De MAX1792-chip heeft 5 controleregisters: decodeermodus (Decode-Mode), controle van de indicatorhelderheid (Intensiteit), register van het aantal aangesloten indicatoren (Scan Limit), aan/uit-controle (Shutdown), testmodus (Display Test).

De chip aan- en uitzetten

Wanneer de chip van stroom wordt voorzien, worden alle registers gereset en gaat deze naar de uitschakelmodus. In deze modus is het display uitgeschakeld. Om naar de normale bedrijfsmodus te gaan, moet bit D0 van het Shutdown-register (adres 0Сh) worden ingesteld. Dit bit kan op elk moment worden gewist om de driver te dwingen uit te schakelen, waardoor de inhoud van alle registers ongewijzigd blijft. Deze modus kan worden gebruikt om energie te besparen of in alarmmodus door de indicator te laten knipperen (opeenvolgende activering en deactivering van de Shutdown-modus).

De microschakeling wordt naar de uitschakelmodus geschakeld door achtereenvolgens het adres (0Сh) en de gegevens (00h) te verzenden, en door de overdracht van 0Ch (adres) en vervolgens 01h (gegevens) terug te keren naar de normale werking.

Decodeermodus

Met behulp van het (adres 09h) kunt u BCD-code B-decodering gebruiken (weergavetekens 0-9, E, H, L, P, -) of zonder decodering voor elk cijfer. Elke bit in het register komt overeen met één cijfer, het instellen van een logisch cijfer komt overeen met het inschakelen van de decoder voor dit bit, instelling 0 betekent dat de decoder is uitgeschakeld. Als er een BCD-decoder wordt gebruikt, wordt alleen rekening gehouden met de laagste hoeveelheid gegevens in de cijferregisters (D3-D0), bits D4-D6 worden genegeerd, bit D7 is niet afhankelijk van de BCD-decoder en is verantwoordelijk voor het inschakelen de komma op de indicator als D7 = 1. Als bytes 02h en 05h bijvoorbeeld achtereenvolgens worden verzonden, geeft de DIG1-indicator (tweede cijfer van rechts) het getal 5 weer. Op dezelfde manier geeft de DIG0-indicator bij het verzenden van 01h en 89h het getal 9 weer, inclusief de komma. . De onderstaande tabel toont een volledige lijst met tekens die worden weergegeven bij gebruik van de BCD-decoder van het IC.

Symbool

Gegevens in registers

Ingeschakelde segmenten = 1

Leeg

*De komma wordt ingesteld door bit D7=1

Wanneer de BCD-decoder van werking wordt uitgesloten, komen de databits D7-D0 overeen met de segmentlijnen (A-G en DP) van de indicator.

Controle van de helderheid van de indicatoren

Met de chip kunt u de helderheid van de indicatoren programmatisch regelen met behulp van de ingebouwde PWM. De PWM-uitgang wordt bestuurd door de lage orde nibble (D3-D0) van het intensiteitsregister (adres 0Ah), waarmee u een van de 16 helderheidsniveaus kunt instellen. Wanneer alle bits van een nibble op 1 zijn ingesteld, wordt de maximale helderheid van de indicator geselecteerd.

Aantal aangesloten indicatoren

Het Scan-Limit-register (adres 0Bh) stelt de waarde in van het aantal bits dat door de microschakeling wordt bediend (1 ... 8). Voor onze 4-bits versie moet de waarde 03h naar het register worden geschreven.

Indicatortest

Het register dat verantwoordelijk is voor deze modus bevindt zich op adres 0Fh. Door de D0-bit in het register in te stellen, schakelt de gebruiker alle indicatorsegmenten in, terwijl de inhoud van de besturings- en dataregisters niet verandert. Om de Display-Test-modus uit te schakelen, moet bit D0 0 zijn.

Interface met microcontroller

De indicatormodule kan worden aangesloten op elke microcontroller die over drie vrije I/O-lijnen beschikt. Als de microcontroller een ingebouwde SPI-hardwaremodule heeft, kan de indicatormodule als slave-apparaat op de bus worden aangesloten. In dit geval kunnen de SPI-signaallijnen SDO (seriële data uit), SCLK (seriële klok) en SS (slave select) van de microcontroller rechtstreeks worden aangesloten op de MOSI-, CLK- en CS-pinnen van de MAX7219-chip (module), de CS-signaal is actief laag.

Als de microcontroller geen hardware-SPI heeft, kan de interface softwarematig worden georganiseerd. De communicatie met de MAX7219 begint door de CS-lijn laag te trekken en laag te houden, en vervolgens 16 bits aan gegevens opeenvolgend (MSB eerst) op de MOSI-lijn op de stijgende flank van het CLK-signaal te verzenden. Na voltooiing van de transmissie wordt de CS-lijn weer hoog.

In de downloadsectie kunnen gebruikers de brontekst van het testprogramma en het HEX-bestand van de firmware downloaden, die een conventionele 4-bits teller implementeert met weergave van waarden op een indicatormodule met een SPI-interface. De gebruikte microcontroller is een in software geïmplementeerde interface, de signaallijnen CS, MOSI en CLK van de indicatormodule zijn respectievelijk aangesloten op de poorten GPO, GP1 en GP2. Er wordt gebruik gemaakt van de mikroC-compiler voor PIC-microcontrollers (mikroElektronika

Om commentaar te geven op materiaal van de site en volledige toegang te krijgen tot ons forum, hebt u dit nodig register .