Всем добрый вечер. Проблема такая. Необходимо реализовать меню на сенсорном экране. Принцип работы следующий. 1 Выводим блок кнопок меню. 2 Нажимаем на кнопку и попадаем в Нужный блок. Сделал примерно так if( p.x > 300 && p.x < 320 && p.y > 85 && p.y < 155 && buttonEnabled) { buttonEnabled = false; //Disable button // Тут блок выбранного меню если при нажатии координаты совпали то зашли в блок } Теперь в этом блоке, либо не зависимо от блока выводить кнопкудля возврата на главный экран. Как мне вернуться назад? Пример кода, Код (C++): #include <Adafruit_TFTLCD.h> #include <Adafruit_GFX.h> #include <TouchScreen.h> void setup() { Serial.begin(9600); tft.reset(); tft.begin(0x7575); tft.setRotation(1); tft.fillScreen(BLACK); ///Кнопка меню на главной странице tft.setCursor(273,217); tft.setTextColor(WHITE); tft.setTextSize(3); tft.print("Страница меню 1"); void loop() { TSPoint p = ts.getPoint(); //Get touch point if (p.z > ts.pressureThreshhold) { p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320); p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240); if( p.x > 300 && p.x < 320 && p.y > 85 && p.y < 155 && buttonEnabled) { buttonEnabled = false; //Disable button pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); tft.fillScreen(BLACK); tft.setCursor(50,50); tft.setTextColor(WHITE); tft.print("MENU 1 OK"); // Теперь необходимо сделать возврат на предыдущую страницу, как это сделать? //Тоесть надо чтоб снова появился блок Страница меню 1 } Все перепробовал, нужно сделать что то типа Код (C++): void softReset() { asm volatile ("jmp 0"); } Спасибо всем за помощь.
Для красивой организации многоуровневых меню используют структуры, элементами которых выступают название пункта и указатель на процедуру, которая выполняется в момент активации данного пункта меню. Для не сложных менюшек прокатывает конечный автомат. Решение "в лоб", как у вас, чревато простыней кода и запутыванием логики. Погуглите вначале теорию конечных автоматов.
Простое меню сделать я могу через swich либо if. Но это не очень красиво, вы правы. Хотя для одного двух уровней меню прокатит. Конечные автоматы почитаю, спасибо за совет. Только если можете подскажите как выйти из блока if обратно Может есть какая книга почитать по теме. Просто я с ардуиной начал в этом году. Раньше писал простые программки на PHP.
Из блока if можно выйти только по goto, но это очень не красивый метод. Обдумайте сначала весь алгоритм, я никогда не использую goto. Читать любые книги по С и алгоритмам, но практика - на первом месте.
Про GOTO я уже понял, и еще про глобальные переменные и.тд. Про конечные автоматы я слышу впервые, хотя возможно я их использовал в PHP раньше, просто для меня они были обычным кодом или функциями. То есть получается что конечный автомат это процедура, или функция выбора необходимых задач в зависимости от того или иного условия. Для меня важно понять принцип работы того или иного кода, и только тогда я могу правильно действовать. Код можно сократить используя массивы данных, но с другой стороны множественные массивы будут еще больше путать начинающего. Для меня проще так. Код A Выводит меню на главный экран. На пример кнопки A,B,C,D Код B Выполняет Действие которое должно произойти при нажатии на любую из кнопок A,B,C,D По сути для меню можно использовать SWICH.
одна процедура отрисовывает кнопки в зависимости от их состояния. вторая сканирует тач и меняет это состояние кнопок. третья запускает нужный код в зависимости от состояния кнопок. все процедуры в лупе исполняются постоянно. это самый примитивный метод.