contador de 4 digitos

cool , gracias me quedo a la espera de los que usan los integrados.

Ese ya funciona, porque no lo pruebas?

si ese lo se usar pero es sin multiplexear o shift register y para lo k necesito hacer, necesito salvar muchos pins...

este k tengo lo limpie un poco y funciona en un 90% lo unico es k blink una minima cosa.. lo subire a proteus y lo puedes ver, pero recuerda k al proteus no estar a la velocidad real se ben como separados pero en realidad se ven 90% estables...

arduino en proteus doble digitos 00.zip (19.1 KB)

el codigo es este ...

const int latchPin= A1;
const int clockPin = A2; ///// shift register 74HC595
const int dataPin = A0;

#define CA1 4   //// digito 1
#define CA2 5   //// digito 2
#define CA3 6   //// digito 3
#define CA4 7   //// digito 4

int botonUp = 3;   ///// boton acender 
int botonDown = 2; ////  boton bajar
int cambio = 0;
int botonPress ;
int boton_No_Press ;
int botonPress2 ;
int boton_No_Press2 ;

const int energisarTiempo = 10;

boolean energisar ( int pin ){
boolean contador = 0;
boolean Press;
boolean NoPress;

do {
Press =digitalRead ( pin);
if ( Press != NoPress) {
  contador = 0;
 NoPress = Press;
}
else
{
contador = contador + 1;
}
delay (1);
}
while ( contador < energisarTiempo);

return Press;
}

 void actualizar ()
{
switch ( cambio ) {
  
case 10:   ////////////////// ( 50 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010 ); 

      digitalWrite(CA3, LOW);
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 

     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;
  
  case 9:   ////////////////// ( 45 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11001100); 

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);

 shiftOut(dataPin, clockPin, MSBFIRST, B11011010); 
 
     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 8:    ////////////////// ( 40 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11001100); 

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 

     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 7:    ////////////////// ( 35 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10011110); 

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010); 

    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
break;

case 6:     ////////////////// ( 30 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10011110); 
    //take the latch pin high so the LEDs will light up:
      digitalWrite(CA3, LOW);
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 
    //take the latch pin high so the LEDs will light up:
    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
break;

case 5:     ////////////////// ( 25 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10110110); 
  
    digitalWrite(CA3, LOW);
    digitalWrite(CA4, HIGH);
    numberToDisplay%10;
    digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010); 
 
    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
 break;

case 4:     ////////////////// ( 20 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10110110); 

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 

    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
break;

case 3:    ////////////////// ( 15 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B00001100); 

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010); 

     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 2:     ////////////////// ( 10 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B00001100); 
    //take the latch pin high so the LEDs will light up:
      digitalWrite(CA3, LOW);
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 } 
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 
    
     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 1:    ////////////////// ( 05 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 
   
      digitalWrite(CA3, LOW);   
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010); 
    //take the latch pin high so the LEDs will light up:
      digitalWrite(CA3, HIGH);
      digitalWrite(CA4, LOW);
      numberToDisplay/10%10;
      digitalWrite(latchPin, LOW);
 }
break;

case 0:     ////////////////// ( 00 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110); 
  
   digitalWrite(CA1, HIGH);
   digitalWrite(CA2, HIGH);
   digitalWrite(CA3, LOW);
   digitalWrite(CA4, LOW);
   digitalWrite(latchPin, LOW);
 }
break; 
  }
}
  
