Cronómetro 5 dígitos modificación hilo de manipulable con 74HC595

Bueno pues gracias a Surbyte el código esta prácticamente terminado lo único que quedaría seria que al darle al botón cada vez que empieze desde 0 se desactivase el botón 3 segundos mientras que el crono siguiera contando y de ese modo que el cronometro no pudiese parar aunque se presionase el boton en los 3 primeros segundos, transcurrido esos segundos se pudiese parar y al volver a pulsar pasara lo mismo otra vez
Si alguien tiene alguna idea que lo comente
gracias

 /* StopWatch
* Paul Badger 2008
* Demonstrates using millis(), pullup resistors,
* making two things happen at once, printing fractions
*
* Physical setup: momentary switch connected to pin 4, other side connected to ground
* LED with series resistor between pin 13 and ground

Programa base tomado de http://playground.arduino.cc/Code/Stopwatch
*/


#define ledPin  13                  // LED connected to digital pin 13
const int buttonPin = 2;

int value = LOW;                    // previous value of the LED
int buttonState;                    // variable to store button state
int lastButtonState;                // variable to store last button state
int blinking;                       // condition for blinking - timer is timing
long interval = 100;                // blink interval - change to suit
long previousMillis = 0;            // variable to store last time LED was updated
long demoroBoton;
long startTime ;                    // start time for stop watch
long elapsedTime ;                  // elapsed time for stop watch
int fractional;                     // variable used to store fractional part of time


// Definiciones de los 74HC595

int pinLatch	= 10;	//Pin para el latch de los 74CH495
int pinDatos	= 11;	//Pin para Datos serie del 74CH495
int pinReloj	= 12;	//Pin para reloj del 74CH495

byte digitOne[10]= {
	// Codificación hexadecimal de los dígitos decimales en el display de 7 segmentos
	//0xEE, 0x82, 0xDC, 0xD6, 0xB2, 0x76, 0x7E, 0xC2, 0xFE, 0xF6};
	// Codificacion del autor del Hilo
	
	0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xb6, 0x3E, 0xE0, 0xFE, 0xF6};
	// con esta codificación los leds encienden correctamente
 
int  centenas	= 0;	//Número de las centenas 
int  decenas	= 0;	//Número de las decenas
int unidades	= 0;    //Número de las unidades
int decimas		= 0;	//Numero de las decimas
int centesimas	= 0;    //Numero de las centesimas


void setup(){


	Serial.begin(19200);
	pinMode(pinLatch, OUTPUT);
	pinMode(pinDatos, OUTPUT);
	pinMode(pinReloj, OUTPUT);
	//pinMode(buttonPin, INPUT);
	Serial.println("Cronometro Ok");

	pinMode(ledPin, OUTPUT);         // seteo el pin digital LED como salida

	pinMode(buttonPin, INPUT_PULLUP);       // buttonPin como entrada 
	digitalWrite(buttonPin, HIGH);   // activo el resistor pullup. Cablear el boton de modo que cuando se presione vaya a masa
	demoroBoton = millis()+3000UL;
        display(0);
}

void loop()
{
	// check for button press
	buttonState = digitalRead(buttonPin);                   // leo el estado del botón y lo guardo

	if (buttonState == LOW && lastButtonState == HIGH  &&  blinking == false){     // check for a high to low transition
		// if true then found a new button press while clock is not running - start the clock

		if (millis() - demoroBoton > 3000UL) {
			startTime = millis();                                // almacena el tiempo de arranque del cronómetro
			blinking = true;                                     // activar el led durante el cronometrado
			delay(5);                                            // pequeño retardo para evitar rebotes
			lastButtonState = buttonState;                       // guardo buttonState en lastButtonState para luego comparar
			Serial.println("Startime =");
			Serial.print(startTime);
			display(0);
			demoroBoton = millis();
		}
	}

	else if (buttonState == LOW && lastButtonState == HIGH && blinking == true){     
			// chequear una transición de alto a bajo 
			// si es verdadero luego encontrar una nueva presion del boton mientras el reloj corre - parar el reloj y presentar

    		        elapsedTime =   millis() - startTime;              // guardo el tiempo transcurrido
			blinking = false;                                  // apago parpadeo
			lastButtonState = buttonState;                     // guardo buttonState en lastButtonState para luego compararlo
			display(elapsedTime );
			Serial.println("ElapsedTime =");
			Serial.print(elapsedTime);

			// presento el tiempo transcurrido
			Serial.print( (int)(elapsedTime / 100L));         // divido por 1000 para convertir a segundos luego tomo el entero
		
			Serial.print(".");									// imprimo el punto decimal

			// calculo la parte fraccional
			fractional = (int)(elapsedTime % 1000L);

			// pad in leading zeros - wouldn't it be nice if
			// Arduino language had a flag for this? :)
			if (fractional == 0)
				Serial.print("000");      // add three zero's
			else if (fractional < 10)    // if fractional < 10 the 0 is ignored giving a wrong time, so add the zeros
				Serial.print("00");       // add two zeros
			else if (fractional < 100)
				Serial.print("0");        // add one zero

			Serial.println(fractional);  // print fractional part of time

		}
		else{
			lastButtonState = buttonState;                         // store buttonState in lastButtonState, to compare next time
		}
	if (blinking){ 
		display(millis() - startTime); 
	}

	// Rutina para hacer parpadear un led pin 13 indicando que esta contando.

	if ( (millis() - previousMillis > interval) ) {

		if (blinking == true){
			previousMillis = millis();                         // Recuerndo el momento en que parpadea el led

			// cambio el estado del led
			if (value == LOW)
			value = HIGH;
			else
			value = LOW;
			digitalWrite(ledPin, value);
		}
		else{
			digitalWrite(ledPin, LOW);                         // apago el led cuando no parpadea
		}
	}

}



void display(unsigned long numero){

	centenas  = numero/10000;
	numero    %= 10000;
	decenas   = numero/1000;
	numero    %= 1000;
	unidades	   = numero/100;
	numero	  %= 100;
	decimas = numero/10;
	numero    %= 10;
	centesimas = numero;
	
	digitalWrite(pinLatch, LOW);
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centesimas]);	//digitOne centesimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decimas]);		//digitOne decimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[unidades]);		// digitOne unidades
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decenas]);		//digitOne decenas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centenas]);		//digitOne centenas
	digitalWrite(pinLatch, HIGH);
}