Tengo unas consultas acerca de unos códigos de cronómetros en arduino uno

Saludos tengo unas consultas sobre unos códigos de cronómetros en arduino uno en los que he estado estudiando uno es de un cronometro descendente de 4 dígitos usando 74HC595 y arduino uno el otro es similar es cronometro ascendente pero en 5 dígitos de cuenta de milisengundos donde tiene un botón para el inicio paro y reset al mismo tiempo, la consulta es si pueden ayudarme en que al menos uno cuente en minutos y segundos y 2 botones uno inicio y paro y el otro reiniciar a 0 el cronometro y que este detenido hasta volver a iniciarlo, no se si aun disponen de tiempo, he visto unos códigos descritos en los post siguientes Cronometro manipularle con 74hc595 que es el cronometro descendente de 4 dígitos en que al cambiar:

unsigned long Cronometro = 0;
a
unsigned long Cronometro = 1;
y
if (bStartTime){
if (ComparoCronometro - millis()> 1000UL) {
if (Cronometro > 0){
Cronometro -= 1; cambiar el signo de menos por signo mas
a
if (bStartTime){
if (ComparoCronometro - millis()> 1000UL) {
if (Cronometro > 0){
Cronometro += 1; signo mas

El cronometro al presionar el botón de start stop inicia la cuenta ascendente de un segundo a la vez hasta llegar a 5959 pero no comprendo la forma de poner un botón que reinicie el cronometro a 0 y deshabilitar el botón de incremento ya que no lo requiero, estoy experimentando con arduino ya que soy nuevo en esto pero si capto bastante lo del código. estoy probando en proteus 8.5.

El otro post es el siguiente: Cronómetro 5 dígitos modificación hilo de manipulable con 74HC595 donde el cronometro tiene un solo botón de inicio, para y reset, pero al dar el reset el cronometro inicia nuevamente sin esperar la orden de inicio, y el cronometro es mas un contador de 999.99 de 5 dígitos siendo 3 para segundos pero no cuenta 60 segundos ni 60 minutos ya que al llegar a 59 segundos pasa a 60 y cuenta corrido.

Agradezco la ayuda si pueden o desean.

Agrego los códigos de ambos cronómetros:

Cronometro manipulable con 74hc595

#define data 2
#define clock 3
#define LATCH 4

/* Constantes útiles */
// Tomados de <DateTime.h>
#define SECS_PER_MIN  (60UL)
#define SECS_PER_HOUR (3600UL)
 
/* Macros útiles para obtener el tiempo transcurrido */
#define numeroDeSegundos(_time_) (_time_ % SECS_PER_MIN)  
#define numeroDeMinutos(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) 

const byte digito[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
const byte IncrMinPin = 12;
const byte StartCronPin = 11;

unsigned long StartTime = 0;
byte IncrementoMin = 0;
byte IncrementoMinLast = 0;
byte StartCronometro = 0;
byte StartCronometroLast = 0;
unsigned long timeCronometro = 0;
unsigned long Cronometro        = 1;
unsigned long ComparoCronometro;
bool bStartTime = false;

void setup()
{
 Serial.begin(9600);
 Serial.println("Contador descendente");
 Serial.println("Incr.Minutos = sube de a 1 minutos");
 Serial.println("Start/Stop = controla cronómetro");
 pinMode(clock, OUTPUT); 
 pinMode(data , OUTPUT);
 pinMode(LATCH, OUTPUT);

 pinMode(11, INPUT);
 pinMode(12, INPUT);

 
}

void loop()

{
 IncrementoMinLast = IncrementoMin;
 IncrementoMin = digitalRead(IncrMinPin); 
 if ( IncrementoMin == HIGH && IncrementoMinLast == LOW){ 
 StartTime += 1;
 if (StartTime >= 95) // máximo 95 minutos. 
   StartTime = 95;          // Si esta mal cambiar por 60 min o el valor que desees
 time(StartTime*60);
 Serial.println(StartTime);
 Cronometro = (unsigned long) StartTime * 60UL;
 
 }    

 StartCronometroLast = StartCronometro;
 StartCronometro = digitalRead(StartCronPin); 
 if( StartCronometro == HIGH && StartCronometroLast == LOW){
 bStartTime = !bStartTime; // Cada pulso cambia el estado de prendido a apagado.

 if (bStartTime) { // Si arranco, entoncer cargo contador descendente con valor StartTime
 Serial.print("Cronometro = ");
 Serial.println(Cronometro);
 ComparoCronometro = millis()+1000UL;
 }
 }

    if (bStartTime){ 
     if (ComparoCronometro  - millis()> 1000UL) {
     if (Cronometro > 0){
     Cronometro += 1;
     ComparoCronometro = millis()+1000UL;
     time((unsigned int) Cronometro);
     
     if (Cronometro == 0){
     bStartTime = false;   
     }
   delay(100);
 }}} }   

void time(unsigned long val){  
  int minutos;
  Serial.print("Crono = ");
  Serial.print(Cronometro);
  Serial.print(" Time = ");
  Serial.print(val);
  Serial.print(" Min= ");

  if (val < 3600) 
   minutos = numeroDeMinutos(val);
  else 
     minutos = numeroDeMinutos(val)+60;

  Serial.print(minutos);
  Serial.print(" Seg= ");
  Serial.println(numeroDeSegundos(val));
  
  unsigned int presentoTime = minutos*100 + numeroDeSegundos(val);
  display(presentoTime);
}

void display(unsigned int numero)
{
 int minmiles = numero / 1000;
 numero %= 1000;
 int mincentenas = numero / 100;
 numero %= 100;
 int segdecenas = numero / 10;
 numero %= 10;
 int segunidades = numero;

 digitalWrite(LATCH, LOW);
 shiftOut(data, clock, MSBFIRST, digito[segunidades]);
 shiftOut(data, clock, MSBFIRST, digito[segdecenas]);
 shiftOut(data, clock, MSBFIRST, digito[mincentenas]); 
 shiftOut(data, clock, MSBFIRST, digito[minmiles]); 
 digitalWrite(LATCH, HIGH);
}

En este he cambiado lo descrito arriba y espero su ayuda el otro código lo he probado pero corre como un contador ascendente 99999 y el único botón que usa inicia pausa y reinicia el cronometro automáticamente, No agrego el otro código porque excede lo máximo permitido agradezco la ayuda.