void setup ()
{
  Serial.begin ( 9600);
pinMode ( botonUp, INPUT);
pinMode ( botonDown, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  
   pinMode(CA1, OUTPUT);
  pinMode(CA2, OUTPUT);
   pinMode(CA3, OUTPUT);
  pinMode(CA4, OUTPUT);
}

void loop ()
{
botonPress = digitalRead ( botonUp );
if ( botonPress != boton_No_Press) {
if ( energisar ( botonUp) ){
cambio ++;
if ( cambio > 10 ) {
  cambio = 10;
}
}
}
boton_No_Press  = botonPress;
////////////////////////////////////////////////
botonPress2 = digitalRead ( botonDown );
if ( botonPress2 != boton_No_Press2) {
if ( energisar ( botonDown) ){
cambio --;
if ( cambio < 0 ) {
  cambio = 0;
}
}
}
boton_No_Press2  = botonPress2;

actualizar ();

}

Que te parece usar dos 595 y no consumir 4 pines mas para comandar los LED?
O sea con 3 pines comandas todo?
Te queda todo el Arduino para lo que gustes?

Ahora te lo dibujo y te lo posteo en Proteus.

Y k codigo usaria el mismo k tengo o como..

Bueno acá esta el segundo caso.

Ya que Hcorniel requiere mínimo uso de pines esta versión también de Nick Gammon me pareció muy interesante.

Simulaicón y sketch adjuntados

falta agregar los dos pulsadores y eliminar la parte del código que actua como contador de segundos que para Hcorniel no tienes sentido.
Es igual al caso anterior respetando lo que aquí esta.

A ver si puedes con la tarea.

Explico algo del programa.
Todo el trabajo lo hace la rutina del timer.
Solo debes actuar sobre now que es la variable que luego el programa presenta en los 4 LEDs

Si pones los 2 pulsadores y haces que now suba o baje tienes lo que quieres

595.zip (22.8 KB)

tengo un problema los archivos no se abren , cuando lo intento abrir en proteus sale bien pero cuando le doy a iniciar me da este error

y el codigo tambien me da este error.

lo de proteus no es muy importante lo puedo hacer yo, pero necesito conocer el codigo.

gracias.

Pero debes recompilar el archivo Arduino, y poner la ruta en el Arduino UNO del Proteus, por eso te da error. Es obvio que mi ruta no es la tuya.

Si pero no pueso abrir el codigo no se abre para recopilarlo

Como no se abre, edita el nombre y ponlo sin espacios. Ponle el nombre que gustes.

const int dataPin  = A0;
const int latchPin = A1;
const int clockPin = A2; ///// shift register 74HC595

int botonUp = 3;   ///// boton acender 
int botonDown = 2; ////  boton bajar
int cambio = 0;
int botonPress ;
int boton_No_Press ;
int botonPress2 ;
int boton_No_Press2 ;

const int energisarTiempo = 10;

boolean energisar ( int pin ){
boolean contador = 0;
boolean Press;
boolean NoPress;

do {
Press =digitalRead ( pin);
if ( Press != NoPress) {
  contador = 0;
 NoPress = Press;
}
else
{
contador = contador + 1;
}
delay (1);
}
while ( contador < energisarTiempo);

return Press;
}

 void actualizar ()
{
switch ( cambio ) {
  
   case 10:     ////////////////// ( 50 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
  
  case 9:     ////////////////// ( 45 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
  
  case 8:     ////////////////// ( 40 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
  
  case 7:    ////////////////// ( 35 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10011110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 6:     ////////////////// ( 30 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10011110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 5:     ////////////////// ( 25 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10110110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
 break;

case 4:     ////////////////// ( 20 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10110110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 3:    ////////////////// ( 15 )/////////////////
 
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b00001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 2:     ////////////////// ( 10 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b00001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 1:    ////////////////// ( 05 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
 
break;

case 0:     ////////////////// ( 00 )/////////////////
 digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break; 
  }
}
  
void setup ()
{
  Serial.begin ( 9600);
pinMode ( botonUp, INPUT);
pinMode ( botonDown, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop ()
{
botonPress = digitalRead ( botonUp );
if ( botonPress != boton_No_Press) {
if ( energisar ( botonUp) ){
cambio ++;
if ( cambio > 10 ) {
  cambio = 10;
}
}
}
boton_No_Press  = botonPress;
////////////////////////////////////////////////
botonPress2 = digitalRead ( botonDown );
if ( botonPress2 != boton_No_Press2) {
if ( energisar ( botonDown) ){
cambio --;
if ( cambio < 0 ) {
  cambio = 0;
}
}
}
boton_No_Press2  = botonPress2;

actualizar ();

}

ya lo pude hacer con 2 shift register y solo use los 3 pines , no se si esta muy organizado, quizas si se pueda acortar seria perfecto pero al menos funciona bien..si pueden limpiarlo mejor seria perfecto...

NOTA

muy importante no se porque, si me pueden explicar... por alguna razon que desconozco .. si se fijan en esto para shiftOut los digitos tuve que cambiarlo a como si fueran de anodo, osea tuve que poner que encendieran cuando estaban en ( 0 ) y apagado en ( 1 ).. no se porque me di cuenta experimentando que al ponerlo en 1 no hacia nada y no se porque lo puse en 0 y funciono jejejeee como dice por errores se descubren cosas..

shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 ); // digitos
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );  // numeros

Y lo que te pase yo que?

Gracias Survyte.

Pero no eh podido abrir el codigo le eh cambiado el nombre y nada no me deja hacer nada. Si pudieras poner el codigo seria perfecto ..

Acabo de bajarlos y les cambie el nombre a 595 .ino y .pdsprj y funcionan perfectos.
No entiendo que problema tienes.

Los subo de nuevo.

#include <SPI.h>

const byte LATCH 				= 10; // latch Pin

const byte MAX_DIGITS 			= 4;
const byte TIME_BETWEEN_DIGITS 	= 8;  // Periodo de blanqueo entre digitos en mseg

// Mascara de cada pin para que el LED se ponga ON

const unsigned int DIG1  = 0x0200;  // Q1 de segundo IC
const unsigned int DIG2  = 0x1000;  // Q4 de segundo IC
const unsigned int DIG3  = 0x2000;  // Q5 de segundo IC
const unsigned int DIG4  = 0x0002;  // Q1 de primer IC

const unsigned int SEGA  = 0x0400;  // Q2 de segundo IC
const unsigned int SEGB  = 0x4000;  // Q6 de segundo IC
const unsigned int SEGC  = 0x0008;  // Q3 de primer IC
const unsigned int SEGD  = 0x0020;  // Q5 de primer IC
const unsigned int SEGE  = 0x0040;  // Q6 de primer IC
const unsigned int SEGF  = 0x0800;  // Q3 de segundo IC
const unsigned int SEGG  = 0x0004;  // Q2 de primer IC
const unsigned int SEGDP = 0x0010;  // Q4 de primer IC
         
// que segmento se ilumina de cada digito 
const unsigned int digitPatterns [15] = {
 SEGA | SEGB | SEGC | SEGD | SEGE | SEGF,  	// 0
 SEGB | SEGC,  								// 1
 SEGA | SEGB | SEGD | SEGE | SEGG,  		// 2
 SEGA | SEGB | SEGC | SEGD | SEGG,  		// 3
 SEGB | SEGC | SEGF | SEGG,  				// 4
 SEGA | SEGC | SEGD | SEGF | SEGG,  		// 5
 SEGA | SEGC | SEGD | SEGE | SEGF | SEGG,  	// 6
 SEGA | SEGB | SEGC,  						// 7
 SEGA | SEGB | SEGC | SEGD | SEGE | SEGF | SEGG,  // 8
 SEGA | SEGB | SEGC | SEGD | SEGF | SEGG,  	// 9
 0,  										// space
 SEGG,  									// hyphen
 SEGA | SEGB | SEGC| SEGE | SEGF | SEGG,  	// A
 SEGA | SEGE | SEGF | SEGG,  				// F
 SEGD | SEGE | SEGF,  						// L
};
// cuanto tiempo dejo el dígito ON 
const byte digitOnTimes [15] = { 3, 1, 3, 3, 2, 3, 3, 2, 3, 3, 0, 0, 3, 3, 2 };
// index into digits
const unsigned int digits [4] = { DIG1, DIG2, DIG3, DIG4 };

// 0 to 9 are themselves in the patterns array
//  there are the other entries:
#define PAT_SPACE 	10
#define PAT_HYPHEN 	11
#define PAT_A 		12
#define PAT_F 		13
#define PAT_L 		14

// que voy a mostrar (0 ao 15, mas  0x10 para encender el punto decimal)
// mirar arriba (ej. 1 muestra 1)
volatile byte ledOutput [MAX_DIGITS];

// variables globales usadas por la interrupcion ISR 
unsigned int countdown;
byte digit;

//******************************************************************
//  Timer2 Interrupt Service es invocada por el hardware cada 1ms = 1000 Hz
//  16Mhz / 128 / 125 = 1000 Hz
//  prescaler 128
//  OCR2A  = 124; recordar que es 0 relativo o sea si quiero 125 comparo con 124+0=125

ISR (TIMER2_COMPA_vect) 
{
   
  // sigo haciendo lo que estaba haciendo antes
  if (countdown-- > 0)
    return;
    
  if (digit >= MAX_DIGITS)  {
    digit = 0;
    countdown = TIME_BETWEEN_DIGITS;
    // período de blanqueo para permitir que el chip y los LED se apaguen
    digitalWrite (LATCH, LOW);
    SPI.transfer (0);
    SPI.transfer (0);
    digitalWrite (LATCH, HIGH);
    return;
    } // terminé con todos los dígitos
  
  // Pongo todo los dígitos en 1
  unsigned int output = DIG1 | DIG2 | DIG3 | DIG4;

  // Pongo en LOW el digito deseado.
  output &= ~digits [digit];

  // Activo los segmentos deseados 
  output |=  digitPatterns [ledOutput [digit] & 0xF];
   
  // agrego el punto decimal si es necesario
  if (ledOutput [digit] & 0x10)
    output |= SEGDP;
     
  // envio el resultado a los 595 1 y 2
  digitalWrite (LATCH, LOW);
  SPI.transfer (highByte (output));
  SPI.transfer (lowByte (output));
  digitalWrite (LATCH, HIGH);
     
  // ajusto el tiempo para permitir los diferentes números de segmentos
  countdown = digitOnTimes [ledOutput [digit] & 0xF] ;
  
  // paso al próximo digito
  digit++;
  
}  // fin del vector TIMER2_COMPA_vect


void setup ()   {
  
  SPI.begin ();
  
  // configuro Timer 2
  // Timer 2 - nos da 1 mS de intervalo de conteo
  // 16 MHz clock (62.5 nS per tick) - presescalado por 128
  // incremento del contador cada 8 uS = 62.5nseg x 128 = 8000 nseg = 8 useg
  // si contamos 125 veces 8 us nos da exactamente 1000 uS (1 mS)

  TCCR2A = 0;              // paro el timer 2
  TCCR2B = 0;
  TCCR2A = _BV (WGM21) ;   // CTC mode
  OCR2A  = 124;            // cuenta ascendente hasta 125  (cero relativo!)
  TIMSK2 = _BV (OCIE2A);   // habilito la interrupción Timer2 Interrupt (cada 1 mS)
  TCNT2 = 0;               // reseteo contador
  TCCR2B =  _BV (CS20) | _BV (CS22) ;  // arranco el timer con un prescaler de 128

} // fin del setup


void loop () 
{

  unsigned long now = millis () / 100;
 
  noInterrupts ();

  for (int i = 0; i < 4; i++)   {
    ledOutput [3 - i] = now % 10;
    now /= 10;   
  }

  // turn leading zeroes into spaces    
  for (int i = 0; i < 4; i++)   {
    if (ledOutput [i] == 0)
      ledOutput [i] = PAT_SPACE;
    else
      break;
  }
  
  // punto decimal cada 1 decima de segundo 
  ledOutput [2] |= 0x10;
  interrupts ();
  
  delay (10);
}   // end of loop

Aca te pongo el codigo pero en el .zip estan el código y el proyecto en Proteus

595.zip (22.7 KB)

holaa lo termine de esta forma

Contador sumatico 5.zip (18.2 KB)

tendras el codigo Hcorniel

No revivas hilos viejos.
Crea tu propio hilo o usa lo que esta disponible.
Lee las normas del foro por favor!!