Код: Выделить всё
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); //выполнить ф-цию с параметром....???
}
}
Спасибо
в CodeVisionAVR 2.05.3