Menu switch case

Hola a todos de nuevo y gracias por las respuestas otra vez.
Esta tarde estuve leyéndome un libro de C, preguntando por la univerdad y con la ayuda de ustedes he conseguido empezar a hacer que el código funcione un poco.

Lo pongo a continuación:

int led = 13;
int boton = 2;
int numeropulsaciones;
int contador;

void setup () {
pinMode (led, OUTPUT);
pinMode (boton, INPUT);
Serial.begin (9600);
}

void loop () {
//contador = digitalRead (boton);
if (digitalRead (boton) == HIGH){
numeropulsaciones ++;
Serial.print (numeropulsaciones);
}
if (numeropulsaciones == 3)
numeropulsaciones = 0;

switch (numeropulsaciones) {
case 0:
apagado ();
break;

case 1:
encendido ();
break;

case 2:
parpadeo ();
break;

case 3:
fading ();
break;
}

delay (100);
}

void apagado () {
digitalWrite (led, LOW);
}

void encendido () {
digitalWrite (led, HIGH);
}

void parpadeo () {
/* Iniciar desbordamiento del timer 0 con el
tiempo del parpadeo deseado.
Luego se envía una función que hace toggle del LED. */
}

void fading () {
/* Iniciamos el desbodamienton con el ancho del pulso PWM
en cada desbordamiento llamamos a la funcion para modificar
el ciclo del PWM */
}

El problema que tengo ahora es que para que el programa no se me quede colgado parpadeando y no responda necesito tener el tmr0 con el tiempo que desee y hacer que al producirse un desbordamiento me realice lo que quiera. Lo mismo con el fading.

Voy a mirar el post de eureka de chambri que creo que le vi un problema similar.

Un saludo