no realiza el cambio con "case" debido a los "delay"

Hola.

Estoy realizando una programacion para un control de salidas por medio de un solo boton, estoy utilizando la sentencia “case”, en cada caso se realiza un control de tiempo que manejo por medio de “delay” la primera seleccion si la realiza pero al intentar hacer que realize los siguientes cambios no ejecuta la seleccion, podrian ayudarme, gracias

int pin[]={53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30},a;
long f1[]={0,4,2,1}, f2[]={0,32,16,8}, f3[]={0,256,128,64}, f4[]={0,2048,1024,512}, f5[]={0,16384,8192,4096};
long f6[]={0,131072,65536,32768}, f7[]={0,1048576,524288,262144}, f8[]={0,8388608,4194304,2097152};
const int off=0, r=1, am=2, v=3;
long luces=0;
int bt1=0;
int nuevo1=0;
int seg=0;
void Sunodv1(), Sunodv2(), Sunodv3(), Sdosdv1(), Sdosdv2(), Sdosdv3(), Sdosdv4(), Stresdv1(), Stresdv2(), Sstresdv3(), Stresdv4(), Scuatrodv1(), Scuatrodv2(), Scuatrodv3(), Scuatrodv4();
void prende();
void sec1(), sec2(), sec3(), sec4();
void setup() {
for (a=0; a<24; a++){
  pinMode(pin[a],OUTPUT);
  }
Serial.begin(9600);
}

void loop() {
bt1=digitalRead(2);
if(((bt1)==HIGH)&&((nuevo1)==LOW)){
  seg=seg+1;
  Serial.println(seg);
  delay(20);
}
nuevo1=bt1;
switch (seg){
case 0:
luces=0;
prende();
break;

case 1:
sec1();
break;

case 2:
sec2();
break;

/*case 3:
sec3();
break;

case 4:
sec4();*/
}
}

void prende(){
for (a=0; a<24; a++){
  digitalWrite(pin[a],bitRead(luces,a));
   }
}

void sec1(){
  luces=f1[v]+f2[v]+f3[r]+f4[r];            //f1 y f2 en verde, f3 y 4 en rojo por 24 seg
  prende();
  delay(24000);
  Sunodv1();                                    //destello de verde de f1 y 2, f3 y f4 permanecen en rojo por 3 seg
  luces=f1[am]+f2[am]+f3[r]+f4[r];          //f1 y f2 en ambar, f3 y f4 en rojo por 3 seg
  prende();
  delay(3000);
  luces=f1[r]+f2[r]+f3[v]+f4[r];            //F1 y f2 se cambian a rojo, f3 se cambia a verde y f4 permanece en rojo por 14 seg
  prende();
  delay(14000);
  Sunodv2();                                    //Destello de verde de f3; f1, f2 y f4 permanecen en rojo por 3 seg
  luces=f1[r]+f2[r]+f3[am]+f4[r];           //f3 en ambar, f1,f2 y f4 en rojo por 3 seg
  prende();
  delay(3000);
  luces=f1[r]+f2[r]+f3[r]+f4[v];            //f3 cambia a rojo, f4 en verde, f1 y f2 permanecen en rojo por 4 seg
  prende();
  delay(4000);
  Sunodv3();                                    //Destello de verde de f4; f1, f2 y f3 permanecen en rojo por 3 seg
  luces=f1[r]+f2[r]+f3[r]+f4[am];           //f4 en ambar, f1,f2 y f3 en rojo por 3 seg
  prende();
  delay(3000);
}

void sec2(){
  luces=f1[v]+f2[r]+f3[r]+f4[r]+f5[v]+f6[r];
  prende();
  delay(9000);
  Sdosdv1();
  luces=f1[am]+f2[r]+f3[r]+f4[r]+f5[am]+f6[r];
  prende();
  delay(3000);
  luces=f1[r]+f2[v]+f3[r]+f4[r]+f5[r]+f6[v];
  prende();
  delay(9000);
  Sdosdv2();
  luces=f1[r]+f2[am]+f3[r]+f4[r]+f5[r]+f6[am];
  prende();
  delay(3000);
  luces=f1[r]+f2[r]+f3[v]+f4[r]+f5[r]+f6[r];
  prende();
  delay(9000);
  Sdosdv3();
  luces=f1[r]+f2[r]+f3[am]+f4[r]+f5[r]+f6[r];
  prende();
  delay(3000);
  luces=f1[r]+f2[r]+f3[r]+f4[v]+f5[r]+f6[r];
  prende();
  delay(9000);
  Sdosdv4();
  luces=f1[r]+f2[r]+f3[r]+f4[am]+f5[r]+f6[r];
  prende();
  delay(3000);
}

void Sunodv1(){
  for (int dv=0; dv<3; dv++){
  luces=f3[r]+f4[r];
  prende();
  delay(500);
  luces=f1[v]+f2[v]+f3[r]+f4[r];
  prende();
  delay(500);
  }
}

void Sunodv2() {
  for (int dv=0; dv<3; dv++){
  luces=f1[r]+f2[r]+f4[r];
  prende();
  delay(500);
  luces=f1[r]+f2[r]+f3[v]+f4[r];
  prende();
  delay(500);
  }
}

void Sunodv3(){
  for (int dv=0; dv<3; dv++){
  luces=f1[r]+f2[r]+f3[r];
  prende();
  delay(500);
  luces=f1[r]+f2[r]+f3[r]+f4[v];
  prende();
  delay(500);
  }
}

void Sdosdv1(){
  for (int dv=0; dv<3; dv++){
  luces=f2[r]+f3[r]+f4[r]+f6[r];
  prende();
  delay(500);
  luces=f1[v]+f2[r]+f3[r]+f4[r]+f5[v]+f6[r];
  prende();
  delay(500);
  }
}

void Sdosdv2(){
  for (int dv=0; dv<3; dv++){
  luces=f1[r]+f3[r]+f4[r]+f5[r];
  prende();
  delay(500);
  luces=f1[r]+f2[v]+f3[r]+f4[r]+f5[r]+f6[v];
  prende();
  delay(500);
  }
}

void Sdosdv3(){
  for (int dv=0; dv<3; dv++){
  luces=f1[r]+f2[r]+f4[r]+f5[r]+f6[r];
  prende();
  delay(500);
  luces=f1[r]+f2[r]+f3[v]+f4[r]+f5[r]+f6[r];
  prende();
  delay(500);
  }
}

void Sdosdv4(){
  for (int dv=0; dv<3; dv++){
  luces=f1[r]+f2[r]+f3[r]+f5[r]+f6[r];
  prende();
  delay(500);
  luces=f1[r]+f2[r]+f3[r]+f4[v]+f5[r]+f6[r];
  prende();
  delay(500);
}
}

Cuando veo delay(24000) dejé de seguir viendo el resto del código.
Usa millis(), mira el ejemplo BlinkWithoutDelay.ino del IDE y luego comanta como lo usarías, su uso no es fácil porque no reemplaza a delay()

delay en loop?

Uffff… cuando coja el primero se congela todo. No uses delay en loop, Matas el bucle, pero de infierno!!!