(Novato) Cuenta atras 4 digitos de 7 segmentos multiplexado

Buenas,
Vengo a pediros ayuda por este pequeño problema que seguro tenga fácil solución.
Tengo montado 4 displays de 7 segmentos y 2 botones, cuando doy a un botón aumenta en 1 los números y si doy al otro botón resta 1. Hasta ahí todo bien, el problema viene para poner un 3º botón y que haga una cuenta atrás (Vamos que reste en 1 los digitos segun el numero que esté mostrando) . Me estoy volviendo loco creando bucles y no doy con el resultado.
Nota: El común de los displays de 7 segmentos es el ánodo.
El código es este:
#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define Z 7
#define G 8
// Botones de pulsación analógicos
#define BTN1 14
#define BTN2 15
#define BTN3 16 // Este es el botón que quiero para hacer la cuenta regresiva
// Comunes para ánodos o cátodos, según leds
#define CC1 9
#define CC2 10
#define CC3 11
#define CC4 12

// Secuencia de leds para A, B, C, D, E, Z, G
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };

//Números multiplexados
const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b0000000, 0b0010000};

int estadobtn1 = 0;
int estadobtn2 = 0;
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
int digit4 = 0;
int count = 0;
int val;
int val2;

void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(Z, OUTPUT);
pinMode(G, OUTPUT);
pinMode(BTN1, INPUT);
pinMode(BTN2, INPUT);
digitalWrite(BTN1, HIGH);
digitalWrite(BTN2, HIGH);
pinMode(CC1, OUTPUT);
pinMode(CC2, OUTPUT);
pinMode(CC3, OUTPUT);
pinMode(CC4, OUTPUT);
count = 0;
}

void loop() {

val = digitalRead(BTN1);
if (val != estadobtn1)
{
if (val == LOW)
{

count++;
count %= 10000;
}

}

estadobtn1=val;

val = digitalRead(BTN2);
if (val != estadobtn2)
{
if (val == LOW)
{
if (count == 0)
{
count=9999;
} else {
count--;
}
}
estadobtn2=val;
}
// display number
digit1=count / 1000;
digit2=(count - (digit1 * 1000)) / 100;
digit3=(count - (digit11000) - (digit2100)) / 10;
digit4=count % 10;

lightDigit1(numbers[digit1]);
delay(2);
lightDigit2(numbers[digit2]);
delay(2);
lightDigit3(numbers[digit3]);
delay(2);
lightDigit4(numbers[digit4]);
delay(2);
}

void lightDigit1(byte number) {
digitalWrite(CC1, HIGH);
digitalWrite(CC2, LOW);
digitalWrite(CC3, LOW);
digitalWrite(CC4, LOW);
lightSegments(number);
}

void lightDigit2(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, HIGH);
digitalWrite(CC3, LOW);
digitalWrite(CC4, LOW);
lightSegments(number);
}

void lightDigit3(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(CC3, HIGH);
digitalWrite(CC4, LOW);
lightSegments(number);
}

void lightDigit4(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(CC3, LOW);
digitalWrite(CC4, HIGH);
lightSegments(number);
}

void lightSegments(byte number) {
for (int i = 0; i < 7; i++) {
int bit = bitRead(number, i);
digitalWrite(segs*, bit);*

  • }*
    }[/table]
    Un saludo

buenas, y perdona mi ignorancia, te importaría explicarme esta parte de tu código que no entiendo lo que hace

  val = digitalRead(BTN1); 
  if (val != estadobtn1) 
  {
    if (val == LOW) 
    {
      
      count++;
      count %= 10000;
    } 
    
  }
  
  estadobtn1=val;

Gracias

