Pages: [1]   Go Down
Author Topic: niveau débutant : 1 à n afficheurs 7 segments avec seulement 3 pins  (Read 4626 times)
0 Members and 2 Guests are viewing this topic.
Near Paris in France
Offline Offline
Full Member
***
Karma: 0
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3163
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il y a une rubrique tuto smiley-wink
Logged


Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci JLB, sont sympas tes petits tutos.

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


France
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Par contre la boucle for infinie dans la fonction loop est redondante avec celle du main smiley-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
Code:
move zero to i.
if i=1
...
C'est très pratique en debug. ;-)
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3163
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pas mal le déterrage xD
Logged


Pages: [1]   Go Up
Jump to: