from: http://telesys.ru/wwwboards/mcontrol/690/messages/60113.shtml

Typedef
struct _menuItem	{
			char flash	*itemText; //указатель на текстовый пункт???
			void		(*itemFunction)(char); //указатель на ф-цию которая должна выполняться???????
			char		itemArg;
			}
MenuItem;

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 '+':	// следующий пункт
			if (++_mptr > &MenuItems[(sizeof MenuItems)/(sizeof (struct _menuItem)) - 1])	//Установить указатель на последний елемент
				_mptr = MenuItems;
			break;
		case '-':	// Предыдущий пункт
			if (--_mptr < MenuItems)	// Установить указатель на последний елемент
				_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);
			}
		}