Buenas, Deadpool. No entiendo muy bien tu pregunta. ¿El tercer botón, en qué se diferenciaría del segundo, que también resta 1 al número actual? ¿Hacer una cuenta regresiva hasta cero cada segundo? ¿Debería mientras continuar "escuchando" los botones? ¿Que debería ocurrir si durante la cuenta se pulsa uno de los botones? Una pista, podría ser utilizar una variable:
bool descontando=false;
loop(){
if (digitalRead(BTN3) descontando=!descontando; //al pulsar enciende o apaga la cuenta atrás
if (descontando) count--;
}
Marcial; no sé a qué línea del código concreta te refieres, pero a primera vista parece que lo que hace es que cuando detecta un cambio de HIGH a LOW en BTN1, incrementa count, saltando a 0 si llega a 10000.

Eso es, el tercer botón activa una cuenta atrás automática cada segundo o valor que se quiera introducir hasta 0. El resto de botones mientras está activa no es necesario que los escuche.
Resumiendo un poco, los botones 1 y 2 lo que hacen es subir o bajar dígitos para programar la cuenta atrás, el 3º botón es el que haría que se iniciara la cuenta atrás.
Voy a seguir probando cosillas y cuando vea que funciona correctamente cuelgo el código con el esquema.

Muchas gracias por la ayuda y un saludo

if (val == LOW)
{
count++;
count %= 10000;
}

por lo que yo entiendo añade 1 a count y después almacena el resto de dividirlo por 10000, en teoría, si solo pulsa BTN1 nunca pasara count de 0

Marcial:
El resto o módulo de 1, 2...9999%10000 es 1,2...9999 (el cociente entero sí es 0). Para 10000 el cociente sí es 1 y el resto 0.

La primera opción:

bool descontando=false;
loop(){
if (digitalRead(BTN3) descontando=!descontando; //al pulsar enciende o apaga la cuenta atrás
if (descontando) count--;
}

Me da un error: 'digitalRead(16u)' cannot be used as a function
También puede ser porque lo haya metido mal o no sepa donde meterlo.
La segunda opción:

if (val == LOW)
{
count++;
count %= 10000;
}

Solamente me hace bajar un dígito por pulsación y cuando llega a 0000 no pasa a 9999. pero tengo que hacer yo las pulsaciones.
Yo había pensado hacerlo con un "for" que cuando entre el botón 3 activo empiece a restar los números, pero no se como plantearlo en el código.

Gracias por todas las respuestas.

noter:

Si ya lo decía mi abuela: Nunca te acostaras sin aprender una cosa mas :smiley:
Gracias por la aclaración, ya lo entendí.

Deadpool:

Deadpool:
La primera opción:

bool descontando=false;
loop(){
if (digitalRead(BTN3) descontando=!descontando; //al pulsar enciende o apaga la cuenta atrás
if (descontando) count--;
}

Me da un error: 'digitalRead(16u)' cannot be used as a function

falta un parentesis (creo)

Tal como dices, la solución es sencilla:

loop(){
...
if (digitalRead(BTN3)) {
while(count>0){
delay(1000);
count--;
}
}
...
}

cuentaatras(){
while (count >0)
}

Entiendo que esto lo introduzco despues del loop:
if (digitalRead(BTN3)) {
while(count>0){
delay(1000);
count--;
}
}
Pero el:
cuentaatras()
{
while (count >0);
}
¿Donde lo tengo que introducir? porque por mas que lo meto me da un error: "'cuentaatras' cannot be used as a function"
Siento ser tan garrulo :frowning:
Gracias de nuevo por todas las respuestas

Perdón por la errata. En un principio iba a poner la cuenta atrás en una función separada, pero como era tan sencilla, introduje en el propio loop el código.
Es decir, con añadir dentro del loop

if (digitalRead(BTN3)) {
while(count>0){
delay(1000);
count--;
}
}

debería bastar. Eso sí, durante la cuenta atrás, el programa no va a hacer caso a ningún botón.
Saludos.

Pues va a ser que no. En teoría si que debería funcionar pero si lo añado al código tal cual, se me apagan 3 digitos y solo se queda encendido uno en 0. Tampoco me deja modificar nada (Ni subir ni bajar).
He probado a agruparlo como el resto de botones, vamos que detecte cuando está el botón activo pero tampoco a servido.
val = digitalRead(BTN3);
if (val != estadobtn3)
{
if (val == LOW)
{
if (digitalRead(BTN3)) {
while(count>0000){
delay(1000);
count--;
}
}
}
}
Y eso que pensaba que iba a ser sencillo -_-
Gracias de nuevo.

Hola de nuevo.
Si sencillo es, lo que pasa es que nos estamos liando con obviedades:
En el código que envías ahora, sobra un digitalRead. Quita en este caso el último (if digitalread(BTN3), pues pensé que el botón activaba en HIGH) y ya hará el bucle bien. Debes, además, incluir el pintado de los dígitos, pues mientras está en el bucle no los está realizando. Como tiene que estar repintando mientras esperamos, en lugar de delay usaremos un for con el repintado (habrá que calcular qué número le ponemos al for) :

val = digitalRead(BTN3);
if (val != estadobtn3)
{
	if (val == LOW) 
	{
	while(count>0000)
		{
               digit1=count / 1000;
               digit2=(count - (digit1 * 1000)) / 100;
               digit3=(count - (digit1*1000) - (digit2*100)) / 10;
               digit4=count % 10;
		for (int cuenta=0;cuenta<200;cuenta++)
			{

                          lightDigit1(numbers[digit1]);
                          delay(2);
                          lightDigit2(numbers[digit2]);
                          delay(2);
                          lightDigit3(numbers[digit3]);
                          delay(2);
                          lightDigit4(numbers[digit4]);
                          delay(2);
			}
       	       count--;
		}
	}
}
#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define Z 7
#define G 8
// Botones de pulsación analógicos
#define BTN1 14
#define BTN2 15
#define BTN3 16
// Comunes para ánodos o cátodos, según leds
#define CC1 9
#define CC2 10
#define CC3 11
#define CC4 12
byte CC[]={9,10,11,12};
// Secuencia de leds para A, B, C, D, E, Z, G
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };

//Números multiplexados
  const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b0000000, 0b0010000};

int estadobtn1 = 0;
int estadobtn2 = 0;
int estadobtn3 = 0;

int count = 0;
int val;

bool descontando=false;

void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(Z, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);  
  pinMode(BTN3, INPUT);  
  digitalWrite(BTN1, HIGH); 
  digitalWrite(BTN2, HIGH);
  digitalWrite(BTN3, HIGH);
  pinMode(CC1, OUTPUT);
  pinMode(CC2, OUTPUT);
  pinMode(CC3, OUTPUT);
  pinMode(CC4, OUTPUT);
  count = 0;
}

