Пример реализации простейшего двухуровневого текстового меню до 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();
}