does this help you?
(very simple, not sure what you're trying to do)
// menu
// -----------------------------------------------------------------------------
byte pinsBut [] = { A1, A2, A3 };
#define N_BUT sizeof(pinsBut)
byte butState [N_BUT];
const int NoBut = -1;
int
chkButtons ()
{
for (unsigned n = 0; n < sizeof(pinsBut); n++) {
byte but = digitalRead (pinsBut [n]);
if (butState [n] != but) {
butState [n] = but;
delay (10); // debounce
if (LOW == but)
return n;
}
}
return NoBut;
}
// -----------------------------------------------------------------------------
struct MenuItem {
int mode;
const char *desc;
};
MenuItem menu0 [] {
{ 1, "mode1" },
{ 2, "mode2" },
{ 3, "mode3" },
};
const int MenuSize = sizeof(menu0) / sizeof(MenuItem);
int menuIdx;
int mode;
// -------------------------------------
enum { Bexit, Badv, Bsel };
int menuFlag;
int
menu (
int but )
{
if (menuFlag) { // ignore button when 1st pressed
switch (but) {
case Bexit:
break;
case Badv:
if (MenuSize <= ++menuIdx)
menuIdx = 0;
break;
case Bsel:
mode = menu0 [menuIdx].mode;
Serial.print (" menu select - ");
Serial.println (menu0 [menuIdx].desc);
return 1;
}
}
menuFlag = 1;
Serial.print (" menu - ");
Serial.println (menu0 [menuIdx].desc);
return 0;
}
// -----------------------------------------------------------------------------
const unsigned long MsecPeriod = 2000;
unsigned long msec0;
void
loop ()
{
unsigned long msec = millis ();
if (msec > msec0) {
msec0 += MsecPeriod;
switch (mode) {
default:
Serial.print ("mode ");
Serial.println (mode);
break;
}
menuFlag = 0;
}
int but = chkButtons ();
if (NoBut != but) {
if (menu (but))
msec0 = msec;
else
msec0 = msec + 5000;
}
}
// -----------------------------------------------------------------------------
void
setup ()
{
Serial.begin (9600);
for (unsigned n = 0; n < sizeof(pinsBut); n++) {
pinMode (pinsBut [n], INPUT_PULLUP);
butState [n] = digitalRead (pinsBut [n]);
}
}