Multiplexering 7 Segment visar med Arduino och SKIFT register (3 / 5 steg)
Steg 3: Dags att koden!
Vid det här laget har du förmodligen en idé om hur du kommer koden ditt program baserat på din Schematisk.För att börja du, är här en enkel skiss som visar 456 med decimal i en tidsfördröjning sätt att demonstrera multiplexing. Jag gjorde det också flexibla att rymma olika konfigurationer som du kan ha. Källan är också tillgänglig i botten för att hämta. Var noga med att förstå koden först, och sedan kopiera och klistra in en ny skiss. Nästa, göra de nödvändiga anpassningarna till variabler och Stifttilldelningar eftersom de kan vara olika i din situation. En gång gjort, ladda upp till Arduino.
En sak du bör notera är riktningen av dataflödet. Om du minns min schematiska, vänster mest SKIFT register kommer att ta emot den första byten men kommer att dumpa det data ur SER ut om ett annat byte tas emot. Så, om du vill skicka 11111111 till höger siffran, skulle du behöva flytta ut 11111111 sedan 00000000 och slutligen 00000000. Oroa dig inte, detta hanteras automatiskt av koden.
BEGIN KOD
/*
Kod för samverkan med 7 segment visar
med metoden multiplexering
och TPIC6B595 SKIFT Register (1 per siffra)
Vid K.O.
*/
Stifttilldelningar (du bör ändra dessa)
CONST int CLK = 9. Ansluten till industriländer stift 13: SRCLK (aka klocka)
CONST int spärren = 10; Ansluten till industriländer stift 12: RCLK (aka spärr/load/CS/SS...)
CONST int OE = 11; Ansluten till industriländer pin 9: OE (Output aktiverar)
CONST int DOUT = 12. Ansluten till industriländer stift 3: SER (aka MOSI)
Antalet mönster (0-9)
Avlopp 0-7 måste vara ansluten till segment A-DP respektive ***
CONST byte numTable [] =
{
B11111100,
B01100000,
B11011010,
B11110010,
B01100110,
B10110110,
B10111110,
B11100000,
B11111110,
B11110110
};
Globala variabler
int numDevices = 1; Antalet x-siffriga Visa moduler du planerar att använda
int maxDisplays = 3; De maximala skärmar som kan tillgodoses (se anmärkning 1)
int maxDigits = 3; De högsta siffrorna som du planerar att Visa Visa modul (varje SR kan hantera ett max på 8 siffror)
int SRData [3] [3]. Lagringsplatsen för den siffra informationen. Vi måste ange ett fast utbud vid kompileringen (se not 2)
booleska debug = sant; Ändra till true för att skriva ut meddelanden
int fördröjningstid = 1000; Tillval (bara för att demonstrera multiplexing)
/*
Anteckningar
1. det rekommenderas att använda en extern strömkälla för att undvika oversource/sjunka mikrokontroller
eller om du behöver driva hög spänning, hög ström visar. Denna kod kommer att slå på/av alla segment i en siffra för *** varje *** visas.
Så, om med 2 x 3-siffriga visar alla visar en 8 + DP, max konsumtionen kommer att vara:
20mA (önskas framåt strömmen) * 8 (segment på) * 2 (skärmar visar identiska information) = 320mA
2. den första dimensionen ska vara lika maxDisplays. Den andra dimensionen bör vara lika med antalet siffror
*/
void setup()
{
Serial.BEGIN(9600);
Ställ in pinkodsskydd lägen
pinMode(CLK,OUTPUT);
pinMode(LATCH,OUTPUT);
pinMode (DOUT, OUTPUT);
pinMode (OE, OUTPUT);
7-segment Display Init
digitalWrite(OE,LOW); Möjliggör SR drift
initializeSRData(); Förbereder SR och raderar data på serial line
Test
setDigit(0,0,4,true);
setDigit(0,1,5,true);
setDigit(0,2,6,true);
}
void loop()
{
refreshDisplay(); Cykler genom alla displayer och siffror
}
=== BEGIN SR funktioner ===
void initializeSRData()
{
Visa skanner (Iterates genom varje display modul)
digitalWrite(LATCH,LOW); Berättar alla SRs att uController skickar data
för (int dispID = 0; dispID < maxDisplays; dispID ++)
{
Siffriga Scanner (Iterates genom varje SR (digit) i en display modul)
för (int siffra = 0; siffriga < maxDigits; siffriga ++)
{
Rensar alla sopor på raden följetong
shiftOut(DOUT,CLK,LSBFIRST,0); Flytta ut 0s till alla skärmar
SRData [dispID] [siffra] = 0; Lagrar en 0 för varje siffra så dess helt off
}
}
digitalWrite(LATCH,HIGH); Berättar alla SRs att uController är gjort skickar data
}
void printSRData()
{
IF(!debug)
hemkomst.
Serial.println ("utskrift SR Data...");
Display Scanner
för (int dispID = 0; dispID < maxDisplays; dispID ++)
{
Serial.Print ("Visa #");
Serial.println(dispID);
Siffriga Scanner
för (int siffra = 0; siffriga < maxDigits; siffriga ++)
{
Serial.Print ("siffran").
Serial.Print(DIGIT);
Serial.Print(":");
Serial.println(SRData[dispID][digit],bin);
}
Serial.println();
}
}
void setDigit (int dispID int siffra, int värde, booleska dp)
{
Parametern checker
om (dispID < 0 || dispID > = numDevices)
{
Serial.println ("dispID OoB!"); OoB = out of bounds
hemkomst.
}
om (siffran < 0 || siffriga > maxDigits)
{
Serial.println ("siffran OoB!").
hemkomst.
}
om (värdet < 0 || värde > 9)
{
Serial.println ("Ogiltigt värde!");
hemkomst.
}
värde = numTable [värde];
Toggle dp om det behövs
IF(DP)
värdet | = B00000001; Tänds den första binär siffra (segment) använder en bitmask som OR
Lagra siffran
SRData [dispID] [siffra] = värde;
IF(debug)
printSRData();
}
void setSegments (int dispID, int siffra, byte-värde)
{
Parametern checker
om (dispID < 0 || dispID > = numDevices)
{
Serial.println ("dispID OoB!");
hemkomst.
}
om (siffran < 0 || siffriga > maxDigits)
{
Serial.println ("siffran OoB!").
hemkomst.
}
om (värdet < 0 || värde > 255)
{
Serial.println ("Ogiltigt byte!");
hemkomst.
}
Lagra siffran
SRData [dispID] [siffra] = värde;
IF(debug)
printSRData();
}
void clearDisplay(int dispID)
{
initializeSRData();
refreshDisplay();
}
void refreshDisplay()
{
Siffriga Scanner
för (int siffra = 0; siffriga < maxDigits; siffriga ++)
{
Display Scanner
digitalWrite(LATCH,LOW);
för (int dispID = numDevices - 1; dispID > = 0; dispID--)
{
Före siffran blinkern (Skift ut 0s att korrigera siffror innan du skickar segmentet data till önskad siffra)
för (int blanks = (maxDigits - 1 - digit); blanks > 0; blanks--)
shiftOut(DOUT,CLK,LSBFIRST,0);
shiftOut(DOUT,CLK,LSBFIRST,SRData[dispID][digit]);
Efter siffran blinkern (Skift ut 0s till resterande siffror)
för (int blanks = siffran; blanks > 0; blanks--)
shiftOut(DOUT,CLK,LSBFIRST,0);
}
digitalWrite(LATCH,HIGH);
Visar multiplexering drift
Delay(delayTime);
Fördröjningstid-= 10.
om (fördröjningstid < = 0)
Fördröjningstid = 0;
}
}
=== SLUTET SR funktioner ===
END-KOD