[an error occurred while processing this directive]
Помогите разобраться с кодом для менюшек(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено SlavaCh 20 сентября 2005 г. 16:33

Полгода назад добрый человек прислал код для MSP430. Пытаюсь его вклеить к АВРу не получается, компилер (Кодевижн) ругается. Может кто из знатоков обоих МК подскажет что надо исправить (чтобы константы во флэши были), а заодно рассказать как этот код должен работать(что-то непонятно в массивах структур при описании - в первой строчке 4 элемента, в последующих по 3)

// Код для MSP430, на авре тоже идет, но const размещ. в ОЗУ, надо заменить на __flash
// Работает, пока хватит стека (глубина меню).
// Еще можно сделать ф-ю при выходе из меню.

typedef const struct _TMenuItem{
const char *Caption; //название пункта меню
int (*Exec)(void *); //функция, вызываемая при выборе
// int (*Exit)(void *); //функция, вызываемая при выходе
const struct _TMenuItem *Next; //следующее меню
const struct _TMenuItem *Prev; //предыдущее меню
}TMenuItem;


// Сами менюшки.
TMenuItem SubSubSubMenu1[]={
{"MAIN1",NULL,NULL,SubMenu1},
{"MAIN2",NULL,NULL},
{"MAIN3",NULL,NULL},
{"MAIN4",NULL,NULL},
{"MAIN5",NULL,NULL},
{"MAIN6",NULL,NULL},
{"MAIN7",NULL,NULL},
{"MAIN8",NULL,NULL},
{NULL,NULL,NULL}
};
TMenuItem SubSubMenu2[]={
{"SUBSUB11",NULL,SubSubSubMenu1},
{"SUBSUB12",NULL,NULL},
{"SUBSUB13",NULL,NULL},
{"SUBSUB14",NULL,NULL},
{"SUBSUB15",NULL,NULL},
{"SUBSUB16",NULL,NULL},
{NULL,NULL,NULL}
};
TMenuItem SubSubMenu1[]={
{"SUBSUB01",NULL,NULL},
{"SUBSUB02",NULL,NULL},
{"SUBSUB03",NULL,NULL},
{"SUBSUB04",NULL,NULL},
{"SUBSUB05",NULL,NULL},
{"SUBSUB06",NULL,NULL},
{NULL,NULL,NULL}
};
TMenuItem SubMenu1[]={
{"SUB1",NULL,SubSubMenu1},
{"SUB2",NULL,SubSubMenu2},
{"SUB3",NULL,NULL},
{"SUB4",NULL,NULL},
{"SUB5",NULL,NULL},
{"SUB6",NULL,NULL},
{NULL,NULL,NULL}
};
TMenuItem MainMenu[]={
{"MAIN1",NULL,NULL,SubMenu1},
{"MAIN2",NULL,NULL},
{"MAIN3",NULL,NULL},
{"MAIN4",NULL,NULL},
{"MAIN5",NULL,NULL},
{"MAIN6",NULL,NULL},
{"MAIN7",NULL,NULL},
{"MAIN8",NULL,NULL},
{NULL,NULL,NULL}
};

// При входе в меню вызываем эту функцию с указателем на MainMenu
void show_menu(TMenuItem *pCurMenu){
TMenuItem *p = pCurMenu; // pCurMenu - указатель на уровень. // p -
указатель на меню.
unsigned char cKey; // Нажатая кнопка.

lcd_printf("%s", p->Caption); // Вывод на lcd.
for(;;){
if (data_in_keyb_buf()){ // В буфере клавиатуры есть данные.
cKey = keyb_buf_get_char();
if (cKey == KEY_ENTER){ // В подменю.
lcd_clr();
if (p->Next) show_menu(p->Next);
lcd_printf("%s", p->Caption);
if (p->Exec()) p->Exec(); // Вызовем функцию при выборе.
}
if (cKey == KEY_ESC){ // В предыдущий уровень.
lcd_clr();
if (pCurMenu == MainMenu){ // Выход только из главного меню.
lcd_clr();
// Вставить если надо проверку на выход из меню.
}
return;
}
if (cKey == KEY_UP_ARROW){ // Вверх.
lcd_clr();
if(p != pCurMenu) p--;
else { // Поиск последней менюшки.
while (p->Caption) p++;
p--;
}
lcd_printf("%s", p->Caption);
}
if (cKey == KEY_DOWN_ARROW){ // Вниз.
lcd_clr();
p++;
if(!p->Caption) p = pCurMenu;
lcd_printf("%s", p->Caption);
}
}
}
}

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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru