reiniciar programa

Muchas gracias por concestar tan rápido!

Pongo una parte del código ya que es un poco extenso.

Una vez definidas las variables y algunas funciones entra el void loop(), como podeis ver, si el boton de encendido se aprieta (esta en PULLUP), se va ejecutando hasta llegar a apagar(). En realidad lo que hace es dejar el lcd en blanco y esperar de nuevo a que se apriete el boton encender.

He probado con void (*myReset) (void) = 0x0 colocado donde defino las variables; pero sigue sin resetearse del todo... la primera vez lo hace todo genial, la segunda se salta pasos... Y no entiendo lo de mandar a dormir al AVR.

void apagar(){

lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Apagando sistema");
delay(1000);
lcd.clear();
digitalWrite(7,LOW);
myReset();

}

void loop() {

buttonStateEncendido=digitalRead(buttonPinEncendido);

if ( buttonStateEncendido == 0) {

if (salirMenu==0){

menu();
salirMenu=1;

};

if (salirMenu==1){

empezar();
final=1;
}

}

if (final==1){
apagar();

}
}

Muchas gracias!