Stap 7: Het verzenden van Bytes naar een Multiplexed LED-Matrix
De code die we gebruiken voor het verzenden van gegevens van de LED is tot nu toe een beetje onhandig om te schrijven. Het geleid tot een hoog of laag staat expliciet toe te wijzen aan elk van de pinnen van de Arduino aangesloten op een kolom. Als we program van de matrix om een ander patroon voor elk van de 8 rijen weer te geven wilden, zullen we moeten schrijven een heleboel coderegel. Hier is een manier om dingen te organiseren:
void setup(){ //set pins 6-13 as outputs and initialize HIGH for (int pinNum=6;pinNum<14;pinNum++){ pinMode(pinNum, OUTPUT); digitalWrite(pinNum, HIGH); } //set pins A0-A6 as outputs for (int pinNum=A0;pinNum<A6;pinNum++){ pinMode(pinNum, OUTPUT); } //set pins 2 and 3 as outputs for (int pinNum=2;pinNum<4;pinNum++){ pinMode(pinNum, OUTPUT); } } void loop(){ for (int pinNum=6;pinNum<14;pinNum++){ if (pinNum==8){ setStates(56); } else { setStates(0); } digitalWrite(pinNum, LOW); digitalWrite(pinNum, HIGH); } } void setStates(byte states){ zeroStates();//first turn all pins off //look at each bit of binary number and set HIGH if needed if (states & 1) digitalWrite(A0, HIGH);//check the first bit (least significant bit) if (states & 2) digitalWrite(A1, HIGH);//check the second bit if (states & 4) digitalWrite(A2, HIGH); if (states & 8) digitalWrite(A3, HIGH); if (states & 16) digitalWrite(A4, HIGH); if (states & 32) digitalWrite(A5, HIGH); if (states & 64) digitalWrite(2, HIGH); if (states & 128) digitalWrite(3, HIGH);//check the most significant bit } void zeroStates(){ digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); digitalWrite(A4, LOW); digitalWrite(A5, LOW); digitalWrite(2, LOW); digitalWrite(3, LOW); }
Herinner me hoe we een getal tussen 0 en 255 (een byte) gebruikt om in te stellen van de Staten van 8 LEDs verbonden met de 595? Ik heb nu een functie genaamd setStates() waarmee ons stellen de Staten van 8 LEDs in elke rij van de matrix van de LED met behulp van een byte toegevoegd. Het eerste wat setStates doet is alle pins aangesloten aan LED matrixkolommen laag uitschakelen alle LEDs dat mogelijk op ingesteld. Het controleert vervolgens elk binaire cijfer van de 8-cijferige byte met behulp van de & -operator; Als een van de cijfers 1 zijn, wordt de corresponderende pin HIGH.
De bovenstaande code wordt de rij aangesloten op digital pin 8 met behulp van het nummer 56 ingesteld. In binary, wordt 56 vertegenwoordigd als:
00111000
En de daaruit voortvloeiende output van de LED wordt weergegeven in de eerste afbeelding hierboven, kunt u zien dat elke 1 in het binaire getal dat correspondeert met een verlichte LED in de matrix.
Volgende proberen programmering van elke rij in de matrix LED om weer te geven van het nummer van de digitale pin die is gekoppeld:
void setup(){ //set pins 6-13 as outputs and initialize HIGH for (int pinNum=6;pinNum<14;pinNum++){ pinMode(pinNum, OUTPUT); digitalWrite(pinNum, HIGH); } //set pins A0-A6 as outputs for (int pinNum=A0;pinNum<A6;pinNum++){ pinMode(pinNum, OUTPUT); } //set pins 2 and 3 as outputs for (int pinNum=2;pinNum<4;pinNum++){ pinMode(pinNum, OUTPUT); } } void loop(){ for (int pinNum=6;pinNum<14;pinNum++){ setStates(pinNum); digitalWrite(pinNum, LOW); digitalWrite(pinNum, HIGH); } } void setStates(byte states){ zeroStates();//first turn all pins off //look at each bit of binary number and set HIGH if need if (states & 1) digitalWrite(A0, HIGH); if (states & 2) digitalWrite(A1, HIGH); if (states & 4) digitalWrite(A2, HIGH); if (states & 8) digitalWrite(A3, HIGH); if (states & 16) digitalWrite(A4, HIGH); if (states & 32) digitalWrite(A5, HIGH); if (states & 64) digitalWrite(2, HIGH); if (states & 128) digitalWrite(3, HIGH); } void zeroStates(){ digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); digitalWrite(A4, LOW); digitalWrite(A5, LOW); digitalWrite(2, LOW); digitalWrite(3, LOW); }
De uitvoer wordt weergegeven in de tweede afbeelding hierboven.