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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
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.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,888
Сказал спасибо: 2,959
Сказали Спасибо 3,144 раз(а) в 2,133 сообщении(ях)
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
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,163
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
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.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 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.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 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 04:40


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot