Dit is slechts een kleine instructable om mensen snel met een 7 segment display zeggen een Arduino of andere microcontroller te helpen. Deze schermen nodig 8 datalines en dat is een beetje veel te offeren op meeste microcontrollers, dus er een betere manier is: met behulp van een HC595 of HCT595 shift register. In dat geval moet de weergave slechts 3 data lijnen.
Nu kan het een beetje ontmoedigend voor de beginner om erachter te komen welke pinnen te verbinden met wat en vervolgens hoe je de juiste nummers aan het licht omhoog, maar als u zich aan enkele basisregels, het is vrij eenvoudig. (Opmerking. meeste plaatsen ik controleerde de HCT595 is aanzienlijk duurder dan de HC595, tenzij u echt behoefte/willen/hebben de HCT-versie, kies de HC versie.)
Voor een ding... het maakt niet echt uit wat pinnen van het 7 segment display u verbinding maakt met de datapins van de 595, want u het allemaal in de programma-code uitzoeken kunt, maar het is het makkelijkst te houden aan enkele standaard aansluitingen.
Als u het diagram van het display kijkt, ziet u dat de segmenten een min of meer gestandaardiseerde naam hebben: A-G en DP. Als u verbinding maakt met de 595 als volgt:
Q0 -> A
Q1 -> B
Q2 -> C
Q3 -> D
Q4 -> E
Q5 -> F
Q6 -> G
Q7 -> DP
vervolgens wordt ook de codering gestandaardiseerd.
Bepalen welke pin correspondeert met welke segment wordt snel gedaan met een multi meter, net als tot de oprichting van hebt u een gemeenschappelijke kathode of gemeenschappelijke anode display. Een blik op de achterkant is meestal vertelt al u wat de gemeenschappelijke verbinding. Heel vaak is dit de middelste pin op de boven- en onderkant.
Als de 7 segment nemen display - zoals LED's - niet echt de volledige 5 volt van de meeste micro controllers, een weerstand in elke regel noodzakelijk is. Ik gebruik de 470 Ohm. Het IS mogelijk om te gebruiken slechts één weerstand in de gemeenschappelijke gedragslijn, maar dan de lichtintensiteit zal verschillen afhankelijk van de hoeveelheid segmenten actief.
Dit alles is gemakkelijk om te solderen op sommige perf-bord zoals in de foto zien, uiteraard indien uw pin lay-out van de mijne verschilt, je moet de verbindingen... wijzigen of een andere waarde verzenden met de HC595. Het circuit dat ik gaf is voor een gemeenschappelijke kathode-weergave, maar natuurlijk voor een gemeenschappelijke weergave van de anode het principe is hetzelfde, zij het dat een verbindt de gemeenschappelijke anode naar + Vcc.
De code is nogal duidelijk. Uiteraard kan niet stuur een '0' of '9' teken naar het display om de gewenste nummers. Elk getal vereist een specifieke hoeveelheid segmenten zodat ze oplichten en dat komt overeen met specifieke poorten van de 595 hoog of laag. Dus bijvoorbeeld voor de '8' moet u alle segmenten aan lijn, met uitzondering van het decimaalteken en volgens onze gestandaardiseerde manier van verbinden, waarvoor het nummer 127 te sturen naar de 595 (127 = 01111111 = alle segmenten behalve dp). Als u wilt dat de '8' en de DP, stuur het nummer 255.
Dus is de makkelijkste om gewoon instellen op een matrix met de vereiste waarden voor elk nummer en gebruikt u het nummer als een index aan die array. Dus als u wilt dat een '0' u lid '0' uit de matrix (dat is 63), voor de 1 u lid 1 uit de matrix (dat is de waarde 6) enz.
Wilt u het digitale punt ook oplichten, voeg '128' op de waarde die wordt verzonden.
The coding then is as follows /* Using the 74HC595 shift register with a 7 segment display */ int latchpin = 5;// connect to pin 12 on the '595 int clockpin = 7; // connect to pin 11 on the '595 int datapin = 6; // connect to pin 14 on the '595 // the array contains the binary value to make digits 0-9// uncomment the proper line for common cathode or common anode int segment[10] = {63,6,91,79,102,109,125,7,127,111 }; // for common cathode //int segment[10] = {192,249,164,176,153,146,130,248,128,144 }; // for common anode //These values are always the right ones if you follow the rule of Q0->A, Q1->B etc. void setup() { pinMode(latchpin, OUTPUT); pinMode(clockpin, OUTPUT); pinMode(datapin, OUTPUT); } void loop() { digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, MSBFIRST, 0); // clear the display digitalWrite(latchpin, HIGH); delay(1000); for (int lus=0; lus<10; lus++) // counts from 0 to 9, using the values in the array // those values correspond to the binary outputs 0~9 // to get the digital point: add 128 { digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, MSBFIRST, segment[lus]+128); digitalWrite(latchpin, HIGH); delay(800); } digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, MSBFIRST, 0); // clear the display digitalWrite(latchpin, HIGH); delay(800); digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, MSBFIRST, 128); // light the decimal point digitalWrite(latchpin, HIGH); delay(800); }