Registre à décalage

2014-09-27

Introduction

Le décodeur BCD permet de réduire le nombre de pin nécessaire au contrôle d'un afficheur sept segments à 4. Comment faire mieux ? Puisque les chiffres ont besoin de 4 bits pour être représenter, il faudra que la carte émette ces 4 bit de données, d'une manière ou d'une autre. Dans les sections précédentes, les données étaient envoyées en parallèle : un bit par pin.

Une autre approche est possible : envoyer les données en série. L'idée est simple : les bits sont envoyés les uns après l'autre sur la sortie. Autrement dit, au lieu d'avoir un découpage spatial de l'information, on obtient un découpage temporel.

Cependant, l'afficheur sept segments prend toujours les entrées en parallèle. Il faut donc trouver un moyen pour passer du seriel (sortie de la carte) au parallèle (entrée de l'afficheur). Pour cela, on utilise un registre à décalage. Un tel registre a deux interfaces : une interface parallèle, avec autant de pin que nécessaires, et une interface serielle, qui n'en utilise qu'un nombre fixe (par exemple, données et horloge). Un registre à entrée serielle et sortie parallèle (Sin-Pout) va recevoir des bits un par un et les mémoriser ; sur l'autre interface, il émettra les derniers bits reçu en parallèle. Au contraire, un registre à entrée parallèle et sortie serielle (Pin-Sout) mémorise les données sur l'interface parallèle à un instant donné et les réemet bit par bit sur l'autre interface.

Un registre à décalage à entrée serielle et sortie parallèle (source)
Un registre à décalage à entrée serielle et sortie parallèle (source)

Évidemment, la sortie parallèle est constituée de Q0 à Q7, Vcc doit être reliée à un potentiel positif, et GND à la masse. DSA et DSB sont l'entrée serielle (Data Serial en anglais) ; pour une quelconque raison, un « 1 » s'écrit avec DSA et DSB tous les deux à un potentiel HIGH. CP est l'horloge (Clock Pin) : pour indiquer au registre de mémoriser le bit de données actuellement présenté en entrée, il faut que l'horloge passe de LOW à HIGH. Lorsque MR n'est pas à HIGH, le contenu du registre est effacé.

Pour le montage présenté ici, vous aurez besoin d'un registre à décalage Sin-Pout (par exemple le 74HC164), et bien sûr d'une breadboard, d'une résistance d'un afficheur sept-segment et de jumper.

Montage

Pour le montage, nous allons simplement relier les 8 sorties du registre à décalage aux 8 entrées de l'afficheur sept-segment. Pour contrôler le registre à décalage, nous aurons besoin de relier l'entrée serielle et l'horloge à deux sorties de la carte Arduino.

En bleu, les sorties du registre sont reliées aux entrées de l'afficheur ; en rouge, le registre est alimenté et MR désactivée ; en vert les données serielles, et en violet l'horloge (source)
En bleu, les sorties du registre sont reliées aux entrées de l'afficheur ; en rouge, le registre est alimenté et MR désactivée ; en vert les données serielles, et en violet l'horloge (source)

Pour contrôler l'afficheur, nous allons donc envoyer 8 bits dans le registre à décalage avec les pin 13 et 12. Pour cela, on imposera le potentiel adapté sur la pin 13, de données puis fera passer la pin 12, l'horloge, de LOW à HIGH.

Programme

Comme pour le contrôle direct de l'afficheur, nous aurons besoin de connaître la représentation de chaque chiffre décimal sur l'afficheur.

byte digits[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};

Nous devons maintenant lire les 8 bits du code et les envoyer seriellement au registre.

void displayDigit(int d)
{
    byte code = digits[d%10];
    for (int c = 7; c >= 0; c--)
    {   
        digitalWrite(12, LOW);
        digitalWrite(13, code%2 ? HIGH : LOW);
        digitalWrite(12, HIGH);
        code >>= 1;
    }   
}

Le code complet :

byte digits[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
void displayDigit(int d)
{
    byte code = digits[d%10];
    for (int c = 7; c >= 0; c--)
    {   
        digitalWrite(12, LOW);
        digitalWrite(13, code%2 ? HIGH : LOW);
        digitalWrite(12, HIGH);
        code >>= 1;
    }   
}
void setup()
{
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
}
void loop()
{
    displayDigit(4);
    delay(1000);
    displayDigit(2);
    delay(1000);
}

L'horloge peut être utilisée pour plusieurs composants à la fois. Par exemple, pour contrôler plusieurs registres à décalage, il suffit d'imposer le potentiel adéquat sur l'entrée serielle de chaque registre, puis de déclencher un pas d'horloge simultanément sur tous les registres. De cette manière, la carte peut contrôler jusqu'à 12 registres et donc autant d'afficheurs sept segments.

Remarquez que cette technique peut-être combinée avec des décodeurs BCD pour contrôler deux afficheurs sept segments : relier chaque décodeur à un afficheur, et les entrées des décodeurs, pour un total de huit pin, au registre à décalage. Cette méthode permet de contrôler deux afficheurs sept segments avec seulement deux pin de la carte (et pour plus d'afficheurs, l'horloge peut être mise en commun, permettant de contrôler de cette manière jusqu'à 12×2=24 afficheurs).