LCD CX65 и организация меню
LCD CX65 и организация меню
Заимел 5 штук дисплеев cx65. таки освоил как его подключать и даже вывел тестовую программу. и даже связал всё это удовольствие с RTOS
теперь у меня на него грандиозные планы: хочу сделать меню древовидной структуры.
то есть как в телефоне список пунктов и подпунктов и изменение параметров .
клавиатура 4х4 на тактовых кнопках (будет второй вариант на основе capsens, но это дело ближнего будущего).
конкретно сейчас промежуточный отчёт о достигнутом.
что сейчас могёт код:
инициализировать дисплей.
вывести 10 строк на дисплей.
по приёму символов "2" и "8" через UART двигать курсор по этим 10 строкам упираясь в "край" экрана.
каждое движение курсора - перерисовывание текущих 10 строк заново с инверсией цвета фона и шрифта при текущем положении курсора.
сейчас затык длиной в неделю(с перерывом на работу и отмечание др) на таком моменте:
как быть если элементов меню больше чем 10 строк что может показать экран? на ум приходит только "страницы"
то есть отображаются на первой странице элементы от 0 до 9, на вротой странице 10-19 и так далее...
в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
активно подглядываю в код автора сей статьи - http://geektimes.ru/post/255020/ но там так всё замудрено что только повесится. конечно автор молодец и иногда помогает советом. но только в крайнем случае.
кто может подсказать как сделать или в какую сторону рыть??
полная тема http://forum.easyelectronics.ru/viewtop ... 56&t=23957
теперь у меня на него грандиозные планы: хочу сделать меню древовидной структуры.
то есть как в телефоне список пунктов и подпунктов и изменение параметров .
клавиатура 4х4 на тактовых кнопках (будет второй вариант на основе capsens, но это дело ближнего будущего).
конкретно сейчас промежуточный отчёт о достигнутом.
что сейчас могёт код:
инициализировать дисплей.
вывести 10 строк на дисплей.
по приёму символов "2" и "8" через UART двигать курсор по этим 10 строкам упираясь в "край" экрана.
каждое движение курсора - перерисовывание текущих 10 строк заново с инверсией цвета фона и шрифта при текущем положении курсора.
сейчас затык длиной в неделю(с перерывом на работу и отмечание др) на таком моменте:
как быть если элементов меню больше чем 10 строк что может показать экран? на ум приходит только "страницы"
то есть отображаются на первой странице элементы от 0 до 9, на вротой странице 10-19 и так далее...
в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
активно подглядываю в код автора сей статьи - http://geektimes.ru/post/255020/ но там так всё замудрено что только повесится. конечно автор молодец и иногда помогает советом. но только в крайнем случае.
кто может подсказать как сделать или в какую сторону рыть??
полная тема http://forum.easyelectronics.ru/viewtop ... 56&t=23957
- Вложения
-
- Clock_2_LCD_IR_RTOS_V2.7z
- (55.55 КБ) 491 скачивание
Re: LCD CX65 и организация меню
Ну и где же тут "дикая" математика? Деление чисел, это все таже старая добрая арифметика.Arcanum писал(а):в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
А в вашем случае дикости быть совершенно не должно, вы же пишете код не на ассемблере
При движении курсора совершенно незачем перерисовывать все 10 строк. Достаточно перерисовать только две: предыдущий и последующий пункты меню.
Что касается страниц - это, наверное, самый простой вариант. Можно еще представить меню, как единый многострочечный текст, а на экран выводить только часть текста вокруг активного пункта меню. Тогда - да, придется весь экран "перерисовывать".
Там в easyelectronics есть же уже статьи и темы в форуме, плюс достаточно много ссылок.
Я свои менюшки писал на ассемблере исходя из разъяснений в указанных темах и могу однозначно заявить: управление меню и его отображение действительно не совсем простая задача (а для тех, кто с ними только начинает - совсем не простая!) и места в коде занимет много.
Но задача эта решаема!
Тест пройден!
Re: LCD CX65 и организация меню
а будьте добры представить пример сей арифметики и примерного алгоритма, пожалуйста.Fahivec писал(а):Ну и где же тут "дикая" математика? Деление чисел, это все таже старая добрая арифметика.Arcanum писал(а):в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.
А в вашем случае дикости быть совершенно не должно, вы же пишете код не на ассемблере
При движении курсора совершенно незачем перерисовывать все 10 строк. Достаточно перерисовать только две: предыдущий и последующий пункты меню.
Что касается страниц - это, наверное, самый простой вариант. Можно еще представить меню, как единый многострочечный текст, а на экран выводить только часть текста вокруг активного пункта меню. Тогда - да, придется весь экран "перерисовывать".
Там в easyelectronics есть же уже статьи и темы в форуме, плюс достаточно много ссылок.
Я свои менюшки писал на ассемблере исходя из разъяснений в указанных темах и могу однозначно заявить: управление меню и его отображение действительно не совсем простая задача (а для тех, кто с ними только начинает - совсем не простая!) и места в коде занимет много.
Но задача эта решаема!
Re: LCD CX65 и организация меню
Я понимаю ваш сарказм
Пример алгоритма приводить не буду, зачем повторять то, что описано в оговоренных выше источниках?
Что касается арифметики, тут действительно нет сложностей для программирования на Си и прочих высокоуровневых языках. А при использовании готовых мат.библиотек - и на ассемблере.
Вот вы предполагали использовать страничное меню. Попробую с ним.
Количество элементов (пунктов) есть константа. Пусть ей будет присвоено имя Menu_max.
Количество страниц будет зависеть от заданного размера меню и является тоже константой. Назовем ее Page_max.
Как они между собой связаны, понятно - делением на 10, т.е. на кол-во отображаемых элементов меню.
Значит: Page_max = целое от (Menu_max/10) + 1 (округление в большую сторону). Это вычисление произойдет однажды при компиляции, поскольку описано в определениях. Здесь и далее предполагаем, что нулевых значений не будет, поэтому + 1.
Номер текущей (отображаемой) страницы есть переменная, назовем ее Page_Nr.
Текущий (выбранный) элемент меню тоже переменная. Присвоим ей имя Menu_Nr.
Еще понадобится переменная - указатель на номер строки в текущей странице меню. Пусть ее имя будет Menu_P
Вот для корректного отображения вам и понадобятся вычисления этих переменных, сводящиеся к следующему:
Page_Nr = целое от (Menu_Nr/10) + 1
Menu_P = Menu_Nr - Page_Nr
А с какого элемента начинается отображаемая страница, тоже просто: Page_Nr х 10 - 9
С Новым Годом!
Пример алгоритма приводить не буду, зачем повторять то, что описано в оговоренных выше источниках?
Что касается арифметики, тут действительно нет сложностей для программирования на Си и прочих высокоуровневых языках. А при использовании готовых мат.библиотек - и на ассемблере.
Вот вы предполагали использовать страничное меню. Попробую с ним.
Количество элементов (пунктов) есть константа. Пусть ей будет присвоено имя Menu_max.
Количество страниц будет зависеть от заданного размера меню и является тоже константой. Назовем ее Page_max.
Как они между собой связаны, понятно - делением на 10, т.е. на кол-во отображаемых элементов меню.
Значит: Page_max = целое от (Menu_max/10) + 1 (округление в большую сторону). Это вычисление произойдет однажды при компиляции, поскольку описано в определениях. Здесь и далее предполагаем, что нулевых значений не будет, поэтому + 1.
Номер текущей (отображаемой) страницы есть переменная, назовем ее Page_Nr.
Текущий (выбранный) элемент меню тоже переменная. Присвоим ей имя Menu_Nr.
Еще понадобится переменная - указатель на номер строки в текущей странице меню. Пусть ее имя будет Menu_P
Вот для корректного отображения вам и понадобятся вычисления этих переменных, сводящиеся к следующему:
Page_Nr = целое от (Menu_Nr/10) + 1
Menu_P = Menu_Nr - Page_Nr
А с какого элемента начинается отображаемая страница, тоже просто: Page_Nr х 10 - 9
С Новым Годом!
Тест пройден!
Re: LCD CX65 и организация меню
количество элементов не статично.
думаю как сделать процедуру прорисовки n строк на экран (экраны разные могут быть + изменяемый размер шрифта) если количество элементов меню больше n.
на выходе должна получится процедура у которой будут входные параметры: n,m, курсор_позиция, строки для отображения.
это нужно для отображения не только элементов корневого меню, но и отобраажения "папок", приложений и строк конфигурации. что-то примерно как на видео в статье на гиктаймс
думаю как сделать процедуру прорисовки n строк на экран (экраны разные могут быть + изменяемый размер шрифта) если количество элементов меню больше n.
на выходе должна получится процедура у которой будут входные параметры: n,m, курсор_позиция, строки для отображения.
это нужно для отображения не только элементов корневого меню, но и отобраажения "папок", приложений и строк конфигурации. что-то примерно как на видео в статье на гиктаймс
Re: LCD CX65 и организация меню
с арифметикой разобрался. единственный вопрос который мешает приступить к реализации - как быть с последней страницей если она не заполнена до конца? допустим страниц пять,на четырёх по 12(10,8 какая разница - пробую написать "универсальное меню" ) элементов, а на пятой только 7.Fahivec писал(а): Количество элементов (пунктов) есть константа. Пусть ей будет присвоено имя Menu_max.
Количество страниц будет зависеть от заданного размера меню и является тоже константой. Назовем ее Page_max.
Как они между собой связаны, понятно - делением на 10, т.е. на кол-во отображаемых элементов меню.
Значит: Page_max = целое от (Menu_max/10) + 1 (округление в большую сторону). Это вычисление произойдет однажды при компиляции, поскольку описано в определениях. Здесь и далее предполагаем, что нулевых значений не будет, поэтому + 1.
Номер текущей (отображаемой) страницы есть переменная, назовем ее Page_Nr.
Текущий (выбранный) элемент меню тоже переменная. Присвоим ей имя Menu_Nr.
Еще понадобится переменная - указатель на номер строки в текущей странице меню. Пусть ее имя будет Menu_P
Вот для корректного отображения вам и понадобятся вычисления этих переменных, сводящиеся к следующему:
Page_Nr = целое от (Menu_Nr/10) + 1
Menu_P = Menu_Nr - Page_Nr
А с какого элемента начинается отображаемая страница, тоже просто: Page_Nr х 10 - 9
цикл прорисовки строк на экран без проблем заполнит от 0 до СТРОК_НА_ЭКРАН. но как быть в этом случае?
ещё вопрос:
с этим всё прекрасно! именно это я искал и над этим думал (видимо плохо я думал). но что делать если строк на экран не 10, а 12 или и вовсе 4?Page_Nr х 10 - 9
пишу и понимаю что дурак. можно просто поступить:
Page_Nr х 10 - 9 = Page_Nr х N - (N-1)
и Вас с Наступившим!
Re: LCD CX65 и организация меню
Я выше оговорился:
Я, кстати, допустил ошибку в Menu_P = Menu_Nr - Page_Nr. Получается, что для 15-го пункта и второй страницы (к примеру) номер отображаемой строчки будет равен 13 !
Поэтому должно быть: Menu_P = Menu_Nr - (Page_Nr х 10)
Если же принять, что (нумерация вагонов...) нумерация пунктов и страниц меню начинается с нуля (что очень даже логично), то арифметика упрощается на это самое "+ 1" и в конце " - 9"...предполагаем, что нулевых значений не будет, поэтому + 1.
Я, кстати, допустил ошибку в Menu_P = Menu_Nr - Page_Nr. Получается, что для 15-го пункта и второй страницы (к примеру) номер отображаемой строчки будет равен 13 !
Поэтому должно быть: Menu_P = Menu_Nr - (Page_Nr х 10)
Перед прорисовкой очистить экран.как быть с последней страницей если она не заполнена до конца?
Тест пройден!
Re: LCD CX65 и организация меню
долго думал и нарисовал это.
напишу тут чтобы не посеять, может ошибку найдёте, а я дальше кодить буду
все эти переменные в теле одной функции. меню не статично, и даже параметр MENU_STRINGS будет динамичным. пока я вникаю и сделал так как есть.
напишу тут чтобы не посеять, может ошибку найдёте, а я дальше кодить буду
Код: Выделить всё
#define TEXT_ROW_DISP 10 // количество строк на экране в длину. для меню. не более длины экрана в пикселях делёное на длину символа в пикселях. 176/14=12
#define MENU_STRINGS 23 // общее количество строк в меню. для меню
uint8_t MENU_Pages_All = (MENU_STRINGS/TEXT_ROW_DISP); // общее количество страниц
uint8_t MENU_Page_Current = (_CursorAbs/TEXT_ROW_DISP); // текущая страница
uint8_t MENU_String_TOP = (MENU_Page_Current*(TEXT_ROW_DISP-(TEXT_ROW_DISP-1))); // начальный эемент прорисовки строк меню на текущей странице
uint8_t MENU_Page_Current_Cursor_Position = _CursorAbs - (MENU_Page_Current*TEXT_ROW_DISP); // позиция курсора на текущей странице
Re: LCD CX65 и организация меню
конечный вид вычисления переменных который заработал:
что-то сам додумал но за наводку спасибо!
с задачей прорисоки и навигации меню разобрались.
следующая задача:
натянуть структуру "файлов" как в статье http://geektimes.ru/post/255020/
видео о том как работет в конце статьи
Код: Выделить всё
uint8_t MENU_Pages_All = (MENU_STRINGS/TEXT_ROW_DISP); // общее количество страниц
uint8_t MENU_Page_Current = (_CursorAbs/TEXT_ROW_DISP); // текущая страница
uint8_t MENU_String_TOP = (MENU_Page_Current*TEXT_ROW_DISP); // начальный эемент прорисовки строк меню на текущей странице
uint8_t MENU_Page_Current_Cursor_Position = _CursorAbs - (MENU_Page_Current*TEXT_ROW_DISP); // позиция курсора на текущей странице
с задачей прорисоки и навигации меню разобрались.
следующая задача:
натянуть структуру "файлов" как в статье http://geektimes.ru/post/255020/
видео о том как работет в конце статьи
Re: LCD CX65 и организация меню
нус... очередной промежуточный отчёт!
что есть сейчас и какие проблемы
есть сейчас:
1) страницы. если пунктов меню в два/три/n раз больше чем может отобразить экран то цикл прорисовки сам сориентируется и выведет курсор на нужной странице.
2) навигация по страницам. прикрутил дополнительно перелистиывание страниц по кнопкам вправо/влево (6/4). каждый раз при перелистывании курсор становится на первый пункт меню текущей страниц.
проблема:пример. 35 пунктов меню. 4 страницы соответственно. цикл рисует от 0 до 10 строк на экране. каждый раз строки перерисвоваются. но! на последней страницы рисуются только 5 строк из 10. то есть 5 элементов четвёртой страницы нарисовались но при этом нижние пять элементов предыдущей страницы остались и видны. было озвучено предложение очищать экран каждый раз перед отрисовкой строк. но это приводит к тому что экран очень неприятно моргает.
как быть господа?
форумы собсуждения этой темы
http://forum.easyelectronics.ru/viewtop ... 4491dfddf8
http://www.radiohlam.ru/forum/viewtopic.php?f=5&t=3537
http://forum.cxem.net/index.php?showtopic=157723&hl=
http://electronix.ru/forum/index.php?sh ... &p=1393328&
что есть сейчас и какие проблемы
есть сейчас:
1) страницы. если пунктов меню в два/три/n раз больше чем может отобразить экран то цикл прорисовки сам сориентируется и выведет курсор на нужной странице.
2) навигация по страницам. прикрутил дополнительно перелистиывание страниц по кнопкам вправо/влево (6/4). каждый раз при перелистывании курсор становится на первый пункт меню текущей страниц.
проблема:пример. 35 пунктов меню. 4 страницы соответственно. цикл рисует от 0 до 10 строк на экране. каждый раз строки перерисвоваются. но! на последней страницы рисуются только 5 строк из 10. то есть 5 элементов четвёртой страницы нарисовались но при этом нижние пять элементов предыдущей страницы остались и видны. было озвучено предложение очищать экран каждый раз перед отрисовкой строк. но это приводит к тому что экран очень неприятно моргает.
как быть господа?
форумы собсуждения этой темы
http://forum.easyelectronics.ru/viewtop ... 4491dfddf8
http://www.radiohlam.ru/forum/viewtopic.php?f=5&t=3537
http://forum.cxem.net/index.php?showtopic=157723&hl=
http://electronix.ru/forum/index.php?sh ... &p=1393328&
- Вложения
-
- Clock_2_LCD_IR_RTOS_V2.7z
- (57.73 КБ) 467 скачиваний
Последний раз редактировалось Arcanum 06 янв 2016, 10:53, всего редактировалось 1 раз.