Stap 3: Tijd om Code!
Onderhand wellicht hebt u een idee van hoe u uw programma op basis van uw schema zal code.Om te beginnen u, is hier een eenvoudige schets die 456 met decimaal wilt weergeven in een tijdvertraging manier om aan te tonen multiplexing. Ik heb het ook flexibel om verschillende configuraties hebt. De broncode is ook beschikbaar op de bodem om te downloaden. Zorg ervoor dat de code eerst begrijpen en vervolgens te kopiëren en te plakken in een nieuwe schets. Vervolgens de nodige aanpassingen aan de variabelen en de pin-toewijzingen in uw situatie anders kan zijn. Zodra gedaan, uploaden naar de Arduino.
Één ding die u zou moeten opmerken is de richting van de gegevensstroom. Als u zich mijn schema herinnert, links meest shift register de eerste byte ontvangt, maar die gegevens uit de SER OUT zal dumpen als er een ander byte wordt ontvangen. Zo, als u verzenden 11111111 naar het meest rechtse cijfer wilt, u zou moeten verschuiven uit 11111111 dan 00000000 en ten slotte 00000000. Maak je geen zorgen, dit wordt automatisch afgehandeld door de code.
BEGIN CODE
/*
Code voor interfacing met 7 segment displays
multiplexing methode
en de TPIC6B595 Shift Register (1 per cijfer)
Door K.O.
*/
Pin-toewijzingen (u mag dit wijzigen)
Const int CLK = 9; Aangesloten op TPIC pin 13: SRCLK (aka klok)
Const int klink = 10; Aangesloten op TPIC pin 12: RCLK (aka Latch/belasting/CS/SS...)
Const int OE = 11; Aangesloten op TPIC pin 9: OE (uitvoer inschakelen)
Const int DOUT = 12; Aangesloten op TPIC pin 3: SER (aka MOSI)
Aantal patronen (0-9)
Riool 0-7 moeten worden verbonden met segmenten A-DP respectievelijk ***
Const byte numTable [] =
{
B11111100,
B01100000,
B11011010,
B11110010,
B01100110,
B10110110,
B10111110,
B11100000,
B11111110,
B11110110
};
Globale variabelen
int numDevices = 1; Het aantal x-cijferige display modules u wilt gebruiken
int maxDisplays = 3; De maximale beeldschermen die kunnen worden ingepast (zie opmerking 1)
int maxDigits = 3; De maximale cijfers die u van plan bent over het weergeven van weergeven module (elke SR kan omgaan met een maximum van 8 cijfers)
int SRData [3] [3]; De opslagplaats voor de informatie van de cijfers. We moeten een vaste matrix opgeven tijdens het compileren (zie noot 2)
Booleaanse debug = true; Op true voor het afdrukken van berichten wijzigen
int delayTime = 1000; Optioneel (net voor het aantonen van multiplexing)
/*
Notities
1. het is aanbevolen om het gebruik van een externe voeding te vermijden oversource/zinken de microcontroller
of wilt u hoge netspanning, hoge stroom weergegeven. Deze code zal Hiermee schakelt u alle segmenten in een cijfer voor *** elke *** weergeven.
Dus, als met behulp van 2 x 3-cijferig weergegeven van alle tonen een 8 + DP, het max verbruik zal zijn:
20mA (gewenst voorwaarts lopende) * 8 (segmenten die op) * 2 (displays identiek info tonen) = 320mA
2. de eerste dimensie moet gelijk zijn aan maxDisplays. De tweede dimensie moet gelijk zijn aan het aantal cijfers
*/
VOID Setup
{
Serial.begin(9600);
Set pin modi
pinMode(CLK,OUTPUT);
pinMode(LATCH,OUTPUT);
pinMode (DOUT, uitvoer);
pinMode (OE, uitvoer);
7-segment Display Init
digitalWrite(OE,LOW); Maakt SR bediening mogelijk
initializeSRData(); SR bereidt en wist u gegevens over een seriële lijn
Test
setDigit(0,0,4,true);
setDigit(0,1,5,true);
setDigit(0,2,6,true);
}
void loop
{
refreshDisplay(); Doorlopen alle displays en cijfers
}
=== BEGIN SR functies ===
VOID initializeSRData()
{
Scanner (Iterates via elke vertoningsmodule) weergeven
digitalWrite(LATCH,LOW); Alle SRs vertelt dat uController is het verzenden van gegevens
voor (int dispID = 0; dispID < maxDisplays; dispID ++)
{
Cijfer Scanner (Iterates via elke SR (digit) in een weergave-module)
voor (int cijfer = 0; cijfer < maxDigits; cijfer ++)
{
Hiermee wist u alle vuilnis op de seriële lijn
shiftOut(DOUT,CLK,LSBFIRST,0); Verschuiving uit 0s naar alle beeldschermen
SRData [dispID] [cijfer] = 0; Slaat dus een 0 voor elk cijfer zijn volledig weg
}
}
digitalWrite(LATCH,HIGH); Alle SRs vertelt dat uController gebeurt verzenden gegevens
}
VOID printSRData()
{
if(!debug)
terugkeer;
Serial.println ("afdrukken SR Data...");
Scherm Scanner
voor (int dispID = 0; dispID < maxDisplays; dispID ++)
{
Serial.Print ("Toon #");
Serial.println(dispID);
Cijfer Scanner
voor (int cijfer = 0; cijfer < maxDigits; cijfer ++)
{
Serial.Print ("cijfers");
Serial.Print(DIGIT);
Serial.Print(":");
Serial.println(SRData[dispID][Digit],bin);
}
Serial.println();
}
}
VOID setDigit (int dispID, int cijfer, int waarde, Booleaanse dp)
{
Met de parameter checker
Als (dispID < 0 || dispID > = numDevices)
{
Serial.println ("dispID OoB!"); OoB = out of bounds
terugkeer;
}
Als (cijfer < 0 || cijfers > maxDigits)
{
Serial.println ("cijfers OoB!");
terugkeer;
}
Als (waarde < 0 || waarde > 9)
{
Serial.println ("ongeldige waarde!");
terugkeer;
}
waarde = numTable [waarde];
Toggle dp indien nodig
if(DP)
waarde | = B00000001; Hiermee schakelt u de eerste binary digit (segment) met behulp van een OR-bitmasker
Winkel het cijfer
SRData [dispID] [cijfer] = waarde;
if(debug)
printSRData();
}
VOID setSegments (int dispID, int cijfer, bytewaarde)
{
Met de parameter checker
Als (dispID < 0 || dispID > = numDevices)
{
Serial.println ("dispID OoB!");
terugkeer;
}
Als (cijfer < 0 || cijfers > maxDigits)
{
Serial.println ("cijfers OoB!");
terugkeer;
}
Als (waarde < 0 || waarde > 255)
{
Serial.println ("ongeldige byte!");
terugkeer;
}
Winkel het cijfer
SRData [dispID] [cijfer] = waarde;
if(debug)
printSRData();
}
VOID clearDisplay(int dispID)
{
initializeSRData();
refreshDisplay();
}
VOID refreshDisplay()
{
Cijfer Scanner
voor (int cijfer = 0; cijfer < maxDigits; cijfer ++)
{
Scherm Scanner
digitalWrite(LATCH,LOW);
voor (int dispID = numDevices - 1; dispID > = 0; dispID--)
{
Pre cijfer blanker (verschuivingen uit 0s cijfers corrigeren voordat segmentgegevens naar gewenste cijfer)
voor (int leeg = (maxDigits - 1 - cijfer); spaties > 0; spaties--)
shiftOut(DOUT,CLK,LSBFIRST,0);
shiftOut(DOUT,CLK,LSBFIRST,SRData[dispID][digit]);
Na cijfers blanker (verschuivingen uit 0s tot resterende cijfers)
voor (int leeg = cijfer; spaties > 0; spaties--)
shiftOut(DOUT,CLK,LSBFIRST,0);
}
digitalWrite(LATCH,HIGH);
Toont multiplexing operatie
delay(delayTime);
delayTime-= 10;
Als (delayTime < = 0)
delayTime = 0;
}
}
=== EINDE SR functies ===
EINDE CODE