а зачем для каждой задержки новое состояние? Можно как-то так делать:
unsigned char SM;
unsigned char SM_save;
unsigned int delay;
delay--; // каждую ms в прерывании таймера
switch (SM)
{
case 1:
if (нужна_задержка)
{
SM_save = SM;
delay = 1000;
SM = Zaderzka;
}
break;
case 2:
if (нужна_задержка)
{
SM_save = SM;
delay = 5000;
SM = Zaderzka;
}
break;
case Zaderzka:
if (delay == 0)
SM = SM_save;
break;
}