Господи, аж неудобно... заставил людей отвелчься от работы и писать программу.
Но и я тоже не сидел сложа руки. Пока я буду вникать в ваш код, выложу свой. Мне интересна ваша критика.
Код
typedef __flash struct _TMenuItem
{
char title[16];
int type;
__flash struct _TMenuItem *parent;
__flash struct _TMenuItem *submenu;
} TMenuItem;
extern TMenuItem __flash MainMenu[];
extern TMenuItem __flash Search[];
extern TMenuItem __flash Options[];
extern TMenuItem __flash Channels[];
TMenuItem __flash Search[]=
{
{"Íà÷àòü", 1, MainMenu, NULL},
{"Êîí÷èòü", 1, MainMenu, NULL},
{"Âûéòè", 1, MainMenu, NULL}
};
TMenuItem __flash Sub1[]=
{
{"Sub1 A", 1, Options, NULL},
{"Sub1 B", 1, Options, NULL},
{"Sub1 C", 1, Options, NULL}
};
TMenuItem __flash Sub2[]=
{
{"Sub2 A", 1, Options, NULL},
{"Sub2 B", 1, Options, NULL},
{"Sub2 C", 1, Options, NULL}
};
TMenuItem __flash Sub3[]=
{
{"Sub3 A", 1, Options, NULL},
{"Sub3 B", 1, Options, NULL},
{"Sub3 C", 1, Options, NULL}
};
TMenuItem __flash Options[]=
{
{"Option 1", 1, MainMenu, Sub1},
{"Option 2", 1, MainMenu, Sub2},
{"Option 3", 1, MainMenu, Sub3}
};
TMenuItem __flash Channels[]=
{
{"Channel 1", 1, MainMenu, NULL},
{"Channel 2", 1, MainMenu, NULL},
{"Channel 3", 1, MainMenu, NULL}
};
TMenuItem __flash MainMenu[]=
{
{"Ïîèñê", 1, NULL , Search},
{"Êàíàëû", 1, NULL , Channels},
{"Íàñòðîéêè", 1, NULL , Options}
};
////////////////////////////////////////
void EnterMenuItem(TMenuItem __flash *point_to_menu)
{
int i;
char *s=r;
LcdClear();
for (i=0;i<3;i++)
{
LcdGotoXY(2,i+1);
sprintf(s,"%p", point_to_menu[i].title);
LcdStr(FONT_1X, s, NORMAL);
}
LcdUpdate();
}
void main ()
{
int i,j, selection_pos, submenu_n;
char *s=r;
TMenuItem __flash *current_point;
DDRD=0x00;
PORTD=0xFF;
LcdInit();
Delay();
current_point=MainMenu;
EnterMenuItem(current_point);
selection_pos=0;
LcdSelect(selection_pos);
LcdUpdate();
for(;;)
{
if (!PIND.0)
{
LcdSelect(selection_pos);
selection_pos++;
LcdSelect(selection_pos);
}
if (!PIND.1)
{
LcdSelect(selection_pos);
selection_pos--;
LcdSelect(selection_pos);
}
if (!PIND.2)
{
if (current_point[selection_pos].submenu==NULL) continue;
current_point=current_point[selection_pos].submenu;
EnterMenuItem(current_point);
selection_pos=0;
LcdSelect(selection_pos);
}
if (!PIND.3)
{
if (current_point[selection_pos].parent==NULL) continue;
current_point=current_point[selection_pos].parent;
EnterMenuItem(current_point);
selection_pos=0;
LcdSelect(selection_pos);
}
LcdUpdate();
}
Цитата
при активации пункта меню сохраняешь указатель в массиве и сдвигаешь индекс вперед, при возврате сдвигаешь индекс назад или сразу обнуляешь для возврата в главное меню.
Нравится твоя идея, но! Вспомним windows-проводник. В нем есть две кнопки - "Вверх" и "Назад". Так вот твой вариант это как раз кнопка "Назад". Вариант "Вверх" логичней и в принципе, то что я сделал, работает.
Ладно, пойду искать следующие грабли.