void loop() {
  val = digitalRead(BTN1); 
  if (val != estadobtn1 && !val && !descontando)  // Sacale && !descontando para permitir mover valor mientras descuenta
  {  
    count++;
    count %= 10000;
  }
  estadobtn1=val;

  val = digitalRead(BTN2); 
  if (val != estadobtn2 && !val && !descontando) // igual que arriba
  {  
    if (count == 0){count=9999;} 
    else {count--;}
  }
  estadobtn2=val;
  
  val = digitalRead(BTN3); 
  if (val != estadobtn3 && !val) 
  {  
    descontando=!descontando;     // Para arancar y parar el descontar desde el mismo boton
  }
  estadobtn3=val;  

  lightDigit(count);
  
  if (descontando)
  {
    count--;
    delay(1000);
    if (count==0)
    {
      descontando=false;
      count=9999;  // Pon aqu donde quedara al finalizar el descuento
    }
  }
}



void lightDigit(int number) 
{
  int digito=0;
  for (int x=0;x<4;x++)
  {
    for (int w=3;w>-1;w--){digitalWrite(CC[w], LOW);}
    digitalWrite(CC[x], HIGH);
    delay(2);
    digito=number/(10^x);
    lightSegments(digito);
    number=number-digito*(10^x);
  }

}

// A mi este bloque me da error al compilar, esta segun lo pusiste tu

void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs, bit);
  }
}

Llega tarde, pero es otra idea :slight_smile:

El código parece bueno, Marcial. La única pega es que durante el delay no va a estar intercambiando el dígito repintado, con lo que sólo va a estar iluminado uno de los cuatro dígitos. Por ello, y como no tenía mucho tiempo tiempo, puse el for como solución "para ir tirando", si no se necesitan segundos muy exactos. La solución ideal para controlar más exactamente el tiempo seria utilizar millis().

tienes razón, ni lo había pensado (es lo que tiene no probar :*)

#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define Z 7
#define G 8
// Botones de pulsación analógicos
#define BTN1 14
#define BTN2 15
#define BTN3 16
// Comunes para ánodos o cátodos, según leds
#define CC1 9
#define CC2 10
#define CC3 11
#define CC4 12
byte CC[]={9,10,11,12};
// Secuencia de leds para A, B, C, D, E, Z, G
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };

//Números multiplexados
  const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b0000000, 0b0010000};

int estadobtn1 = 0;
int estadobtn2 = 0;
int estadobtn3 = 0;

int count = 0;
int val;

bool descontando=false;
const unsigned long T_Espera=1000;                  // Tiempo de espera para velocidad de descuento
      unsigned long T_Esperado=0;                   


void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(Z, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);  
  pinMode(BTN3, INPUT);  
  digitalWrite(BTN1, HIGH); 
  digitalWrite(BTN2, HIGH);
  digitalWrite(BTN3, HIGH);
  pinMode(CC1, OUTPUT);
  pinMode(CC2, OUTPUT);
  pinMode(CC3, OUTPUT);
  pinMode(CC4, OUTPUT);
  count = 0;
}

