Отговори на тема  [ 4 мнения ] 
Реализация на меню 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Вто Дек 18, 2007 3:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
такова правих преди доста време и ми е трудно да ти намеря сорса ама беше нещо от този род
Структора и масив от нея

[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 - какво да изпише


Вто Дек 18, 2007 4:05 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Иамаше по форума 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++.


Вто Дек 18, 2007 4:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Вто Дек 18, 2007 8:47 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни