LedsWithShiftregister.ino

De Wikilipo.
/*
 * 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"
}