Можно делать следующим образом: описываем структуру одного элемента меню, в которой пишем строку и указатель на функцию, которая вызывается по нажатию кнопки enter или подобной.
Код
typedef struct
{
char menu_str[LCD_WIDTH+1];
MENU_HANDLER_PROC func;
} S_MENU_ITEM;
MENU_HANDLER_PROC - тип-функция void func(void). описывается как
typedef void (*MENU_HANDLER_PROC)(void);
делаем процедуру вывода меню на экран
Код
void ShowMenu(S_MENU_ITEM *menu, int element0, int cursor_pos)
{
...
}
тогда процедура самого меню будет выглядеть примерно так:
Код
void Menu(S_MENU_ITEM *menu)
{
char ret_menu = 0;
int cursor = 0;
int element0 = 0;
while (!ret_menu)
{
ShowMenu(menu, element0, cursor);
switch(ch)
{
case VK_UP:
// перемещаем вверх курсор, если он не 0, либо первый выводимый элемент меню (element0)
// ...
break;
case VK_DOWN:
// то же самое, только с точностью до наоборот
// ...
break;
case VK_ENTER:
menu[element0+cursor].func();
break;
case VK_EXIT:
ret_menu = 1;
break;
}
}
}
а в обработчиках рекурсивно запускаем эту же функцию Menu, но с другими параметрами.
Можно и по-другому, но я делал так. Только структуры хранил во флэше. Отличается только запуск функции-обработчика и вывод строки (а он здесь и не описан).