void loop() {
  val = digitalRead(BTN1); 
  if (val != estadobtn1 && !val && !descontando)  // Sacale && !descontando para permitir mover valor mientras descuenta
  {  
    count++;
    count %= 10000;
  }
  estadobtn1=val;

  val = digitalRead(BTN2); 
  if (val != estadobtn2 && !val && !descontando) // igual que arriba
  {  
    if (count == 0){count=9999;} 
    else {count--;}
  }
  estadobtn2=val;
  
  val = digitalRead(BTN3); 
  if (val != estadobtn3 && !val) 
  {  
    descontando=!descontando;     // Para arancar y parar el descontar desde el mismo boton
    T_Esperado=millis()+T_Espera;                  
  }
  estadobtn3=val;  

  lightDigit(count);
  
  if (descontando && millis()>T_Esperado)
  {
    T_Esperado=millis()+T_Espera;
    count--;
    if (count==0)
    {
      descontando=false;
      count=9999;  // Pon aqu donde quedara al finalizar el descuento
    }
  }
}



void lightDigit(int number) 
{
  int digito=0;
  for (int x=0;x<4;x++)
  {
    for (int w=3;w>-1;w--){digitalWrite(CC[w], LOW);}
    digitalWrite(CC[x], HIGH);
    delay(2);
    digito=number/(10^x);
    lightSegments(digito);
    number=number-digito*(10^x);
  }

}

// A mi este bloque me da error al compilar, esta segun lo pusiste tu

void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs, bit);
  }
}

Buenas,
Os cuento como ha quedado la cosa.
Con el código de Marcial (En el cacho que sale error se corrige porque te faltaba un cacho de código)

    digitalWrite(segs[i], bit); //Faltaba la [i]

Aún así lo he cargado y solo sale en el display 8888 y los botones no hacen nada.

En el código de Noter si a funcionado, por fin he visto moverse los dígitos hacia atrás pero hay un problema. Cuando pulso el botón 1 para subir dígitos pasa a 0001 y automáticamente comienza la cuenta atrás a 0000. Lo mismo con el boton 2, al activarlo se pone en 9999 y ya no se puede parar. Vamos, que solo deja subir o bajar una vez y la cuenta atrás automática empieza sola sin tener que dar al botón 3.
Pero bueno... al menos ya he entendido el bucle, lo que no sé es porque se activa solo. Seguiré investigando a ver si doy con la solución.
De momento pongo el código como está hasta ahora:

// Correspondientes a los led. F se a cambiado por Z por problemas de declaracion
#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define Z 7
#define G 8

// Botones de pulsacion analogicos
#define BTN1 14
#define BTN2 15
#define BTN3 16
// Comunes para anodos o catodos, segun leds
#define CC1 9
#define CC2 10
#define CC3 11
#define CC4 12

// Secuencia de leds para A, B, C, D, E, Z, G
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };

// Activacion de numeros en multiplexado. Para Comun de catodos y para anodos.
  const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b0000000, 0b0010000};

int estadobtn1 = 0;
int estadobtn2 = 0;
int estadobtn3 = 0;
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
int digit4 = 0;
int count = 0;
int val;
int val2;


void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(Z, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);
  digitalWrite(BTN1, HIGH); // activa RPA 
  digitalWrite(BTN2, HIGH); // activa RPA 
  pinMode(CC1, OUTPUT);
  pinMode(CC2, OUTPUT);
  pinMode(CC3, OUTPUT);
  pinMode(CC4, OUTPUT);
  count = 0;
}

void loop() {
   
 
  
  val = digitalRead(BTN1); 
 if (val != estadobtn1) 
 {
   if (val == LOW) 
    {
//        for (digitalRead(BTN1); count = 0; count++ ){delay(1000);}
     count++;
     count %= 10000;
    } 
  }
  
  estadobtn1=val;

  val = digitalRead(BTN2); 
  if (val != estadobtn2) 
  {
    if (val == LOW) 
    {
      if (count == 0)
    {
      count=9999;
    } else {
      count--;
      }
    }
    estadobtn2=val;
  }
  
  //Boton 3, cuenta atras
  val = digitalRead(BTN3);
if (val != estadobtn3)
{
	if (val == HIGH) 
	{
	while(count>0000)
		{
               digit1=count / 1000;
               digit2=(count - (digit1 * 1000)) / 100;
               digit3=(count - (digit1*1000) - (digit2*100)) / 10;
               digit4=count % 10;
		for (int cuenta=0;cuenta<200;cuenta++)
			{

                          lightDigit1(numbers[digit1]);
                          delay(2);
                          lightDigit2(numbers[digit2]);
                          delay(2);
                          lightDigit3(numbers[digit3]);
                          delay(2);
                          lightDigit4(numbers[digit4]);
                          delay(2);
			}
       	       count--;
		}
	}
estadobtn3=val;
}

  
// display number
digit1=count / 1000;
digit2=(count - (digit1 * 1000)) / 100;
digit3=(count - (digit1*1000) - (digit2*100)) / 10;
digit4=count % 10;

lightDigit1(numbers[digit1]);
  delay(2);
  lightDigit2(numbers[digit2]);
  delay(2);
  lightDigit3(numbers[digit3]);
  delay(2);
  lightDigit4(numbers[digit4]);
  delay(2);
}
//Programación de los catodos o anodos comunes, según el display led invertir high o low
void lightDigit1(byte number) {
  digitalWrite(CC1, HIGH);
  digitalWrite(CC2, LOW);
  digitalWrite(CC3, LOW);
  digitalWrite(CC4, LOW);
  lightSegments(number);
}

