Меню на lcd 20х4
- Войдите на сайт для отправки комментариев
Пт, 26/04/2013 - 01:49
Делаю себе простой интерфейс для дисплея 20х4. Готовых решений за два вечера не нашёл и решил попробовать самостоятельно. Есть основное меню mainMenu(). Для первой строчки подменю upMenu() и от него ещё два субдменю speedMenu() и accelMenu(). Курсор бегать вверх вниз заставил и из главного меню в подменю перехожу при выставлении курсора и нажатии кнопки Enter. А вот как записать условие для перехода в субменю придумать знаний не хватает. Если пишу if (pos == 0 && upMenu()) компилятор ругается. Как правильно написать подобное условие в моём случае?
void mainMenu() { blankLcd(); lcd.setCursor(1,0); lcd.print("up"); lcd.setCursor(1,1); lcd.print("down"); lcd.setCursor(1,2); lcd.print("left"); lcd.setCursor(1,3); lcd.print("right"); } void upMenu() { blankLcd(); lcd.setCursor(1,0); lcd.print("speed"); lcd.setCursor(1,1); lcd.print("accel"); } void speedMenu() { blankLcd(); lcd.setCursor(1,0); lcd.print("speed val"); } void accelMenu() { blankLcd(); lcd.setCursor(1,0); lcd.print("accel val"); } //menu key ok if (buttonEnterState==HIGH) { if (pos == 0) { upMenu(); pos = 0; }
blanklcd() - очистка экрана
if (pos == 0 && upMenu()) компилятор ругается. --- у Вас функция upMenu() ничего не возвращает (void) от того и ругается, возвращаемого значения нет
А как правильно сформулировать условие перехода в подменю?
По всей видимости Вам в первую очередеь необходимо описать дерево (структуру) меню, максимальный уровень вложенности и тд...
Как описать - решение за Вами. Например как нумеруются пункты в документе: 1.2.3 - глава 1 раздел 2 параграф 3. Тогда будете знать в каком месте структуры меню вы находитесь и как реагировать на внешние события....
Доработал код. Теперь по меню бегаю как мне нужно. Но возникла другая проблема. Меню из четырёх строчек, а подменю из двух и не получается заставить курсор в подменю опускаться только на вторую строку. Если вариант
//menu key down
if (buttonRightState==HIGH) {
pos++;
lcd.setCursor(0, (pos - 1));
lcd.print(" ");
if ((pos >= 4) && ( menuStatus = 0))
{
pos = 4;
}
}
курсор всё время бегает по четырём строкам и в подменю получаются глюки.
Код для кнопки down
В приведённом варианте в подменю курсор бегает по двум строкам, но и в главном меню только по двум и теперь в главном меню глюки.
код для всех кнопок
Прошу совета и помощи.
Вот тут написано как меню организовать http://avrproject.ru/publ/menu_on_a_microcontroller_avr/1-1-0-33
Сделал пример по вышеприведённой ссылке только на две кнопки. Меню не переводится. Подскажите пожалуйста, в чём ошибка.
Особо не вникал. В некоторых условиях IF вы не сравниваете значение, а приравниваете его. Например строка 91 должна выглядеть так:
Спасибо Evgen, работает! Только одна проблемка - перехожу в четвёртую строку меню (в трёх всё отлично) и всё зависает, не работает никакая кнопка. Уже задолбался перепроверять. Может свежий взгляд увидет ошибку .
Строчка 86 точно нужна?
И еще, вложенные друг в друга if else if else... лучше заменить на конструкцию switch..case. Нагляднее будет.
Ещё раз спасибо Evgen, вы меня просто выручили. В строчке 86 и был косячок. Буду дальше наращивать.