Цитата(sind-rom @ Nov 15 2006, 20:36)

Народ, как Вы делаете меню для своих девайсов? Интересует структура. Столкнулся с проблемой: вывод на дисплей (HD44780 совместимый) меню получается малопонятной и (главное) неприспособленный для добавления новых пунктов меню. Никогда раньше не приходилось делать меню, так что научите

Может у кого есть каки-нить наработки\библиотеки?
Заранее большое спасибо...
Я, например, так делал:
Код
/* Global data type definitions */
typedef
struct _menuItem {
char flash *itemText;
void (*itemFunction)(char);
char itemArg;
}
MenuItem;
static void Run(char _dummy)
{
}
static void Stop(char _dummy)
{
}
static flash char _read[] = "Read device ",
_program[] = "Program device ",
_set[] = "Set device ",
_insert[] = "Insert ",
_edit[] = "Edit buffer ",
_clear[] = "Clear buffer ",
_append[] = "Append ",
_run[] = "Run ",
_stop[] = "Stop ";
static MenuItem __flash
MenuItems[] = {
_set, SetType, 0,
_read, 0, 0,
_program, 0, 0,
_insert, Edit, INSERT_BUFFER,
_edit, Edit, EDIT_BUFFER,
_clear, Edit, CLEAR_BUFFER,
_append, Edit, APPEND_BUFFER,
_run, Run, 0,
_stop, Stop, 0
};
//
// ** Menu -- the main menu fuction
//
void Menu(void)
{
MenuItem __flash *_mptr = MenuItems;
static __flash char _unKnown[] = "Unknown device";
for (;;)
{
Clear_LCD();
puts_P(_mptr->itemText);
switch (getchar())
{
case '+': // Next item
if (++_mptr > &MenuItems[(sizeof MenuItems)/(sizeof (struct _menuItem)) - 1]) // Set pointer to the first item
_mptr = MenuItems;
break;
case '-': // Previous item
if (--_mptr < MenuItems) // Set pointer to the last item
_mptr = &MenuItems[(sizeof MenuItems)/(sizeof (struct _menuItem)) - 1];
break;
case '!': // Do the selected menu item
if (Device->_devType==UNKNOWN_TYPE && _mptr->itemFunction!=SetType)
{
LCD_MoveCurs2(0); // Move the LCD cursor
puts_P(_unKnown); // Put the message
getchar();
break;
}
(*_mptr->itemFunction)(_mptr->itemArg);
}
}
}