Агрессивно пишет PHP
-11 / 3 / 0
Регистрация: 29.11.2022
Сообщений: 48
Записей в блоге: 1
1

Съезжает текст влево при переключении экранов

10.01.2025, 21:53. Показов 646. Ответов 5

Author24 — интернет-сервис помощи студентам
Помогите мне с экраном ssd1306. Я объявил три функции отображения экранов меню (они ниже)
экран 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void menu1_screen(){
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  // Display static text
  display.setTextSize(1);
  display.println(utf8rus("Выберите режим"));
  display.drawLine(0,10,128,10,WHITE);
  display.fillRoundRect(48, 17, 32, 32, 4, WHITE); //задний фон значка ноты
  display.fillCircle(56, 40, 3, BLACK);//нота:
  display.drawLine(59, 40, 59, 25, BLACK);
  display.drawLine(59, 25, 73, 21, BLACK);
  display.drawLine(59, 26, 73, 22, BLACK);
  display.drawLine(73, 21, 73, 36, BLACK);
  display.fillCircle(70, 36, 3, BLACK);
  display.drawLine(128-13, 24, 128-3, 32, WHITE);// начало стрелки вправо
  display.drawLine(128-13, 25, 128-3, 33, WHITE);
  display.drawLine(128-13, 26, 128-3, 34, WHITE); 
  display.drawLine(128-13, 40, 128-3, 32, WHITE);//начало нижней части стрелки вправо
  display.drawLine(128-13, 41, 128-3, 33, WHITE);
  display.drawLine(128-13, 42, 128-3, 34, WHITE);
  display.setCursor(7,54);
  display.println(utf8rus("mp3-файлы с SD-карты"));
  display.display();
  display.invertDisplay(true);
  while(1==1){
    if(digitalRead(13)==1){
      while(digitalRead(13)==1){
      }
      display.clearDisplay();
      display.invertDisplay(false);
      menu2_screen();
      break;
    }
  }
}

экран2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void menu2_screen(){
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  // Display static text
  display.setTextSize(1);
  display.println(utf8rus("Выберите режим"));
  display.drawLine(0,10,128,10,WHITE);
  display.fillCircle(64,32,16,WHITE);
  display.fillTriangle(61,26,70,32,61,38, BLACK);
  display.drawLine(13, 24, 3, 32, WHITE);// начало стрелки влево
  display.drawLine(13, 25, 3, 33, WHITE);
  display.drawLine(13, 26, 3, 34, WHITE); 
  display.drawLine(13, 40, 3, 32, WHITE);//начало нижней части стрелки влево
  display.drawLine(13, 41, 3, 33, WHITE);
  display.drawLine(13, 42, 3, 34, WHITE);
  display.drawLine(128-13, 24, 128-3, 32, WHITE);// начало стрелки вправо
  display.drawLine(128-13, 25, 128-3, 33, WHITE);
  display.drawLine(128-13, 26, 128-3, 34, WHITE); 
  display.drawLine(128-13, 40, 128-3, 32, WHITE);//начало нижней части стрелки вправо
  display.drawLine(128-13, 41, 128-3, 33, WHITE);
  display.drawLine(128-13, 42, 128-3, 34, WHITE);
  display.setCursor(26,54);
  display.println(utf8rus("Демо-мелодии"));
  display.display();
  display.invertDisplay(true);
  while(1==1){
    if(digitalRead(13)==1){
      while(digitalRead(13)==1){
      }
      display.clearDisplay();
      display.invertDisplay(false);
      menu3_screen();
      break;
    }
    if(digitalRead(12)==1){
      while(digitalRead(12)==1){
      }
      display.clearDisplay();
      display.invertDisplay(false);
      menu1_screen();
      break;
    }
  }
}