void lightDigit2(byte number) {
  digitalWrite(CC1, LOW);
  digitalWrite(CC2, HIGH);
  digitalWrite(CC3, LOW);
  digitalWrite(CC4, LOW);
  lightSegments(number);
}

void lightDigit3(byte number) {
  digitalWrite(CC1, LOW);
  digitalWrite(CC2, LOW);
  digitalWrite(CC3, HIGH);
  digitalWrite(CC4, LOW);
  lightSegments(number);
}

void lightDigit4(byte number) {
  digitalWrite(CC1, LOW);
  digitalWrite(CC2, LOW);
  digitalWrite(CC3, LOW);
  digitalWrite(CC4, HIGH);
  lightSegments(number);
}

void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs[i], bit);
  }
}

Mil gracias por la ayuda,
un saludo

Ups, error humano :grin:

#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define Z 7
#define G 8
// Botones de pulsación analógicos
#define BTN1 14
#define BTN2 15
#define BTN3 16
// Comunes para ánodos o cátodos, según leds
//#define CC1 9
//#define CC2 10
//#define CC3 11
//#define CC4 12
byte CC[]={9,10,11,12};
// Secuencia de leds para A, B, C, D, E, Z, G
const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 };

//Números multiplexados
  const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b0000000, 0b0010000};

int estadobtn1 = 0;
int estadobtn2 = 0;
int estadobtn3 = 0;

int count = 0;
int val;

bool descontando=false;
const unsigned long T_Espera=1000;                  // Tiempo de espera para velocidad de descuento
      unsigned long T_Esperado=0;                   


void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(Z, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);  
  pinMode(BTN3, INPUT);  
  digitalWrite(BTN1, HIGH); 
  digitalWrite(BTN2, HIGH);
  digitalWrite(BTN3, HIGH);
  pinMode(CC[1], OUTPUT);
  pinMode(CC[2], OUTPUT);
  pinMode(CC[3], OUTPUT);
  pinMode(CC[4], OUTPUT);
  count = 0;
}

void loop() {
  val = digitalRead(BTN1); 
  if (val != estadobtn1 && !val && !descontando)  // Sacale && !descontando para permitir mover valor mientras descuenta
  {  
    count++;
    count %= 10000;
  }
  estadobtn1=val;

  val = digitalRead(BTN2); 
  if (val != estadobtn2 && !val && !descontando) // igual que arriba
  {  
    if (count == 0){count=9999;} 
    else {count--;}
  }
  estadobtn2=val;
  
  val = digitalRead(BTN3); 
  if (val != estadobtn3 && !val) 
  {  
    descontando=!descontando;     // Para arancar y parar el descontar desde el mismo boton
    T_Esperado=millis()+T_Espera;                  
  }
  estadobtn3=val;  

  lightDigit(count);
  
  if (descontando && millis()>T_Esperado)
  {
    T_Esperado=millis()+T_Espera;
    count--;
    if (count==0)
    {
      descontando=false;
      count=9999;  // Pon aqu donde quedara al finalizar el descuento
    }
  }
}



void lightDigit(int number) 
{
  int digito=0;
  for (int x=0;x<4;x++)
  {
    for (int w=3;w>-1;w--){digitalWrite(CC[w], LOW);}
    digitalWrite(CC[x], HIGH);
    delay(2);
    digito=number/(10^x);
    lightSegments(digito);
    number=number-digito*(10^x);
  }

}


void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    int bit = bitRead(number, i);
    digitalWrite(segs[i], bit);
  }
}