multiplexing 7 segmenti (un segmento alla volta)

salve a tutti sto utilizzando un display 7 segmenti 4 cifre a catodo comune, finora l’ho utilizzato con il multiplexing ma una cifra alla volta ossia in solo colpo accendo tutti i led della cifra e con 4 transistors gestisco le 4 cifre.
ora per ridurre i componenti vorrei provare la tecnica di accende un solo segmento alla volta in modo da avere solo 4 resistenze e nessun transistors.

ho preso spunto dal codice del micro-logio ma non mi funziona. il codice per ora è scritto per gestire una sola cifra con catodo collegato direttamente a massa e il delay è alto per vedere passo passo il funzionamento…
il codice è questo

byte segA = 13;
byte segB = 12;
byte segC = 11;
byte segD = 6;
byte segE = 9;
byte segF = 8;
byte segG = 7;
byte segmenti[7] = {segA, segB, segC, segD, segE, segF, segG};
  
const byte numeri[10]={
  0b11111100, // 0
  0b01100000, // 1
  0b11011010, // 2
  0b11110010, // 3
  0b01100110, // 4
  0b10110110, // 5
  0b10111110, // 6
  0b11100000, // 7
  0b11111110, // 8
  0b11110110  // 9
};

void setup(){
  //setto i pin com output
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  //metto tutti i pin a low
  digitalWrite (segA, LOW);
  digitalWrite (segB, LOW);
  digitalWrite (segC, LOW);
  digitalWrite (segD, LOW);
  digitalWrite (segE, LOW);
  digitalWrite (segF, LOW);
  digitalWrite (segG, LOW);
}

void loop(){
  
  
  for (byte i=0; i<7 ; i++){
    digitalWrite(segmenti[i], bitRead(numeri[5],i)); //assugno al segmento segmenti[i] il valore del bit i dell'vettore numeri posizione 5
    delay (200);
    digitalWrite(segmenti[i], ~bitRead(numeri[5],i));
   
  }

}

io nella array numeri ho inserito la sequenza di 0 e 1 in modo da far confrontare gli 1 con i segmenti che devono essere accesi per formare quel numero e 0 per quelli che devono rimanare spenti
il problema è che anche se come nell’esempio voglio visualizzare il numero 5 il displey accende in sequenza tutti i segmenti non solo quelli che formano il numero 5 e poi non li spegne…

questo carattere ~ prese paro paro dal codice del micrologio dove dice che il segmento viene spento serve a fare l’opposto del bit letto? la lettura del bit comincia da destra o da sinistra?

qualcuno sa darmi una mano?

userei ! ovvero

digitalWrite(segmenti[i], !bitRead(numeri[5],i));

Ciao Uwe

Ciao, grazie per la risposta, potresti pero spiegarmi cosa fa quel punto esclamativo?

Nega

Ciao Uwe