экран3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void menu3_screen(){
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  display.setTextSize(1);
  display.println(utf8rus("Выберите режим"));
  display.drawLine(0,10,128,10,WHITE);
  display.drawBitmap(48, 16, settings_logo, 32,32, WHITE);
  display.drawLine(13, 24, 3, 32, WHITE);// начало стрелки влево
  display.drawLine(13, 25, 3, 33, WHITE);
  display.drawLine(13, 26, 3, 34, WHITE); 
  display.drawLine(13, 40, 3, 32, WHITE);//начало нижней части стрелки влево
  display.drawLine(13, 41, 3, 33, WHITE);
  display.drawLine(13, 42, 3, 34, WHITE);
  display.setCursor(19,54);
  display.println(utf8rus("Настройки плеера"));
  display.display();
  display.invertDisplay(true);
  while(1==1){
    if(digitalRead(12)==1){
      while(digitalRead(12)==1){
      }
      display.clearDisplay();
      display.invertDisplay(false);
      menu2_screen();
      break;
    }
  }
}

Эти три фрагмента кода также содержат код для опроса кнопок (их 2, на 12 и 13) и он в конце каждого фрагмента
Проблема вот в чем:
При переключении экранов правой кнопкой (13) всё ок, но когда хочу налево (12 кнопка) текст начинает сильно съезжать влево. Помогите справиться с этой проблемой! Где ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2025, 21:53
Ответы с готовыми решениями:

При переключении слайдеров в slick слайдер съезжает блок
Установила два слайда с помощью slick слайдера, которые переключаются между собой при нажатии на ссылку выше. При переключении с одно...

При адаптации фото съезжает влево
Доброго времени суток! Мне нужно адаптировать фото на сайте для мобильной версии в css, но пока не знаю как, фото съезжает влево. Кто...

Блок съезжает влево при уменьшении окна браузера
При уменьшении окна браузера до "25%" блок id="left" не много съезжает влево, не понятно почему Вот html код: <html> ...

Текст при печати съезжает
Шалом! Не подскажете в чём дело и как пофиксить съезжающий текст? Картридж заправили и теперь стал печатать дефектный текст. Я так...

5
 Аватар для COKPOWEHEU
4027 / 2573 / 430
Регистрация: 09.09.2017
Сообщений: 11,491
11.01.2025, 18:16 2
Цитата Сообщение от Don_Patison Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void menu1_screen(){
...
  display.invertDisplay(true);
  while(1==1){
    if(digitalRead(13)==1){
      while(digitalRead(13)==1){
      }
      display.clearDisplay();
      display.invertDisplay(false);
      menu2_screen();
      break;
    }
  }
}
Что это за жесть? Ладно дисплей инвертируете непонятно зачем. Но рекурсивно вызывать функцию меню саму из себя! Скорее всего, вам повезло, и компилятор распознал хвостовую рекурсию. Но вообще-то так делать нельзя.
Цитата Сообщение от Don_Patison Посмотреть сообщение
При переключении экранов правой кнопкой (13) всё ок, но когда хочу налево (12 кнопка) текст начинает сильно съезжать влево.
Когда исправите рекурсию, попробуйте добавить явную перерисовку по кнопке. Или, скажем, кнопку влево для 1 экрана, чтобы он перерисовал сам себя.
0
Агрессивно пишет PHP
-11 / 3 / 0
Регистрация: 29.11.2022
Сообщений: 48
Записей в блоге: 1
12.01.2025, 17:29  [ТС] 3
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
вызывать функцию меню саму из себя!
Я вызываю функцию другого меню =)
Разве так нельзя?

Добавлено через 19 минут
Я сделал отрисовки другим способом. Я убрал тот бред из кода функций отрисовки меню (цикл с опросом кнопок).
Теперь у меня просто в void start есть код отрисовывающий вырхнюю стргку:
C++
1
2
3
4
5
6
7
8
display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  display.setTextSize(1);
  display.println(utf8rus("Выберите режим"));
  display.drawLine(0,10,128,10,WHITE);
  display.display();
  display.invertDisplay(true);
и в коде void loop теперь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void loop() {
  if(digitalRead(rightbtn)==0){
    while(digitalRead(rightbtn)==0){}
    
    if(menu_sc<3){
      menu_sc+=1;
    }
    Serial.println("Right pressed. Current screen is "+String(menu_sc));
    is_printed = -1;
  }
  if(digitalRead(leftbtn)==0){
    while(digitalRead(leftbtn)==0){}
    
    if(menu_sc>1){
      menu_sc-=1;
    }
    Serial.println("left pressed. Current screen is "+String(menu_sc));
    is_printed = -1;
  }
  Serial.println(is_printed);
  if(is_printed == -1){
    
    if(menu_sc==1){menu1_screen();}
    if(menu_sc==2){menu2_screen();}
    if(menu_sc==3){menu3_screen();}
    is_printed = 1;
  }
  delay(100);
}
Но ничего не ушло. Текст все еще поехавший. Фото ниже.
Вложение 1497821

Вложение 1497822

Вложение 1497823
0
Модератор
Эксперт по электронике
8954 / 6720 / 921
Регистрация: 14.02.2011
Сообщений: 23,717
12.01.2025, 18:11 4
Цитата Сообщение от Don_Patison Посмотреть сообщение
while(1==1){
это что? зачем? чтобы при не нажатой кнопки висеть в функции? и не дать завершится функции loop, а там между прочим сбрасывается "собачий таймер"
0
Агрессивно пишет PHP
-11 / 3 / 0
Регистрация: 29.11.2022
Сообщений: 48
Записей в блоге: 1
12.01.2025, 18:19  [ТС] 5
Цитата Сообщение от ValeryS Посмотреть сообщение
Сообщение от Don_Patison
while(1==1){
это что? зачем? чтобы при не нажатой кнопки висеть в функции? и не дать завершится функции loop, а там между прочим сбрасывается "собачий таймер"
Да убрал я это кривое решение уже, я же писал выше, что я убрал цикл из функций отрисовки...
Проблема так и не решилась
0
 Аватар для COKPOWEHEU
4027 / 2573 / 430
Регистрация: 09.09.2017
Сообщений: 11,491
12.01.2025, 18:24 6
Цитата Сообщение от Don_Patison Посмотреть сообщение
Я вызываю функцию другого меню =)
Разве так нельзя?
Теоретически можно, если понимаешь что и зачем делаешь. Но если понимаешь что и зачем делаешь, именно так делать не будешь. Размер стека ограничен, соответственно нельзя бесконечно вызывать функции друг из друга. Возможно, вам повезло, и компилятор переработал ваш код из рекурсии в цикл. Но опять же, если вы не знаете как это работает, рано или поздно работать перестанет.
Цитата Сообщение от Don_Patison Посмотреть сообщение
Я сделал отрисовки другим способом. Я убрал тот бред из кода функций отрисовки меню (цикл с опросом кнопок).
Да, стало получше. Опрос кнопок, конечно, все еще примитивный, но для теста сойдет.
Цитата Сообщение от Don_Patison Посмотреть сообщение
Теперь у меня просто в void start есть код отрисовывающий вырхнюю стргку:
Ну что тут можно сказать. Отлаживайтесь. Если у вас код отображения 2 и 3 экрана работает нормально, а 1 нет - между ними есть какая-то разница. Скопируйте второй экран в первый постепенно приводите к исходному виду. На какой строчке сломается, там, возможно, и первая ошибка.
У меня-то ваш код не запустится точно. И моими библиотеками вы вряд ли сможете воспользоваться.
Цитата Сообщение от Don_Patison Посмотреть сообщение
Serial.println("Right pressed. Current screen is "+String(menu_sc));
Ардуинщики...
Цитата Сообщение от Don_Patison Посмотреть сообщение
Но ничего не ушло. Текст все еще поехавший. Фото ниже.
Вложения не открываются.
Цитата Сообщение от ValeryS Посмотреть сообщение
это что? зачем?
Надо полагать, это реализация конечного автомата. Правда, кривая и нерабочая.
Цитата Сообщение от ValeryS Посмотреть сообщение
а там между прочим сбрасывается "собачий таймер"
Ну, пока он не запущен, можно и не сбрасывать.
0
12.01.2025, 18:24
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2025, 18:24
Помогаю со студенческими работами здесь

При печати и при конвертации в pdf текст страниц съезжает
Добрый день! При работе с word документном все страницы отображаются хорошо, но при печати и при конвертации в pdf текст страниц...

Съезжает текст при использовании <detalis>
Всем привет! Пишу сайт библиотеки для курсовой. С помощью грида выстроила список книг. Решила добавить краткое содержание с помощью...

При переключении между программами пропадает текст в RadioGroup
Программа написана в Delphi 7. При переключении между программами пропадает текст в RadioGroup. Появляется текст только при наведении...

Выпадающее меню съезжает влево
Добрый день! Вчера решила добавить выпадающее меню. Стили дописала, меню выпадает, но съезжает влево. Выпадение меню можно просмотреть...

Принтер epson xp-100. Съезжает текст при печати
С недавнего времени имею проблемы с пропечаткой текста и некоторых картинок -- текст съезжает и как бы накладывается сам на себя. Принтер...

При увеличении масштаба страницы, весь текст съезжает
Я вроде понял в чём проблема, но это не точно. Я думаю, это случается в связи с тем, что у меня указана ширина в процентах, а не в...

При нажатии на кнопку заголовок и текст съезжает вниз
У меня есть форма, в ней есть кнопка для выбора записи, при нажатии на нее элементы страницы (заголовок, текст и другая кнопка слева)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как узнать какой процесс блокирует файл или каталог в Windows
bt_guru 23.01.2025
При работе с операционной системой Windows пользователи нередко сталкиваются с ситуацией, когда система отказывается выполнять определенные действия с файлами или каталогами, сообщая, что они. . .
Как в curl узнать код статуса HTTP запроса. Коды состояния HTTP
bt_guru 23.01.2025
Коды состояния HTTP играют значимую роль в обеспечении эффективного взаимодействия между клиентами и серверами. При работе с веб-сервисами важно не только отправлять запросы, но и правильно. . .
Как сортировать вывод команды ls в Linux
bt_guru 23.01.2025
В операционной системе Linux команда ls является одним из наиболее часто используемых инструментов для просмотра содержимого директорий. При работе с файловой системой пользователи регулярно. . .
Как сделать POST запрос с помощью curl
bt_guru 23.01.2025
curl - это мощный инструмент командной строки позволяет отправлять и получать данные через различные протоколы, включая HTTP, HTTPS, FTP и множество других. Особенно полезным curl становится при. . .
Прокрутка в tmux с помощью мыши и клавиатуры
bt_guru 23.01.2025
Tmux представляет собой мощный терминальный мультиплексор, который позволяет пользователям создавать и управлять несколькими терминальными сессиями внутри одного окна. Одной из важнейших функций tmux. . .
Как проверить, содержит ли массив значение в JavaScript. Поиск в массиве
bytestream 23.01.2025
Эффективный поиск значений в массивах становится критически важным навыком для разработчиков, использующих JavaScript. Процесс поиска элементов в массиве может показаться простым на первый взгляд,. . .
Как удалить тег Git в удалённом репозитории (remote)
bytestream 23.01.2025
Одним из важнейших механизмов организации версий в Git являются теги, которые позволяют помечать определенные точки в истории проекта как значимые. Теги часто используются для маркировки релизов,. . .
Чем отличаются URL, URI и URN
bytestream 23.01.2025
Системы идентификации представляют собой фундаментальный механизм, позволяющий однозначно определять местоположение и характеристики различных информационных объектов в глобальной сети. Эти системы. . .
Как центрировать div внутри другого div с помощью CSS. Управление расположением элементов в CSS
bytestream 23.01.2025
Позиционирование элементов играет ключевую роль в создании качественных и профессиональных интерфейсов. Одной из наиболее часто встречающихся задач является центрирование элементов на веб-странице,. . .
Что означают различные символы в синтаксисе PHP
bytestream 23.01.2025
PHP (Hypertext Preprocessor) представляет собой один из наиболее широко используемых языков программирования для веб-разработки, который обладает богатой и интересной историей развития. Изначально. . .
Способы клонирования объектов в JavaScript
bytestream 23.01.2025
В современной разработке на JavaScript работа с объектами является фундаментальной частью создания любого приложения. При манипуляции объектами часто возникает необходимость создавать их копии для. . .
Как проверить состояние чекбокса в jQuery. Как работать с чекбоксами
bytestream 23.01.2025
При разработке интерактивных веб-форм часто возникает необходимость программно определять состояние чекбоксов с помощью jQuery. Чекбоксы являются важными элементами пользовательского интерфейса,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru