byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte numSegments = 8;
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
byte tabDeco7seg[] = {0x3f, 0x06, 0x5b, 0x4F, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
byte digits[] = {0, 0, 0, 0};
byte dots = 0x0A;
int val = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("debut");
  for (int i = 0; i < numDigits; i++)
  {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], HIGH);
  }
  for (int i = 0; i < numSegments; i++)
  {
    pinMode(segmentPins[i], OUTPUT);
    digitalWrite(segmentPins[i], LOW);
  }

  pinMode(A3, OUTPUT);
  analogWrite(A3, LOW);

  setupTimer2();
}

void setDigitHAL(unsigned char nDigitActif, unsigned char nSegsActif)
{
  PORTC = PORTC | 0x08;
  //désactiver tous les digits avant de changer les segments
  for (int i = 0; i < numDigits; i++)
  {
    digitalWrite(digitPins[i], HIGH);
  }
  //piloter les segments en utilisant les valeurs des bits de nSegsActif
  for (int i = 0; i < numSegments; i++)
  {
    if (nSegsActif & 0x01 == 1)
    {
      digitalWrite(segmentPins[i], HIGH);
    }
    else
    {
      digitalWrite(segmentPins[i], LOW);
    }
    nSegsActif = nSegsActif >> 1;
  }
  //activer le bon digit
  digitalWrite(digitPins[nDigitActif], LOW);
  PORTC = PORTC & 0xF7;
}


void setDigit(unsigned char nDigitActif, unsigned char nSegsActif)
{
  PORTC = PORTC | 0x08;
  //désactiver tous les digits avant de changer les segments
  PORTD = PORTD | 0x3C;
  //piloter les segments en utilisant les valeurs des bits de nSegsActif
  PORTD = PORTD | ((nSegsActif<< 6) & 0xC0);
  PORTD = PORTD & ((nSegsActif<< 6) | 0x3F);

  PORTB = PORTB | ((nSegsActif >>2) & 0x3F);
  PORTB = PORTB & ((nSegsActif >>2) | 0xC0);
  //activer le bon digit
  //PORTD = PORTD & ((0xFB << nDigitActif) | (0xFF >> 6-nDigitActif));
  switch(nDigitActif)
  {
    case 0 : 
      PORTD = PORTD & 0xFB;
      break;
    case 1 : 
      PORTD = PORTD & 0xF7;
      break;
    case 2 : 
      PORTD = PORTD & 0xEF;
      break;
    case 3 : 
      PORTD = PORTD & 0xDF;
      break;
  }
  PORTC = PORTC & 0xF7;
}

void setNumber(unsigned int val)
{
  byte valDigit;
  for (int i = numDigits - 1; i >= 0; i-- )
  {
    valDigit = val % 10;
    digits[i] = valDigit;
    val = val / 10;
  }
}

void tache1() {
  cli(); 
  val++;
  setNumber(val);
  sei();
}

void tache2() {
  static int numDigit = 3;
  setDigit(numDigit, tabDeco7seg[digits[numDigit]]);
  if(numDigit == 0)
  {
    numDigit = 3;
  }
  else
  {
    numDigit--;
  }
}

void setupTimer2(){
  cli();                                   // disable all interrupts
  TCCR2A = (1<<WGM21)|(0<<WGM20);          // Mode CTC
  TIMSK2 = (1<<OCIE2A);                    // Local interruption OCIE2A
  TCCR2B = (0<<WGM22)|(1<<CS22)|(1<<CS21); // prediviser /256 
  OCR2A = 250;                             //250*256*1/16000000 = 4ms
  sei();                                   // enable all interrupts
}
 
//appelée toutes les 4ms:
ISR(TIMER2_COMPA_vect){                    // timer compare interrupt service routine  
    tache2();
}

void loop() {
  unsigned int periodiciteTache1 = 100; //100ms entre chaque incrémentation de la valeur à afficher
  unsigned int periodiciteTache2 = 4; //4ms pour l'affichage de chaque digit
  static unsigned long timerTache1 = millis();
  static unsigned long timerTache2 = millis();
  if (millis() - timerTache1 >= periodiciteTache1) {
    timerTache1 += periodiciteTache1;
    tache1();
  }
}




/*
void loop() {
  byte dotsTempo = dots;
  
    for(int i = 0; i<4;i++)
    {
    if(digits[i] <= 15)//on verifie de ne pas depasser 15
    {
      //on utilise la fonction pour activer les digits i
      //les digits utilisés, on utilise la LUT pour afficher
      //les valeurs que l'on veut du tab digits
      setDigit(i,tabDeco7seg[digits[i]]);
    }
    if(dotsTempo & 0x01 == 1)//On lit le bit de poid faible correspondant au digit à allumer
    {
      setDigit(i,0x80);  //On allume le point du digit i en question
    }
    dotsTempo = dotsTempo >> 1;
    }
  
  setNumber(7895);
  setDigit(2, 0x80);
}
*/


D0D1D2D3D4D5D6D7GNDLOGIC