Ответ: (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено SM 20 марта 2003 г. 10:49
В ответ на: Нет, наоборот - обработку каждого пункта - состояния - в свою подпрограмму. А вызывать их из единого "диспетчера". Подпрограмма всегда возвращает после себя новое состояние автомата. Никаких goto - упаси боже. отправлено SM 20 марта 2003 г. 10:27

Элементарный пример:

#define NO_MENU 0
#define MAIN_MENU 1
#define SUBMENU_1 2
#define SUBMENU_2 3
//.......

#define CODE_1 0x55
#define CODE_2 0xaa

typedef unsigned char MENUSTATE;
typedef struct _menu_data {
char isKeyPressed;
char KeyCode;
} MENUDATA,*PMENUDATA;
typedef MENUSTATE (__cdecl *MENUITEMPROC)(PMENUDATA);

extern "C" {
MENUSTATE __cdecl NoMenuProc(PMENUDATA);
MENUSTATE __cdecl MainMenuProc(PMENUDATA);
MENUSTATE __cdecl SubMenu1Proc(PMENUDATA);
MENUSTATE __cdecl SubMenu2Proc(PMENUDATA);
//.....
}


MENUITEMPROC FSM[]={ NoMenuProc,
MainMenuProc,
SubMenu1Proc,
SubMenu2Proc };


void main(void) {
// ........

MENUSTATE state=NO_MENU;
MENUDATA md;

while (1) {
// .......
state = FSM[state](&md);
}

}

//------------------

MENUSTATE __cdecl NoMenuProc(PMENUDATA pmd) {

if (!pmd->isKeyPressed) return NO_MENU; else {
switch(pmd->KeyCode) {
case CODE_1:
//.....
// Go to main menu
return MAIN_MENU;
case CODE_2:
//.....
// Go to directly to submenu 1
return SUBMENU_1;
default:
return NO_MENU;
}
}
}


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

Ответы



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

E-mail: info@telesys.ru