restart y millis

Hola,
aprendiendo con arduino,

Quiero hacer funcionar un led de 7 segmentos como contador de 8 horas y vuelta a empezar de la manera más fácil,

(ya lo consegui con la función delay pero a la vez quiero poder activar por terminal serie un led, así que he intentado usar la función millis sin exito.)

Este es el código, quizás demasiado sencillo, pensado para que cuente 8 segundos y restart pero me dejo algo importante, puesto que no funciona pero tampoco me da errores de ejecución

Un saludo y gracias

// Intento de contador a ocho segundos con reseteo al final

#define RESTART asm("jmp 0x0000") // esto parece que reinicia la funcion millis

// declaracion de salidas contador led siete segmentos

const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 12;


void setup() {

// declaracion contador  LED como ouput

pinMode (a, OUTPUT);
pinMode (b, OUTPUT);
pinMode (c, OUTPUT);
pinMode (d, OUTPUT);
pinMode (e, OUTPUT);
pinMode (f, OUTPUT);
pinMode (g, OUTPUT);

}

void loop()
{
  // intento de lectura del tiempo en la funcion millis y encendido del número correspondiente

if (millis () <=2000)  {uno(); 
    if (millis () <=3000) {dos();
    if (millis () <=4000){tres ();
    if (millis () <=5000){cuatro();
    if (millis ()<=6000){cinco();
    if (millis ()<=7000){ seis();
    if (millis () <=8000){siete(); 
    if (millis () <=9000){ocho(); RESTART;
    }}}}}}}}

}


// todo lo que sigue es para encender los segmentos corresponientes, esto si funciona

void ocho()
{
digitalWrite (a,LOW);
  digitalWrite (b,LOW);
  digitalWrite (c,LOW);
  digitalWrite (d,LOW);
  digitalWrite (e,LOW);
  digitalWrite (f,LOW);
  digitalWrite (g,LOW);

}

void siete ()
{
 digitalWrite (a,LOW);
  digitalWrite (b,HIGH);
  digitalWrite (c,HIGH);
  digitalWrite (d,HIGH);
  digitalWrite (e,LOW);
  digitalWrite (f,LOW);
  digitalWrite (g,HIGH);

}

void seis ()
{
  digitalWrite (a,HIGH);
  digitalWrite (b,LOW);
  digitalWrite (c,LOW);
  digitalWrite (d,LOW);
  digitalWrite (e,LOW);
  digitalWrite (f,HIGH);
  digitalWrite (g,LOW);
 

}

void cinco ()
{
  digitalWrite (a,LOW);
  digitalWrite (b,LOW);
  digitalWrite (c,LOW);
  digitalWrite (d,HIGH);
  digitalWrite (e,LOW);
  digitalWrite (f,HIGH);
  digitalWrite (g,LOW);

}

void cuatro ()
{
  digitalWrite (a,HIGH);
  digitalWrite (b,LOW);
  digitalWrite (c,LOW);
  digitalWrite (d,HIGH);
  digitalWrite (e,LOW);
  digitalWrite (f,LOW);
  digitalWrite (g,HIGH);

}

void tres ()
{
  digitalWrite (a,LOW);
  digitalWrite (b,LOW);
  digitalWrite (c,HIGH);
  digitalWrite (d,HIGH);
  digitalWrite (e,LOW);
  digitalWrite (f,LOW);
  digitalWrite (g,LOW);

}

void dos ()
{
   digitalWrite (a,LOW);
  digitalWrite (b,LOW);
  digitalWrite (c,HIGH);
  digitalWrite (d,LOW);
  digitalWrite (e,HIGH);
  digitalWrite (f,LOW);
  digitalWrite (g,LOW);

}

void uno ()
{

  digitalWrite (a,HIGH);
  digitalWrite (b,HIGH);
  digitalWrite (c,HIGH);
  digitalWrite (d,HIGH);
  digitalWrite (e,LOW);
  digitalWrite (f,LOW);
  digitalWrite (g,HIGH);

}

void cero ()

{
  digitalWrite (a,LOW);
  digitalWrite (b,HIGH);
  digitalWrite (c,LOW);
  digitalWrite (d,LOW);
  digitalWrite (e,LOW);
  digitalWrite (f,LOW);
  digitalWrite (g,LOW);
 
}

¿Por qué no te olvidas de reiniciar el contador de millis() y pruebas algo similar a lo que te pongo (no he probado el código; deberías revisarlo y adaptarlo a lo tuyo.

Sería un contador que se decrementa cada cierto tiempo, y que cuando llega a cero, vuelve al valor inicial.
Te ayudaría para la depuración, ayudarte de salidas informativas al puerto serie, para ver cómo van las variables.

unsigned long tpas=0;
byte contadorIni=8;
byte contador;
int Periodo=1000;

void setup(){
   contador=contadorIni();
   show(contador);
   tpas=millis();
}

void loop(){
    if ((millis()-tpas)>Periodo){
        tpas=millis();
        contador--; //si resta uno al valor cero, pasa a 255, al ser de typo byte
        if (contador==255){contador=contadorIni;}
        show (contador);        
    }


}

void show(byte numero){
   switch (numero)
     case 0:
        cero();break;
     case 1:
        uno();break;
     ....... Seguir aquí.....
}