|
![]() |
Простая программа, кнопка листает страницы. |
|||||||||||||||||||
Когда размера экрана становится не достаточно под тот объем данных который хотелось бы вывести на экран, то логичным решением является пролистывание экрана (свайп страниц), с помощью одной тактовой кнопки, которая будет заведена в обработчик внешних прерываний. Иных функций на данную программу не возложено, для сохранения её максимальной простоты. Программа имеет единственный класс Control, который отслеживает нажатие клавиши и листает страницы (всегда вправо). Количество страниц может быть любым, но для навигации по многостраничной программе лучше использовать меню и одну из следующих реализаций простых программ.
class Control {
public:
Control (unsigned char ¤t_page)
{
p_current_page = ¤t_page;
page_count = 1;
page_exit = false;
}
unsigned char page_count;
bool page_exit;
unsigned char *p_current_page;
void Button_Check ();
void Page_Exit ();
};
void Control :: Button_Check () // Проверка переменной-флага нажатой кнопки "вправо"
{
unsigned char current_page = *p_current_page; // "Чтение" внешней переменной.
if (button_right) { // Если кнопка нажата.
current_page++; // Увеличиваем значение текущей страницы.
page_exit = true; // Создаем условие выхода из текущей страницы.
if (current_page > page_count)
{
current_page = 1; // Если вышли за край "книги", возвращаемся на первую страницу.
}
}
*p_current_page = current_page; // После установки текущей страницы, "запись" текущего значения во внешнюю переменнцю.
button_right = false; // Сброс состояния кнопки, может быть перенесено в условия выхода из страницы, после Page_Exit()
}
void Control :: Page_Exit () { // Переход на другую страницу. Закрашивание содержимого, сброс счетчиков и пр.
Display_Set_Color (0); // Установка черного цвета.
Display_Draw_Rectangle (0,0, Res_X-1, Res_Y-1); // Закрашивание вего экрана.
}
Каждая страница крутится в своем условно-бесконечном цикле для большей наглядности и простоты редактирования. Вся статичная информация рисуется внутри case страницы, но не в цикле. Там же создается окно и его объекты. Окон может быть несколько, это достаточно рационально по расходу памяти. Такой подход будет выглядеть рациональным даже для микроконтроллеров с 16Кб ОЗУ. Обязательным является наличие метода опроса состояния клавиши и условия выхода со страницы.
do { // ------- Бесконечный цикл программы. --------
device.page_exit = false; // Перед входом на страницы или новым циклом, отключаем условие выхода из цикла (текущей страницы).
switch (current_page)
{
case PAGE_1: {
// Создание динамичных объектов и статичного оформления страницы.
Display_Window window (100, 100, 131, 140, window_memory, 1000); // Создание окна и выделение ему памяти.
window.Set_Palitra_Color (0, BLACK); // 0 - фоновый цвет.
window.Set_Palitra_Color (1, WHITE); // По умолчанию объекты имеют цвет палитры 1
Display_Window_Fill_Rectangle rec (window, 0, 0, 31, 5); // Закрашенный прямоугольник
unsigned char dir = DOWN; // Переменная для установки направления движения прямоугольника.
Display_Set_Color (100,140,0);
Display_Draw_Rectangle (20,20, 80, 80); // Прямоугольник, статичный элемент страницы.
// --- Условно бесконечный цикл станицы 1 ------
do {
// Условие выхода из цикла страницы. Обязательное наличие в каждим страничном цикле.
if (device.page_exit) { device.Page_Exit(); break;}
// --- Установка крайних точек и метод движения прямоугольника. Можно использовать DOWN, UP, RIGHT, LEFT
if (rec.Y1<=0) { dir = DOWN; }
if (rec.Y2>=40) { dir = UP; }
rec.Move_In_Direction (dir, 1);
window.Render_Content(); // Отрисовка содержимого окна.
device.Button_Check(); // Проверка состояния кнопки. Обязательно в каждом страничном цикле.
} while (1);
break; }
Сперва создается окно и его объекты, статичные элементы не требующие анимации. В самом цикле описываются действия происходящие во время нахождения на данной странице. Надписи так же можно заносить в цикл, чтобы например менять их цвет или цвет их фона по достижению некоторого условия. Вне оконного режима это будет происходить быстрее. В целом, цикл можно было бы сделать один, под все страницы, это немного снизит размер прошивки, но это не тот случай, когда стоит экономить. Если страницы будут насыщенны графикой, окнами, методами опроса датчиков и другими условиями, если будут присутствовать различные счетчики, нагляднее будет, если под каждую страницу будет свой цикл. Разумеется если страниц не очень много. Данная программа не использует каких либо задержек и цикл страницы не предполагает что его будут как-то подтормаживать. Например чтобы сбавить частоту опроса какого-то датчика, без каких либо системных решений или задержек. Создаем счетчик, до страничного цикла, i=0; внутри цикла его инкрементируем i++; А если хотим опрашивать датчик только каждые 10 циклов if ( (I % 10) == 0) { Read_Sensor(); } В библиотеку добавлен новый метод, движение в указанную точку. Move_To_Point. На его основе, на второй странице работает «смартфоновский» переключатель. Конечно, данная реализация нужна при наличии тач скрина. Метод сохраняет значение точки назначения. То есть его можно вызвать единожды, когда произошло переключение. В остальных циклах он будет стараться доехать до указанной точки, но ничего, если указание следования в точку будет крутиться в цикле. На первой странице присутствует вариант движения с использованием метода Move_To_Direction. Схема подключения кнопки, точнее варианта подавления дребезга, вариативна в плане выбора компонентов. Данное решение относительно не плохо себя показал в случае с кнопкой-концевиком. В случае с обычной тактовой кнопкой могут потребоваться иные номиналы, в интернете масса схем на эту тему. В данном примере используется прерывание по спадающему фронту. Если изменится схема подавления дребезга, возможно, потребуются иные условия для срабатывания прерывания. Их можно изменить в Ардуиновской функции attachInterrupt. Обработчику прерываний Button_Event () не принципиально каким образом возникло прерывание, по заднему фронту или например по низкому уровню.
Статья на Дзен.
Внимание! При включенном ADB Block ссылки на стороние ресурсы не отображаются.
Статья на Дзен.
Данная программы доступна в примерах, в библиотеке Display Lib. Copyright (С) 1. 03. 2026г. Nord_Air.
|
|||||||||||||||||||
|
![]() |
|
![]() |
![]() |
|
![]() |
||||||||||||
![]() |
|
![]() |