Вариант одной из самых простых программ для дисплея это перелистывание страниц с помощью кнопки.
Когда размера экрана становится не достаточно под тот объем данных который хотелось бы вывести на экран, то логичным решением является перелистывание экрана (свайп страниц) (не знаю, насколько применимо к экрану "перелистывание"), с помощью одной тактовой кнопки, которая будет заведена в обработчик внешних прерываний. Иных функций на данную программу не возложено, для сохранения её максимальной простоты.
Программа имеет единственный класс Control, который отслеживает нажатие клавиши и листает страницы (всегда вправо). Количество страниц может быть любым, но для навигации по многостраничной программе лучше использовать меню и одну из следующих реализаций простых программ.
Можно было бы класс реализовать в функции, но во-первых это просто сокращенный вариант уже написанного класса под многокнопочный вариант, с учетом положения курсора на каждой странице. Во-вторых подобные организации «в плюсах», как мне уже давно кажется, смотрятся намного лучше.
Вариант, когда ключевой (искомый) элемент изначально передается снаружи, а не возвращается каким-то методом, это результат моего видения, на данную организацию, на данный момент времени. Такой подход делает использование более гибким. Нет зависимости от момента создания объекта. Это типа глобальной переменной, так как предполагается что в перспективе страницу можно листать не только клавишами.
Каждая страница крутится в своем условно-бесконечном цикле для большей наглядности и простоты редактирования. Вся статичная информация рисуется внутри case страницы, но не в цикле. Там же создается окно и его объекты. Окон может быть несколько, это достаточно рационально по расходу памяти. Такой подход будет выглядеть рациональным даже для микроконтроллеров с 16Кб ОЗУ. Обязательным является наличие метода опроса состояния клавиши и условия выхода со страницы.
Сперва создается окно и его объекты, статичные элементы не требующие анимации. В самом цикле описываются действия происходящие во время нахождения на данной странице. Надписи так же можно заносить в цикл, чтобы например менять их цвет или цвет их фона по достижению некоторого условия. Вне оконного режима это будет происходить быстрее.
В целом, цикл можно было бы сделать один, под все страницы. Но если страниц не много и они будут насыщенны графикой, окнами, методами опроса датчиков и другими условиями, если будут присутствовать различные счетчики, нагляднее будет, если под каждую страницу будет свой цикл.
Данная программа не использует каких либо задержек и цикл страницы не предполагает что его будут как-то подтормаживать.
Например чтобы сбавить частоту опроса какого-то датчика, без каких либо системных решений или задержек. Создаем счетчик, до страничного цикла, i=0; внутри цикла его инкрементируем i++; А если хотим опрашивать датчик только каждые 10 циклов if ( (I % 10) == 0) { Read_Sensor(); }
В библиотеку добавлен новый метод, движение в указанную точку. Move_In_Point. На его основе, на второй странице работает «смартфоновский» переключатель. Конечно, данная реализация нужна при наличии тач скрина. Запилил, чтобы просто посмотреть как выглядеть будет. Метод сохраняет значение точки назначения. То есть его можно вызвать единожды, когда произошло переключение. В остальных циклах он будет стараться доехать до указанной точки. Но ничего, если указание следования в точку будет крутиться в цикле. На первой странице присутствует вариант движения с использованием метода Move_To_Direction.
Схема подключения экрана стандартная, с тем лишь уточнением, что в текущей версии библиотеки Display Lib pin RESET для режима SPI возвращен на свое место. И рестарт происходит силами микроконтроллера. Это я некоторое время назад находился так сказать под тлетворным влиянием интернета. Типа подключаемся с минимальным количеством проводов «RESET заведен на Vcc, Chip Select на GND». Chip Select нужен, так как SPI используется для SD карты, тут без вариантов. Ну а RESET по крайней мере для SPI я решил что можно оставить на Vcc. Но как показала практика, при перепрошивке, довольно редко, конечно, но бывает что дисплей не стартует, приходится помогать кнопкой на плате микроконтроллера. А раньше такого не было.
Схема подключения кнопки, точнее варианта подавления дребезга, вариативная в плане выбора компонентов. Данное решение относительно не плохо себя показало в случае с кнопкой-концевиком. В случае с обычной тактовой кнопкой могут потребоваться иные номиналы, в интернете огромная масса схем на эту тему. В данном примере используется прерывание по спадающему фронту. Если изменится схема подавления дребезга, возможно, потребуются иные условия для срабатывания прерывания. Их можно изменить в функции attachInterrupt. Обработчику прерываний Button_Event () не принципиально каким образом возникло прерывание, по заднему фронту или например по низкому уровню.
Работоспособность схемы оцениваю на 93%. Для 100% варианта в примере есть описание для организации задержки без delay. Задержка будет происходить сама собой, во время закрашивания страницы, требуется из метода перенести сброс состояния кнопки right_button=false;
Программа так же не перегружается излишней графикой, чтобы являться шаблоном для типового решения.
Заполнил так же библиотечные <keyword> связанные с оконным режимом, давно что-то откладывал… Теперь в скетче многое подсвечивается.
Пример добавлен в библиотеку, в раздел Programms.
Чуть обновленный вариант: