58
59
LCD_drawLine(0, 34, 127, 34, 1);
return (1);
}
И последний штрих — инициализация меню:
1
2
3
4
5
6
7
void startMenu(void) {
selectedMenuItem = (menuItem*)&m_l1i1;
dispMenu(0);
setHandler(MSG_KEY_PRESS, &keyMenu);
setHandler(MSG_DISP_REFRESH, &dispMenu);
}
Для начала хватит. В продолжении — сделать несколько меню, сделать
процедуру работы с меню реентерабельной, забабахать модель в протеусе.
Краткое описание того, что делает процедура setHandler - она привязывает
обработчик к событию. В данном случае, при возникновении события
MSG_KEY_PRESS вызовется функция keyMenu для обработки этого
события.
Для демонстрации системы меню, описанной в предыдущем посте, собрал
модель в протеусе. На базе двухстрочного LCD-индикатора,
контроллераatmega32 и пяти кнопок (влево-вправо-вверх-вниз и выбор). В
своих схемах использую джойстики от мобилок, они тоже пятипозиционные.
Также воткнул три светодиода, чтобы хоть как-то реагировать на выбор
пунктов меню.
Поскольку на экране у нас всего две строчки, решил отображение меню
сделать горизонтальным. В верхней строчке отображается родительский
пункт меню (или просто “Меню:”, если мы на верхнем уровне), во второй
строчке - текущий пункт меню. Клавишами влево-вправо выбираем
предыдущий-следующий. Клавишей вверх - возвращаемся в родительское
меню, клавиша вниз (или ОК) - заходим в выбранный пункт.
Обработка меню: