Вопрос по написанию меню

Vortex111

✩✩✩✩✩✩✩
13 Авг 2022
2
0
Здравствуйте! Нужна помощь с написание меню, пожалуйста.
Делал многостраничное меню по инструкциям из видео на канале Заметки Ардуинщика, и столкнулся с такой вот проблемой: на первой странице меню, указатель выводится, но если открыть вторую страницу меню то указателя уже нет. Так же не получается сделать вложенное меню, если зайти в это вложенное меню, то его нельзя будет листать. Помогите пожалуйста.
 

Вложения

  • 6.2 KB Просмотры: 12

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
C++:
void printPointer(uint8_t pointer) {
  // Символьный указатель - лучший выбор в многостраничном меню
  // Указатель в начале строки

  oled.setCursor(0, pointer%4);
  oled.print(">");
  // Можно еще в конце

  // Указатель в виде прямоугольной рамки со скругленными углами
  /*oled.roundRect(0, pointer * 8, 127, (pointer * 8) + 6);*/
  // Указатель в виде битмапа (картинки)
  /*oled.drawBitmap(0, pointer * 8, ptr_bmp, 10, 8);*/
}
все логично у тебя экран разделен на 4 сектора а курсор выводишь на 8. Сравни со своим
 

Vortex111

✩✩✩✩✩✩✩
13 Авг 2022
2
0
@Normalek, Спасибо тебе добрый человек!!! Все получилось! А как быть со вложенным меню не знаешь?
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@Vortex111, знаю. if (ok.isClick()) { в loop то есть ты грубо говоря мену работает при нажатой кнопке, надо код переписывать. Cсамый простой вход в цыкал
C++:
void func(void) {
    static int8_t pointer = 0;
    while (true) {
      // Переменная указатель

      /* Кнопки */
      up.tick();                 // Опрос кнопок
      down.tick();
      ok.tick();

      if (up.isClick() or up.isHold()) {                // Если кнопку нажали или удерживают
        pointer = constrain(pointer - 1, 0, ITEMS - 1); // Двигаем указатель в пределах дисплея
      }

      if (down.isClick() or down.isHold()) {
        pointer = constrain(pointer + 1, 0, ITEMS - 1);
      }

      if (ok.isClick()) {   // Нажатие на ОК - переход в пункт меню
        if(!pointer) break; //виходим и цыкла
            switch (pointer) {  // По номеру указателей располагаем вложенные функции (можно вложенные меню)
              case 1: return; break;
              case 1: func(); break;  // По нажатию на ОК при наведении на 0й пункт вызвать функцию
              case 2: func1();break;
              case 3: func2();break;
              case 4: func3();break;
              case 5: func4(); break;
   
            // И все остальные
        }
      }

      /* меню */
      oled.clear();           // Очищаем буфер
      oled.home();            // Курсор в левый верхний угол
 
      if (pointer < 4) {      // Первая страница
        oled.print            // Вывод всех пунктов
        (F(
           " Наза\r\n"
           " Настройка1\r\n"
           " Настройка2\r\n"
           " Настройка3\r\n"
         ));
      }

      else if (pointer < 8 ) {// Вторая страница
        oled.print  
        (F(
           " Настройка1\r\n"
           " Настройка2\r\n"
           " Настройка3\r\n"
           " Настройка4\r\n"
         ));
   
      }
      else if (pointer < 12 ) oled.print(F( " Настройка1\r\n" ));
      printPointer(pointer);
        // Вывод указателя
      oled.update();          // Выводим кадр на дисплей
    }
}
ну это не правильно, будет лучше по нормальному переписать

@Vortex111, воспользуйтесь готовыми библиотеками. Блага их прудь пруди
 
Изменено:
  • Лойс +1
Реакции: Vortex111