CODE
/****************************************************************/
/* Menu */
/****************************************************************/
// Структура хранящая пункты меню
typedef
struct {
unsigned char __flash *itemText; // Название Пункта
void (*itemFunction)(char); // Вызываемая функция
char itemArg; // Аргумент
}
_menuItem;
_menuItem MenuItem;
// Названия
static __flash unsigned char
_max[] = {77,65,88,32,72,97,190,112,0},
_min[] = {77,73,78,32,72,97,190,112,0},
_sens[] = {171,121,179,99,191,179,184,191,0},
_timeout[] = {84,105,109,101,32,79,117,116,0},
_beep[] = {66,101,101,112,72,114,115,20,0},
_sec[] = {83,104,111,119,32,83,101,99,0},
_stime[] = {83,101,116,32,84,105,109,101,0},
_deadzone[] = {68,101,97,100,90,111,110,101,0},
_service[] = {42,42,42,42,42,42,42,42,0};
// Загрузка структуры
static _menuItem __flash MenuItems[] =
{
_max, SetMaxV, 3,
_min, SetMinV, 2,
_sens, Sensitivity, 0,
_timeout, SetTimeOut, 0,
_deadzone, SetDead, 0,
_beep, SetBeepHrs, 0,
_sec, SetShowSec, 0,
_stime, SetTime, 0,
_service, Service, 0
};
/****************************************************************/
void Menu(char inp)
{
static _menuItem __flash *_mptr = MenuItems;
switch (inp)
{
case NEXT: // Next item
if (++_mptr > &MenuItems[(sizeof MenuItems)/(sizeof (_menuItem)) - 1])
_mptr = MenuItems;
OutStrFlash(_mptr->itemText,0x01);
PrintSymbol(4,0x00);
/* Вывод следующего пункта в след. строку */
if (++_mptr > &MenuItems[(sizeof MenuItems)/(sizeof (_menuItem)) - 1])
{
_mptr = MenuItems;
}
OutStrFlash(_mptr->itemText,0x40);
if (--_mptr < MenuItems) // Set pointer to the last item
_mptr = &MenuItems[(sizeof MenuItems)/(sizeof (_menuItem)) - 1];
Dev_State = MENU;
break;
case SELECT: // Выполнение выбранного пункта
Ctrl = 0;
Dev_State = MENU;
(*_mptr->itemFunction)(_mptr->itemArg);
ClrScr();
break;
}
}
Где то так делал я , на примере ув. Леонида Ивановича. Для навигации использовал 2 кнопки.
Меню одноуровневое, но добавить ещё уровней не проблема. Вместо указателя на исполняемую функцию нужно подставить указатель на функцию подменю. Работает это дело быстро, да и места не много занимает.