Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Простое меню для LCD дисплея (2004)

Непрочитано 26.07.2018, 20:50  
Aliaksandr1997
Прохожий
 
Регистрация: 26.07.2018
Сообщений: 8
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
Aliaksandr1997 на пути к лучшему
По умолчанию Простое меню для LCD дисплея (2004)

Доброго времени суток. Понадобилось сделать несложное меню. Меню построено следующим образом - имеется главный пункт и 4 подпункта. Попасть в нужный подпункт можно только через главное меню. Вот примерный вид главного меню.

Блок схема меню
http://forum.cxem.net/uploads/monthl...915de73024.png
Конструкция кода
typedef struct {
uint8_t menu;//
uint8_t submenu;// 4 подменю
}menuItem;

typedef struct Selection
{
unsigned char id; //Номер меню/подменю
unsigned char ent_f : 4; //Флаг входа в подменю
unsigned char esc_f : 4; //Флаг выхода из подменю
}SL;

enum switchVariants : byte { // Определения для переключателя пунктов меню;
MAIN_MENU, MENU_MANUAL, MENU_AUTO, MENU_SETUP, MENU_START
};
switchVariants switchPointer = MAIN_MENU; // С чего начнем цик

int main (void) {
while(1) {

}
}
Реклама:
Aliaksandr1997 вне форума  
Непрочитано 26.07.2018, 20:52  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

красивое меню. А в чем, собственно, вопрос?
Ara41 вне форума  
Непрочитано 26.07.2018, 22:11  
Aliaksandr1997
Прохожий
 
Регистрация: 26.07.2018
Сообщений: 8
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
Aliaksandr1997 на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

Посоветуйте как организовать вход и выход из главного меню (MAIN_MENU) ?

Мне нужно связать пункты меню в такой схеме

MAIN_MENU -› MENU_MANUAL -› MAIN_MENU

MAIN_MENU -› MENU_AUTO -› MAIN_MENU

MAIN_MENU -› MENU_SETUP -› MAIN_MENU

MAIN_MENU -› MENU_START -› MAIN_MENU

Создал для этого структуру
[HTML]typedef struct Selection
{
unsigned char id; //Номер меню/подменю
unsigned char ent_f : 4; //Флаг входа 4 бита — обычно ID меню в которое надо войти
unsigned char esc_f : 4; //Флаг выхода 4 бита — обычно ID меню в которое надо вернуться
}SL;

Примерно так думаю

static SL menu_[]={
{1, MENU_MANUAL, MAIN_MENU}, //Punkt 1
{2, MENU_AUTO, MAIN_MENU}, //Punkt 2
{3, MENU_SETUP, MAIN_MENU}, //Punkt 3
{4, MENU_START, MAIN_MENU}, //Punkt 4
};[/HTML]

Дальше знаний не хватает. Посоветуйте как лучше поступить?

Последний раз редактировалось Aliaksandr1997; 27.07.2018 в 20:05.
Aliaksandr1997 вне форума  
Непрочитано 27.07.2018, 00:06  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

Конечный автомат?
На "switch"?
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Эти 2 пользователя(ей) сказали Спасибо ForcePoint за это сообщение:
DmitriyVDN (27.07.2018), mike-y-k (27.07.2018)
Непрочитано 27.07.2018, 01:27  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,284
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

Aliaksandr1997, для начала сделайте картинку меню вменяемого размера (размер экрана в пикселях подойдёт) и лучше добавлять файлы через управление вложениями…

А по сути вариантов достаточно и простой конечный автомат для такого меню будет сильно прозрачней…
Первый уровень на одном switch, второй уровень уже на своих switch для каждого.
Да и покомпактнее, и прозрачней будет логика обработки
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
Aliaksandr1997 (27.07.2018)
Непрочитано 27.07.2018, 19:50  
Aliaksandr1997
Прохожий
 
Регистрация: 26.07.2018
Сообщений: 8
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
Aliaksandr1997 на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

Сообщение от mike-y-k Посмотреть сообщение
Aliaksandr1997, для начала сделайте картинку меню вменяемого размера (размер экрана в пикселях подойдёт) и лучше добавлять файлы через управление вложениями…
Вставил ниже
Сообщение от mike-y-k Посмотреть сообщение
А по сути вариантов достаточно и простой конечный автомат для такого меню будет сильно прозрачней…
Первый уровень на одном switch, второй уровень уже на своих switch для каждого.
Да и покомпактнее, и прозрачней будет логика обработки
У меня изначально управление меню и было сделано через конечный автомат
[HTML]switch (switchPointer) // Все делаем в одном операторе и одной функции;
{
case MAIN_MENU: /*** Главное меню ***/

break;

case MENU_MANUAL: /*** Ручной режим ****/

switch (mode) { // Выбор режима работы ручного режима
case EDIT_PARAM: // Режим редактирования

break;

case HEAT_ZONE:

break;

case COOL_ZONE:

break;

case STOP_PROCESS:

break;

}
break;

case MENU_AUTO: /*** Автоматический режим ****/

switch (reflowState) {
case REFLOW_STATE_IDLE:

break;
}

break;

case MENU_SETUP: /***Настройки ***/

break;

case MENU_START: /*** Пуск по заданному термопрофилю ***/


break;
}[/HTML]

