Мой пример, может сгодится.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 16 апреля 2004 г. 17:04
В ответ на: вопрос по ICCAVR указатель на функцию в описании класса как правильно инициализировать. отправлено Julien 16 апреля 2004 г. 16:38


/* 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 last 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);
}
}
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru