Apagar Contador con 4 Display 7 Segementos 0 - 9999

Hola buen día, me inscribí a este foro para ver si puedo recibir un poco de ayuda. Ya he buscado soluciones por internet pero no son lo que esperaba.
Resulta que tengo 4 displays de 7 segmentos de cátodo común todos conectados a la misma entrada del Arduino para simular un solo display de 4 dígitos, y lo que busco que haga que solo se prendan los display de acuerdo al numero, es decir, si tengo 0 se debe encender solo el ultimo display y no todos que se prenden en 0 de un inicio, 0000, otro ejemplo seria con el #10 queda 0010 y yo busco --10, o el numero 0999 pero solo quiero que enciendan los últimos tres displays -999. No se si me explico. Esto es lo que llevo

byte pins[7]={2,3,4,5,6,7,8};
byte display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00};
byte digitos[4]={9,10,11,12};
void setup() {
  for (byte i=0; i<7; i++) {
    pinMode(pins[i],OUTPUT);
  }
  for (byte i=0; i<4; i++) {
    pinMode(digitos[i],OUTPUT);
  }
  pinMode(14,INPUT);
  pinMode(15,INPUT);
}
int cont=0;
int resto;
int divisor;
byte millares;
byte centenas;
byte decenas;
byte unidades;
byte valor;
byte swDer=0;
byte swIzq=0;
byte bit=0;
void loop() {
  if(cont >= 0 && cont <= 9/* && bit = 0 valor = unidades*/) {
   // pinMode(digitos[0],OUTPUT);
    digitalWrite(digitos[1,2,3],display[10]);
    digitalWrite(digitos[0],LOW);
  }else {
    if(cont >= 10 && cont <= 99/* && bit = 1 valor = decenas*/){
   // 	pinMode(digitos[0,1],OUTPUT);
      	digitalWrite(digitos[2,3],display[10]);
      digitalWrite(digitos[0,1],LOW);
    }else {
      if(cont >= 100 && cont <= 999/* && bit = 2 valor = centenas*/){
    //  	pinMode(digitos[0,1,2],OUTPUT);
        digitalWrite(digitos[3],display[10]);
        digitalWrite(digitos[0,1,2],LOW);
      }else {
        if(cont >= 1000 && cont <= 9999/* && bit = 3 valor = millares*/){
     //   	pinMode(digitos[0,1,2,3],OUTPUT);
          	digitalWrite(digitos[0,1,2,3],HIGH);
        }
      }
    }
  }
  for (byte i=0; i<4; i++) {
    digitalWrite(digitos[i],HIGH);
  }
  
  for (byte i=0; i<7; i++) 
    digitalWrite(pins[i],display[10]>>i&1);
  delay(5);
  digitalWrite(digitos[bit],LOW);
  millares=cont/1000;
  resto=cont%1000;
  centenas=resto/100;
  resto=resto%100;
  decenas=resto/10;
  unidades=resto%10;
  if (bit==0) valor=unidades;
  if (bit==1) valor=decenas;
  if (bit==2) valor=centenas;
  if (bit==3) valor=millares;
  for (byte i=0; i<7; i++) 
    digitalWrite(pins[i],display[valor]>>i&1);
  delay(5);
  bit++;	
  if (bit>3) bit=0;
  if (digitalRead(15)) {
    if (!swDer)
      if (cont<9999) cont++; else cont=0;
    swDer=1;
  } else swDer=0;
  if (digitalRead(14)) {
    if (!swIzq)
      if (cont>0) cont--; else cont=9999;  
    swIzq=1;
  } else swIzq=0;
}

En donde inicia el void loop y antes del primer ciclo for es donde estoy tratando de hacer ese despapayo.
Agradezco su tiempo al que responda y un gran gracias

Lo siento pero eso no lo puedes hacer, no puedes unir los 4 catodos a un solo pin, ademas alguna mentirijilla estas contando porque con ese código NUNCA obtendras los resultados que dices, ya que NO puedes unir los catodos a un solo pin , si lo haces todos los digitos siempre te mostrarian en mismo numero 0000,1111, 8888, etc.
Conecta los catodos a los 4 pines que te indica el codigo. : "byte digitos[4]={9,10,11,12}; "
Y cuando te funcione ya podremos hablar de apagar los digitos segun corresponda.
Saludos.

A lo mejor no me explique bien, pero los números si van desde el 0 al 9999. Es algo llamado multiplexación.
Pero estoy buscando que se apaguen los displays con 0 la izquierda. Incluyo una foto del diagrama

Y te funciona esto
digitalWrite(digitos[1,2,3],display[10]);
y las sentencias similares?

Como me llamó la atención la notación, y antes de meter la pata porque no me las se todas, reproduje esa parte del código y lo único que obtengo es que solo active el pin con índice mayor, o sea 12, en lugar de la secuencia 10-11-12, 11-12, 12, 9-10-11-12 (que imagino es lo que quieres).

Agrega esto
Serial.println(digitos[1,2,3]);
luego de esa sentencia (inicializa el serial, no lo olvides) y en consola solo imprime "12".

Lo cual es lógico porque donde espera un byte tanto en digitalWrite() como en print() (y un char es lo mismo que un byte) tu mandas un array, en este caso 3 bytes como un bloque, entonces trunca los bytes superiores y solo queda el más bajo, o sea el último.

Por otro lado, respecto a tu duda, una solución posible es agregar luego de las divisiones

if(millares == 0) millares = 10;
if(centenas == 0 && millares == 10) centenas = 10;
if(decenas == 0 && centenas == 10) decenas = 10;

ya que 10 es el índice del array donde definiste todos los segmentos apagados.

Saludos

Muchas Gracias @gatul :smiley: por fin hace lo que buscaba!

De nada!

Saludos