Вот пример с установкой выходов и переходом без потери цикла void foo()
{
static int state = 0;
static int TimeMeasure = 0;
switch(state)
{
case NAME0:
if(Button1())
{
OUTPUTS(Led1, SET);
OUTPUTS(Led2, RESET);
state = NAME3;
goto m1;
}
if(Button2()){state = NAME2; break;}
TimeMeasure = 0; state = WAIT1;
break;
case NAME1:
if(Button1()){state = NAME2;}
if(Button2()){state = NAME3;}
break;
case NAME2:
if(Button1()){state = NAME1;}
if(Button2()){state = NAME3;}
break;
m1:
case NAME3:
if(Button1()){state = NAME0; break;}
if(Button2()){state = NAME1; break;}
TimeMeasure = 0; state = WAIT2;
break;
case WAIT1:
if(TimeMeasure >= 100){state = NAME3;}
break;
case WAIT2:
if(TimeMeasure >= 500){state = NAME2;}
break;
default:
state = NAME0;
break;
}
TimeMeasure++;
}