Décodeur BCD

2014-09-27

Introduction

Jusqu'ici, nous avons contrôlé un afficheur sept segments directement depuis la carte. Ainsi, contrôler les 7 DEL implique de réserver 7 pin (8 si l'on ajoute le point). Dans un circuit complexes, cela devient rapidement un problème.

La première chose que l'on peut remarquer, c'est que les 7 DEL peuvent se trouver dans 128 combinaisons différentes, alors que l'on ne veut représenter que 10 chiffres. En binaire, 4 bits suffisent en fait à représenter les chiffres :

   0    1    2    3    4    5    6    7    8    9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

C'est le Codage Binaire Décimal (BCD pour Binary-Coded Decimal). Le décodeur BCD est un circuit intégré qui permet d'exploiter cette particularité pour réduire à quatre le nombre de bits nécessaires pour contrôler un afficheur sept segments. Nous utiliserons le 74LS47.

Un décodeur BCD pour afficheur sept-segments (source)
Un décodeur BCD pour afficheur sept-segments (source)

Le composant doit être alimenté : Vcc relié à HIGH et GND relié à la pin correspondante de la carte. Les pin a à g sont à relier à l'afficheur sept segment de manière appropriée. L'entrée se fait sur les connexions A0 à A1. Par exemple :

          7
 0  1  1  1
A3 A2 A1 A0

RBI et RBO sont une fonctionnalité utile lorsqu'on enchaîne les afficheurs pour représenter un nombre à plusieurs chiffres. Un nombre qui n'utilise pas tous les chiffres serait normalement précédé de zéros : par exemple, le nombre 101 serait représenté par 000101 sur 6 afficheurs. Pour éviter que les premiers zéros ne soient activés, le premier afficheur indique au second qu'il n'est précédé par aucun chiffre non-nul ; le second indique la même chose au premier. En revanche, le cinquième ne reçoit pas de tel signal et affiche correctement le zéro dans « 101 ». Le signal est émis sur RBO (Ripple Blanking Output) et reçu sur RBI (Ripple Blanking Input). Pour toujours afficher zéro, nous relierons RBI à HIGH.

LT permet d'activer tous les segments pour vérifier leur bon fonctionnement. Nous l'imposerons à HIGH pour désactiver cette fonctionnalité.

Enfin, l'afficheur est désactivé si BI n'est pas relié à un potentiel élevé.

Montage

Nous relions donc les sorties a à f à l'afficheur sept segments, les entrées A0 à A3 à l'Arduino, Vcc, RBI, RBO et LT à HIGH et GND à la masse.

L'utilisation du décodeur BCD pour l'afficheur sept segments ; les entrées sont en jaunes, les sorties en bleu, +5V en rouge et la masse en noir (source)
L'utilisation du décodeur BCD pour l'afficheur sept segments ; les entrées sont en jaunes, les sorties en bleu, +5V en rouge et la masse en noir (source)

Programme

Nous n'aurons ici pas besoin de déterminer nous-même la représentation de chaque chiffre. Il suffit d'envoyer les quatres bits du chiffre sur les pin 13 à 10.

void displayDigit(int d)
{
    d = d % 10;
    for (int i = 0; i < 4; i++)
    {
        digitalwrite(13-i; d%2 ? HIGH : LOW);
        d >>= 1;
    }
}

Comme précédemment, la boucle lit le chiffre bit par bit et impose le potentiel adéquat sur la sortie correspondante. Le code complet est :

void displayDigit(int d)
{
    d = d % 10;
    for (int i = 0; i < 4; i++)
    {
        digitalwrite(13-i; d%2 ? HIGH : LOW);
        d >>= 1;
    }
}
int counter = 0;
void setup()
{
    counter = 0;
    for (int i = 13; i >= 10; i--)
        pinMode(i, OUTPUT)
}
void loop()
{
    displayDigit(counter);
    delay(1000);
    counter++;
}

Ce programme va compter les secondes et afficher le dernier chiffre sur l'afficheur sept segments.