Для опрос кнопок реализована отдельная библиотека, но меня допустим не устраивает код внутри обработчиков нажатий. Много лишних условий для проверки текущего пункта типа if (switchPointer == MENU_SETUP) и так для каждой кнопки . Вот с этой целью решил организовать на структуре хотя бы вход и выход (изначально if (enterMenu) { } else {} )
[HTML]void long_up(bool lg) {
if (enterMenu) { // если находимся в подменю, то
if (switchPointer == MENU_MANUAL) {
if (lg) {
if (btnupclick ‹ 3) btnupclick++; //увеличивает счетчик кнопки на 1
else btnupclick = 0; //если счетчик достиг предела положений то его надо обнулить.
lcd.setCursor(1, 2);
lcd.print(F("›"));
btn1 = mass_byte[btnupclick];
DoLong(btn1);
} else {
if (btndnclick ‹ 3) btndnclick++; //увеличивает счетчик кнопки на 1
else btndnclick = 0; //если счетчик достиг предела положений то его надо обнулить.
lcd.setCursor(1, 2);
lcd.print(F("‹"));
btn2 = mass_byte[btndnclick];
DoLong(btn2);
}
}
else if (switchPointer == MENU_SETUP) {

}
}
}[/HTML]
Миниатюры:
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 0
Размер:	10.4 Кб
ID:	131325  

Последний раз редактировалось Aliaksandr1997; 27.07.2018 в 20:06.
Aliaksandr1997 вне форума  
Непрочитано 27.07.2018, 21:22  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

Цитата:
Для опрос кнопок реализована отдельная библиотека, но меня допустим не устраивает код внутри обработчиков нажатий. Много лишних условий для проверки текущего пункта типа if (switchPointer == MENU_SETUP) и так для каждой кнопки . Вот с этой целью решил организовать на структуре хотя бы вход и выход (изначально if (enterMenu) { } else {} )
Я не понял, а какое отношение имеет обработчик нажатия кнопки к меню? Обработчик должен выдать только код кнопки, который ее идентифицирует. А дальше по коду нажатия в switch вызывать функцию подменю. А те, в свою очередь, так же вызывают свои функции. А так, с помощью своих структур Вы плодите еще больше условий.
Правильно mike-y-k посоветовал, а у Вас почти правильно все сделано. только в switch желательно вставлять не коды подменю, а вызывать функции. Когда программа находится внутри какого-то подменю (функции) ей не надо уже проверять выбрано оно или нет. Так будет даже проще.
МВА вне форума  
Эти 2 пользователя(ей) сказали Спасибо МВА за это сообщение:
Aliaksandr1997 (27.07.2018), mike-y-k (27.07.2018)
Непрочитано 27.07.2018, 21:49  
Aliaksandr1997
Прохожий
 
Регистрация: 26.07.2018
Сообщений: 8
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
Aliaksandr1997 на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

МВА, я вас понял, спасибо, попробую
Aliaksandr1997 вне форума  
Непрочитано 27.07.2018, 21:51  
Aliaksandr1997
Прохожий
 
Регистрация: 26.07.2018
Сообщений: 8
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
Aliaksandr1997 на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

Сообщение от МВА Посмотреть сообщение
Обработчик должен выдать только код кнопки
Да эта хорошая мысль, раньше где то в чужом коде такое встречал, но не додумался у себя
(http://chipenable.ru/index.php/item/218)

Последний раз редактировалось Aliaksandr1997; 27.07.2018 в 21:55.
Aliaksandr1997 вне форума  
Непрочитано 27.07.2018, 22:14  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Простое меню для LCD дисплея (2004)

А что за кнопки? Клава сканируется или кнопка подключенная к входу МК?

ЗЫ. Я набросал алгоритм для меню работающем в своем цикле. Но, если меню должно работать параллельно с программой, то тогда лучше использовать переменную статуса меню. Где каждому пункту соответствует свой бит. И, при помощи масок легко управлять входом и выходом из любого пункта меню, подменю, под-под-...меню. А сами маски оформить в виде макросов и не будет никакой головоломки.

Последний раз редактировалось МВА; 27.07.2018 в 23:11.
МВА вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
pic16f628a+lcd1601 vavilon79 Песочница (вопросы новичков) 15 20.11.2017 15:27
PIC16F876a+Nokia 5110 LCD+PICKit2 AndGrig PIC 31 02.11.2016 09:18
Подключение LCD дисплея utyfwdfkb Информация по радиокомпонентам 8 31.10.2009 01:34
Не могу разобраться с LCD init_sub Информация по радиокомпонентам 6 02.04.2004 05:40


Часовой пояс GMT +4, время: 09:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.