Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Реализация на меню
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5226
Страница 1 от 1

Автор:  Ки4о [ Вто Дек 18, 2007 3:25 pm ]
Заглавие:  Реализация на меню

От няколко дена се мъча са реализирам меню на С ама стигнах до под кривата круша.Имам 4 (Up,Down,Set,Esc) бутона и ЛСД,контролер и периферия.
Та някой може ли да даде идея как се прави.Търсих из гооглето.Работат е там че искам да реализирам меню в меню,нещо от сорта:
RUN
SETUP <-
Това <- ми е указател кое съм избрал,чрез натискане на Up/Down.След избора при натискане на Set примерно се влиза в меню SETUP и отново се
изписва меню подобно на горното и пак се повтаря процедурата.Правил съм подобно нещо на асемблер преди години но си беше голям гърч.На С стигна до изписване изписване на буквите на дисплея,мести се стрелката и от там насетне - ядец.Та някой може ли да помогне ?

Автор:  TheWizard [ Вто Дек 18, 2007 4:05 pm ]
Заглавие: 

такова правих преди доста време и ми е трудно да ти намеря сорса ама беше нещо от този род
Структора и масив от нея

[code]
Up, Down, Set, Esc, Line1, Line2,
0: 2, 1, @Edit, @Menu, "TEST 0", "PROBA 0"
1: 0, 2, @Edit, @Menu, "TEST 1", "PROBA 1"
2: 1, 0, @Edit, @Menu, "TEST 2", "PROBA 2"
[/code]

Up/Down - на кой ред от масива да иде
Set/Esc - коя функция да изпълни
Lines - какво да изпише

Автор:  Nikola Kirov [ Вто Дек 18, 2007 4:16 pm ]
Заглавие: 

Иамаше по форума 2-3 теми по въпроса.
Реализира се най добре с структура с която се описва менюто и поведението му.
Ето ти един жокер от нещо готово.
Код:
#define TYPE_MENU                   1
#define TYPE_FUNCTION_FOR_START     2
#define TYPE_FUNCTION_FOR_SET       0

typedef void (*PFVOID)(void);
typedef void (*PFCHAR)(char in);





//================================================================== Menu Structure
struct MenuStr
{
  char __flash *String;
  char __flash *StringHead;
  char ConfigA;
  char ConfigB;
  char P1;
  char P2;
  char P3;
  char P4;
  char P5;
  char P6;
  char P7;
  char MenuFunction;
};
extern __flash MenuStr   MenuArr[];


//===================================================================  Stack Menu
struct MenuStackStr
{
  char CurrMenu;
  char SelectPos;
  char SelectPosType;
};
extern __near  MenuStackStr   MenuStack[];
extern   char                 MenuStackP;
#define CURRENT_MENU      MenuStack[MenuStackP].CurrMenu      // Number of current menu
#define SELECT_POS        MenuStack[MenuStackP].SelectPos     // Selected position of current menu
#define TYPE_OF_CURR_ROW  MenuStack[MenuStackP].SelectPosType // Type of position of selected position in current menu


extern void MenuDraw();           // Draw Current menu
extern void MenuGetButton();      // Work whit current menu
extern void PushMenu(char in);    // Push new menu
//--------------------------------------------------------------------------------


//==================================================================== Function For Start Arr
struct FunctListStruct
{
  PFVOID PFunct;
  char __flash *Name;
};
extern  __flash FunctListStruct FunctListArr[];

//==================================================================== Function For Set Value Arr
struct FunctSettVallStruct
{
  char __flash *Name;
  PFCHAR PFunct;
};



extern  __flash FunctSettVallStruct FunctSetValueArr[];
extern  __near  char FunctSetValueString[];                  /// This array is return value for functions in FunctSetValueArr

extern  __flash  PFCHAR MenuFunctArr[];                       /// This function take control every getbutton cycle


Това е написано доста грозно но по новите неща които съм правил са по трудни за разбиране.
Ще пробвам да обясня идеята.
struct MenuStr
{
char __flash *String; Това е името на подменюто
char __flash *StringHead; Това се изписва като хедър на съответното меню
char ConfigA; Това и следващото съдържат флагове и параметри на менюто
char ConfigB;
char P1; P1-P7 Параметри на менюто
char P2;
char P3;
char P4;
char P5;
char P6;
char P7;
char MenuFunction;
}

MenuStackStr се ползва за да съхраниш състоянието на менютата преди да отвориш следващото подменю и възстановяване на най горното след затварянето му.

Как изглежда като картинка може да видиш в подфорума за логическия анализатор. Там в някоя от темите имаше картинки.
Така на C беше първия вариант на това меню.
Това на картинката е вече на C++ и повече не съм реализирал меню на C но идеята е същата и при C++.

Автор:  Zdrav [ Вто Дек 18, 2007 8:47 pm ]
Заглавие: 

Реализацията зависи много от типа LCD и компилатора, после от процесора и организацията на самите менюта.
Според мен най-удобно се реализира на С++. Правил съм го и на чист ANSI С, но впоследствие осъзнах че в процеса на усъвършенстване на кода се опитвам да направя това което компилатора на С++ може да направи вместо мен.
Предполагам че LCD е буквено цифров, двуредов, а компилатора е някой за PIC.
Моят жокер е - масив от const указатели към функции. Със стрелките нагоре/надолу намаляваш/увеличаваш с единица една променлива, която ти е индекс в този масив. При натискане на бутона "SET"("OK") извикваш функцията от позицията в масива. А тази функция е входната ти точка в новото меню. Всяко от менютата има по един масив от указатели към функции, по една променлива която е индекс в масива, по една функция която е входна точка в менюто и т.н. Писмените обяснения биха били най-удобни под формата на код, но едва ли ще ти свърши работа моя, а и реализацията на меню беше една от важните начални стъпки в писането на С/С++ за мен навремето. Стъпка която е най-добре всеки да направи сам.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/