niveau débutant : 1 à n afficheurs 7 segments avec seulement 3 pins

En associant à chaque afficheur un registre à décalage de type 74HC164 (ou autre décaleur binaire 8 bits) on peut cascader autant d'afficheurs que l'on souhaite sans nécessiter plus de pin sur le microcontrôleur. A noter que le Guiness Book ne comporte pas encore de record sur le nombre d'afficheurs ainsi connectés.

Le cablage est indiqué dans le code d'exemple fourni.

Pour cascader il suffit de brancher la pin Q7 du premier étage à la pin data du suivant et de cabler en parallèle les lignes Reset et Clock. Il faut aussi adapter mon code d'exemple pour ne pas faire le reset avant les digits autres que le premier.

Astuce : pour éviter les résistances et régler la luminosité on peut associer un transistor (2n2222 par exemple) à chaque VCC ou GND afficheur (anode commune versus cathode commune) et le relier à une pin PWM.

byte matrice[] = {0x80, 0x40, 0x20, 0x10, 0x02, 0x04, 0x01, 0x00,
                  0x77, 0x06, 0xB5, 0x97, 0xC6, 0xD3, 0xF3, 0x07, 0xF7, 0xD7, 0xE7, 0xF2, 0x71, 0xB6, 0xF1, 0xE1};
  
void setup()
{
  pinMode(2, OUTPUT);          // Pin reset du 74164
  pinMode(3, OUTPUT);          // Pin Clock du 74164
  pinMode(4, OUTPUT);          // Pin data du 74164 (l'autre pin data est cablé à 1)
  digitalWrite(2, 1);          // Sort le 74164 de l'état reset
}

/*
Affiche une valeur sur 7 segments par 3 fils au moyen d'un registre à décalage binaire type 74HCT164.

Valeurs de 0 à 15 affiche de 0 à F
valeur -1 efface l'afficheur
valeur de -2 à -8 affiche le segment a,b,c,d,e,f,g

La matrice est établi pour les connexions suivantes sur le 74164 :
Q0=a, Q1=c, Q2=b, Q3=dp, Q4=d, Q5=e, Q6=f, Q7=g

Si afficheur à cathode commune enlever le NOT de l'écriture du bit data.
*/
void display(int valeur, boolean dp)
{
byte mask;

  if (valeur < -8 || valeur > 15){   // Valeur invalide affiche BLANK
    valeur = -1;
  }
  
  mask = matrice[valeur + 8];        // Pour que valeur 0 affiche 0
  
  if (dp){                           // Force le point décimal dans la matrice
    mask |= 8;
  }

  digitalWrite(2, LOW);       // Reset du 74164
  digitalWrite(2, HIGH);      // ...
 
  for (int i = 0; i < 8; i++)    
  {
    digitalWrite(4, !(mask & 0x80));         // Bit 7 de la matrice comme data à shifter dans le 74164
    digitalWrite(3, HIGH);                   // Clock du 74164
    digitalWrite(3, LOW);                    // ...
    mask = mask << 1;                        // Passe au bit suivant de la matrice
  }
}

void loop()
{
  for (;;)
  {
    // Effacement
    display(-1, false);
    delay(2000);

    // Animation tournante
    for (int j = 0; j < 5; j++)
    {
      for (int i = -2; i > -8; i--)
      {
        display(i, false);
        delay(100);
      }
    }
    
    // Effacement
    display(-1, false);
    delay(2000);

    // Affiche de 0 à F
    for (int i = 0; i < 16; i++)
    {
      display(i, false);
      delay(1500);
      display(i, true);    // Affiche brièvement un point décimal avant le passage au chiffre suivant
      delay(500);
    }
  }
}

JLB

Il y a une rubrique tuto :wink:

Il suffit de demander aimablement au GM (Gentil Modérateur) qui se fera un plaisir de déplacer le sujet.

Bravo JLB, c'est bien de partager.

Merci JLB, sont sympas tes petits tutos.

Par contre la boucle for infinie dans la fonction loop est redondante avec celle du main :wink:

SesechXP:
Par contre la boucle for infinie dans la fonction loop est redondante avec celle du main :wink:

Astuce de développeur ? (on fait une boucle finie pour les tests, et plutôt que la supprimer ensuite on l'ouvre.
Il m'arrive assez fréquemment d'écrire

move zero to i.
if i=1
...

C'est très pratique en debug. :wink:

Pas mal le déterrage xD