cronometro avanti e indietro

salve, il mio nuovo progetto consiste nel creare una specie di cronometro con un display a 7 segmenti che parte da 0 e arriva fino a 9 per poi ricominciare, se premo un bottone nel frattempo il cronometro conta al contrario. vi faccio un esempio per capire meglio:
il cronometro arriva fino a 7, io premo il pulsante e comincia a contare al contrario tornando indietro a 6

il codice che ho sviluppato è questo:

const int a = 3;
const int b = 4;
const int c = 5;
const int d = 6;
const int e = 7;
const int f = 8;
const int g = 9;
const int h = 10;
const int bottone=2;
int statoBottone;
int pulse;
int i;
const int periodo=500;
int j=0;

void numero(int n) {
  {
    switch(n)
    {
      case 0:

  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, HIGH);
  digitalWrite (d, HIGH);
  digitalWrite (e, HIGH);
  digitalWrite (f, HIGH);
  digitalWrite (g, HIGH);
  digitalWrite (h, LOW);
  break;
      case 1:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, LOW);
  digitalWrite (d, LOW);
  digitalWrite (e, HIGH);
  digitalWrite (f, LOW);
  digitalWrite (g, LOW);
  digitalWrite (h, LOW);
  break;
  case 2:
  digitalWrite (a, LOW);
  digitalWrite (b, LOW);
  digitalWrite (c, HIGH);
  digitalWrite (d, HIGH);
  digitalWrite (e, HIGH);
  digitalWrite (f, HIGH);
  digitalWrite (g, LOW);
  digitalWrite (h, HIGH);
  break;
  case 3:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, HIGH);
  digitalWrite (d, LOW);
  digitalWrite (e, HIGH);
  digitalWrite (f, HIGH);
  digitalWrite (g, LOW);
  digitalWrite (h, HIGH);
 break;
 case 4:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, LOW);
  digitalWrite (d, LOW);
  digitalWrite (e, HIGH);
  digitalWrite (f, LOW);
  digitalWrite (g, HIGH);
  digitalWrite (h, HIGH);
  break;
  case 5:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, HIGH);
  digitalWrite (d, LOW);
  digitalWrite (e, LOW);
  digitalWrite (f, HIGH);
  digitalWrite (g, HIGH);
  digitalWrite (h, HIGH);
  break;
  case 6:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, HIGH);
  digitalWrite (d, HIGH);
  digitalWrite (e, LOW);
  digitalWrite (f, HIGH);
  digitalWrite (g, HIGH);
  digitalWrite (h, HIGH);
  break;
  case 7:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, LOW);
  digitalWrite (d, LOW);
  digitalWrite (e, HIGH);
  digitalWrite (f, HIGH);
  digitalWrite (g, LOW);
  digitalWrite (h, LOW);
  break;
  case 8:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, HIGH);
  digitalWrite (d, HIGH);
  digitalWrite (e, HIGH);
  digitalWrite (f, HIGH);
  digitalWrite (g, HIGH);
  digitalWrite (h, HIGH);
  break;
  case 9:
  digitalWrite (a, LOW);
  digitalWrite (b, HIGH);
  digitalWrite (c, HIGH);
  digitalWrite (d, LOW);
  digitalWrite (e, HIGH);
  digitalWrite (f, HIGH);
  digitalWrite (g, HIGH);
  digitalWrite (h, HIGH);
  break;
      }
   }
 };

void setup() {
  Serial.begin(9600);
  pinMode (a, OUTPUT);
  pinMode (b, OUTPUT);
  pinMode (c, OUTPUT);
  pinMode (d, OUTPUT);
  pinMode (e, OUTPUT);
  pinMode (f, OUTPUT);
  pinMode (g, OUTPUT);
  pinMode (h, OUTPUT);  
  pinMode (bottone, INPUT);
}

void loop(){
  statoBottone=digitalRead(bottone);
  if(statoBottone==1){
    pulse=1-pulse;
    delay(1000);
    }
  if(pulse==1){
    for(i=j; i<=j+1; i+=1){
      numero(i);
      delay(periodo);
      j=i;
     }
   }
  else{
    for(i=j;i>=j-1; i-=1){
      numero(i);
      delay(periodo);
      j=i;
      }
    }
 }

qualche idea?

Buona norma nei programmi single thread è non bloccare mai il flusso di esecuzione su un singolo compito. In poche parole cerca di non mettere mai in attesa il programma nel loop.
Detto questo:
All'inizio del loop verifica se il pulsante è stato premuto (includi un debouncing software o meglio sia software che hardware) in caso affermativo modifichi un flag che indicherai con un bool (false crescente, true decrescente).
Verifichi quanto tempo è passato dall'ultimo aggiornamento del display, se è passato piu di un secondo incrementi o decrementi una variabile con il numero da far apparire e modifichi i digital output per apportare le dovute modifiche al display.