Contrôle des LED avec des décodeurs et des verrous sur la carte d'évaluation

Ce document détaille le processus de contrôle des LED sur une carte d'évaluation, en expliquant le rôle des composants clés comme les circuits intégrés 74HC573 et 74HC138, et en fournissant des exemples de code pour la mise en œuvre.

Composants matériels

1. Verrou 74HC573

Le 74HC573 fonctionne comme une "boîte de conservation de données". Lorsque la broche LE (Latch Enable) est à l'état haut, les sorties suivent les changements des entrées. Lorsque LE est à l'état bas, les données d'entrée ne peuvent pas passer, et les sorties maintiennent la dernière donnée verrouillée. Par exemple, si LE est haut et que l'entrée D1 est à 1, la sortie Q1 sera à 1. Si LE est ensuite abaissé et que D1 passe à 0, Q1 restera à 1.

Ce composant est utilisé pour transmettre les signaux d'allumage/extinction des LED.

Le 74HC138 agit comme un "sélecteur d'interrupteurs". En lui fournissant différentes combinaisons d'entrées binaires (A, B, C), il active un canal de sortie unique parmi les huit (Y0-Y7). Les sorties sont actives à l'état bas, comme indiqué par les symboles triangulaires sur les lignes de sortie.

Par exemple, si ABC est 001, Y1 sera actif (à l'état bas). Si ABC est 111, Y7 sera actif.

Sur la carte d'évaluation, il est utilisé pour contrôler l'activation de divers périphériques.

En conjonction avec le 74HC138, la broche LE du 74HC573 est connectée à Y4C. Lorsque Y4C est à l'état haut, LE est à l'état haut, permettant la synchronisation entre les entrées et les sorties du 74HC573. Pour activer LE, il faut que Y4C soit à 1. Étant donné que Y4C est obtenu par une porte NON-OU entre Y4 et WR, et que dans le mode IO, WR est connecté à la masse (GND) via J13 (donc WR=0), il faut que Y4 soit à 0.

Si Y4 est à 0, les entrées ABC du 74HC138 (Figure 2) doivent être 001. Cela signifie que P2.5 doit être à 0, P2.6 à 0, et P2.7 à 1. La manipulation de P2 (P2=(P2&0X1F|0X80)) permet de s'assurer que les trois bits de poids fort sont initialement mis à zéro, puis le bit le plus significatif (P2.7) est mis à 1.

Les LED sont connectées à VCC sur leur droite et aux sorties du 74HC573 sur leur gauche. Par conséquent, une LED s'allume lorsque la sortie correspondante du 74HC573 est à l'état bas. Pour allumer une LED spécifique, il faut que LE soit actif (Y4C=1) et que la broche P0 correspondante soit à l'état bas.

Pour allumer la première LED et éteindre les autres, la sortie Q1 du 74HC573 doit être à 0, et les autres à 1. Cela se traduit par la valeur P0 = 0xFE (où P0.0 est à 0 et les autres bits à 1).

De plus, LE doit être activé (Y4C=1), ce qui implique Y4=0. Les entrées ABC du 74HC138 doivent donc être 001. La configuration de P2 (P2=(P2&0X1F|0X80)) est utilisée pour atteindre cet état (P2.7=1, P2.5=0, P2.6=0). Enfin, P2 &= 0X1F est utilisé pour désactiver LE, maintenent ainsi l'état des LED.

#define LED(X) {P0=X;P2=(P2&0X1F|0X80);P2 &= 0X1F;} // Contrôle de l'état des LED

Code Keil pour un effet de LED dynamique (effet "Water")

Le code suivant implémente un effet de bande lumineuse où une LED s'allume successivement.

#include "STC15F2K60S2.h" // Inclusion du fichier d'en-tête spécifique au microcontrôleur
#include <intrins.h> // Pour la fonction _nop_()

#define LED(X) {P0=X;P2=(P2&0X1F|0X80);P2 &= 0X1F;} // Macro pour contrôler les LED

unsigned char loca = 0X01; // Initialise la position de la LED allumée (LSB allumé)
unsigned char cnt = 0;   // Compteur pour le nombre de décalages

// Fonction de temporisation de 100ms à 12.000MHz
void Delay100ms(void)
{
    unsigned char data i, j, k;
    _nop_();
    _nop_();
    i = 5;
    j = 144;
    k = 71;
    do {
        do {
            while (--k);
        } while (--j);
    } while (--i);
}

// Fonction pour faire avancer la LED allumée
void water(void)
{
  loca = loca << 1; // Décale le bit allumé vers la gauche
  cnt++;             // Incrémente le compteur de décalages
  if (cnt == 8)      // Si 8 décalages ont été effectués (toutes les positions ont été atteintes)
  {
    cnt = 0;         // Réinitialise le compteur
    loca = 0X01;     // Réinitialise la position à la première LED
  }
}

void main(void)
{
  while(1)
  {
    // L'opérateur '~' est utilisé car loca représente la position "éteinte" pour allumer la LED
    // (la sortie du 74HC573 doit être à 0 pour allumer la LED, et P0 est configuré en conséquence).
    LED(~loca);
    Delay100ms();
    water();
  }
}

Étiquettes: 74HC573 74HC138 STC15F2K60S2 LED Microcontrôleur

Publié le 9 août à 06h32