LedsWithShiftregister.ino
Aller à la navigation
Aller à la recherche
/* * Arduino Experimentation Kit Example Code * CIRC-05 .: 8 More LEDs :. (74HC595 Shift Register) * registre à décalage * successfully tested April, 4. 2012 * * French version April 14, 2012 * @atelierpdf.com * */ // définitions des fiches (pins) // // le CI 74HC595 utilise la communication sérielle // sur trois fiches int data = 2; int clock = 3; int latch = 4; // définitions pour l'accès à chaque DEL int ledState = 0; const int ON = HIGH; const int OFF = LOW; /* * mise en place des fiches de l'arduino comme sorties */ void setup() { pinMode(data, OUTPUT); pinMode(clock, OUTPUT); pinMode(latch, OUTPUT); } /* * on définit les DELS que l'on souhaite allumer * puis on lance une routine qui envoie les états définis au 74HC595 */ void loop() { int delayTime = 100; // la pose entre les enclenchements for(int i = 0; i < 256; i++){ updateLEDsLong(i); delay(delayTime); } } //// vaiation 1: controle des DELs individuelles //{ // int delayTime = 100; // // for (int i = 0; i < 8; i++) { // changeLED(i, ON); // delay(delayTime); // } // // for (int i = 0; i < 8; i++) { // changeLED(i, OFF); // delay(delayTime); // } //} /* * updateLEDs() - envoie les états des DELs contenus dans la variable "ledStates" au 74HC595 * sequence */ void updateLEDs(int value){ digitalWrite(latch, LOW); // met le registre "latch" en position fermée "low" shiftOut(data, clock, MSBFIRST, value); // envoie la suite de 8 bits au shift register digitalWrite(latch, HIGH); // ouvre le "latch" pour afficher le données } /* * updateLEDsLong() - variante de ci-dessus sauf les commutations (shifting) * qui sont implémentées dans le logiciel pour l'bservation de ce qui se passe */ void updateLEDsLong(int value){ digitalWrite(latch, LOW); // fermeture du "latch" for(int i = 0; i < 8; i++){ // une fois par bit traité int bit = value & B10000000; // on utilise un "bitmask" pour n'accéder au dernier // bit dans notre nombre (celui qui nous intéresse à ce stade de la boucle) value = value << 1; // on se déplace d'un bit pour que la fois prochaine // le bit 7 sera bit 8 pour nos calculs if(bit == 128){ digitalWrite(data, HIGH); } // si le bit 8 est défini, on ouvre la fiche de donnée (data pin) else{ digitalWrite(data, LOW); } // si le bit 8 n'est pas défini, on ferme la fiche de donnée (data pin) digitalWrite(clock, HIGH); // on le rythme de l'horloge delay(1); digitalWrite(clock, LOW); } digitalWrite(latch, HIGH); // ouverture du latch high pour enclencher l'affichage } // les données en calcul en bits // details sur http://en.wikipedia.org/wiki/Bitwise_operation int bits[] = { B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000}; int masks[] = { B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; /* * changeLED(int led, int state) - changes chaque DEL individuellement * de 0 to 7 avec deux états 0 - OFF ou 1 - ON */ void changeLED(int led, int state){ ledState = ledState & masks[led]; // efface dans "ledState" le bit auquel on s'adresse if(state == ON){ ledState = ledState | bits[led]; } // si le bit est "on", on l'ajoute à "ledState" updateLEDs(ledState); // envoie le nouvel état de la DEL a la puce "shift register" }