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