ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
272329 Топик полностью
Лeoнид Ивaнoвич (15.09.2011 10:54, просмотров: 607) ответил mazur на Мне чего-то не хватает. Не могу понять что считать состоянием автомата в обработке меню, а что свести в макрос или подпрограмму. Расскажите, пожалуйста как у вас работает меню.
Пример выдернул из генератора PG-872. Определяю коды меню: enum { MNU_NO, //код отсутствия меню MNU_SPLASH, //код меню splash screen MNU_INFO, //код меню информации MNU_ERROR, //код меню ошибки MNU_OUTS, //код меню OUTS MNU_STEPO, //код меню установки шага для OUTS MNU_SYNC, //код меню SYNC MNU_STEPS, //код меню установки шага для SYNC MNU_SERV, //код меню сервиса MNU_SHOW }; //код меню показа splash и info Описываю функции-обработчики каждого пункта меню: void Mnu_Splash(bool ini); //меню индикации заставки void Mnu_Info(bool ini); //меню информации об устройстве void Mnu_Error(bool ini); //меню индикации ошибки void Mnu_Outs(bool ini); //меню выходных каналов void Mnu_StepO(bool ini); //меню редактирования шага void Mnu_Sync(bool ini); //меню входа синхронизации void Mnu_StepS(bool ini); //меню редактирования шага void Mnu_Serv(bool ini); //меню сервиса void Mnu_Show(bool ini); //меню показа рекламы В основном цикле вызываю обработчик меню: void Menu_Exe(bool t) { if(t) { if(MenuTimer) MenuTimer--; //обработка таймера меню } KeyCode = Keyboard_GetCode(); //чтение кода нажатой кнопки bool MnuIni = Menu != DispMenu; //признак необходимости прорисовки switch(Menu) //выполнение обработчиков меню { case MNU_SPLASH: Mnu_Splash(MnuIni); break; //меню индикации заставки case MNU_INFO: Mnu_Info(MnuIni); break; //меню информации об устройстве case MNU_ERROR: Mnu_Error(MnuIni); break; //меню индикации ошибки case MNU_OUTS: Mnu_Outs(MnuIni); break; //меню OUTS case MNU_STEPO: Mnu_StepO(MnuIni); break; //меню шага OUTS case MNU_SYNC: Mnu_Sync(MnuIni); break; //меню SYNC case MNU_STEPS: Mnu_StepS(MnuIni); break; //меню шага SYNC case MNU_SERV: Mnu_Serv(MnuIni); break; //меню SERVICE case MNU_SHOW: Mnu_Show(MnuIni); break; //меню SHOW } if(KeyCode != KEY_NO) //если кнопка не обработана, то { Sound_Note(); //звуковой сигнал нотификации KeyCode = KEY_NO; //кнопка обработана } Keyboard_SetCode(KeyCode); //установка кода обработанной кнопки } Ну и как пример, один из обработчиков пункта меню: void Mnu_Splash(bool ini) { if(ini) //если требуется прорисовка, то { LCD_Picture(Splash); //вывод картинки LCD_Update(); //обновление дисплея MenuTimer = ms2sys(SPL_TMV); //загрузка таймера меню splash screen CfgOk = FPGA_Configurate(); //загрузка конфигурации FPGA Setup_Read(); //инициализация настроек Vals_Read(0); //инициализация параметров и железа DispMenu = Menu; //снятие требования прорисовки } if(KeyCode != KEY_NO || //если нажата кнопка или !MenuTimer) //если переполнение таймера, то { Menu = MNU_INFO; //запрос меню информации KeyCode = KEY_NO; //кнопка обработана } }