Простое меню

Пример реализации простейшего двухуровневого текстового меню до 9 пунктов 1 уровня, и до 10 пунктов в каждом субменю.
создаем основу:
enum KEY_enum {
  UNSET_KEY,
  UP_KEY,
  DOWN_KEY,
  BACK_KEY,
  ENTER_KEY
};

const uint8_t menu_size[]={ // тут указывается емкость меню каждого уровня, для субменю вычитаем 1 
  2,    //menu 0 lvl
  5-1,  //sub 1
  3-1,  //sub 2
};

const char menu_array[][15]={ // отображаемые пункты
"",           //unused for 0 lvl
"menu 1",   // 1
"menu 2",   // 2
"",
"",
"",
"",
"",
"",
"",



"submenu 1 0", // 10
"submenu 1 1",
"submenu 1 2",
"submenu 1 3",
"submenu 1 4",
"",
"",
"",
"",
"",

"submenu 2 0", //20
"submenu 2 1",
"submenu 2 2",
"",
"",
"",
"",
"",
"",
"",
};
обработчик указателя:
static void Menu_Position_Handler(void){
  switch (key_flag)
  {
  case UP_KEY:
    if ((menu_position>1) && (menu_position%10)) menu_position--;
    break;
  case DOWN_KEY:
    if(menu_position){
      if ((menu_position%10) < menu_size[menu_position/10]) menu_position++;
    }
    break;
  case BACK_KEY:
    menu_position = menu_position/10;
    break; 
  case ENTER_KEY:
    if(menu_position) menu_position = menu_position*10;
    else menu_position = 1;
    break; 
  }
  key_flag=UNSET_KEY;
}
обработчик приложений:
static void Application_Handler(void){
if (menu_position){ // если указатель отличается от нуля
  if(menu_position<100) Main_Menu();
  else {
    switch (menu_position) // заводим кейсы для каждого приложения
    {
    case 0: // это для параноиков
        screen_clear();
        printN("DEBUG: Ooops! 0");
        screen_update();
      break;
/*
* нумерация кейса трехзначная:
* 1 знак - положение в главном меню (немерация с 1)
* 2 знак - положение в субменю (нумерация с 0)
* 3 знак - всегда 0 
*/
    case 100:
        Application_1(); // идем в нужное приложение
      break;
    case 210:
        Application_2();
      break;
    default:
        screen_clear();
        printN("DEBUG: Not Assig.");
        screen_update();
      Delay(1000);
      menu_position=menu_position/10;
      break;
    }
  }
}
else Main_Display(); // если указатель 0 - идем на главный экран
}
отрисовка меню:
static void Main_Menu (void){ // трехстрочное меню, псевдокод
    screen_clear();
        if (menu_position%10) {  
            printN(menu_array[menu_position-1]);
        }
        print ("> "); // печатаем указатель
        printN(menu_array[menu_position]);
        if ((menu_position%10) < menu_size[menu_position/10]) {  
        printN(menu_array[menu_position+1]);
        }
    screen_update();
}
тем временем, где то в бесконечном цикле:
  while (1)
  {
    if(key_flag) Menu_Position_Handler();
    Application_Handler();
  }

Изменено: