Introduction

afficheur 7 segments

Un afficheur à 7 segments est un dispositif d’affichage constitué de sept parties, permettant principalement d’afficher des chiffres. Pour afficher des lettres, un écran LCD est plus adapté. Ce type d’afficheur est couramment utilisé dans les calculatrices ou les réveils.

Comme son nom l’indique, l’afficheur à 7 segments se compose de sept segments individuels. Chaque segment représente une portion de l’affichage qui, lorsqu’il est allumé, contribue à former un chiffre. Selon les segments activés, différents chiffres peuvent être affichés. Avec ce type d’afficheur, il est possible d’afficher les chiffres de 1 à 9. L’afficheur à 7 segments utilise un codage sur 8 bits.

Voici le schéma du circuit pour l’afficheur 7 segments :

// Définition des segments en fonction des broches GPIO
const uint8_t digits[] = {
  0b11000000, // 0
  0b11111001, // 1
  0b10100100, // 2 
  0b10110000, // 3
  0b10011001, // 4
  0b10010010, // 5
  0b10000010, // 6
  0b11111000, // 7
  0b10000000, // 8
  0b10011000, // 9
};

const uint8_t segment_pins[] = {2, 3, 4, 5, 6, 7, 8}; // Segments A, B, C, D, E, F, G
const uint8_t digit_pins[] = {10, 11, 12, 13};        // Chiffres (digit pins)

void setup() {
  Serial.begin(115200);
  Serial.println("Afficheur 7 segments sans PIO");

  // Initialisation des broches des segments et des chiffres
  for (int i = 0; i < 7; i++) {
    pinMode(segment_pins[i], OUTPUT);
  }
  for (int i = 0; i < 4; i++) {
    pinMode(digit_pins[i], OUTPUT);
  }
}

void displayDigit(uint8_t digit, uint8_t position) {
  // Allume les segments en fonction du chiffre à afficher
  for (int i = 0; i < 7; i++) {
    digitalWrite(segment_pins[i], (digits[digit] >> i) & 0x01);
  }

  // Active le bon chiffre (digit) en éteignant les autres
  for (int i = 0; i < 4; i++) {
    digitalWrite(digit_pins[i], (i == position) ? LOW : HIGH);
  }
}

void displayNumber(uint16_t number) {
  // Affiche chaque chiffre dans un affichage de 4 chiffres
  for (int i = 0; i < 4; i++) {
    displayDigit(number / pow(10, 3 - i) % 10, i);
    delay(5); // Court délai pour afficher correctement
  }
}

int i = 0;
void loop() {
  displayNumber(i++);
  if (i > 9999) i = 0; // Réinitialiser à 0 quand le nombre dépasse 9999
  delay(200); // Délai entre les incréments
}