ЖК-дисплей I2C отображает странные символы
Я подключил ЖК-дисплей с рюкзаком I2C к Arduino Uno, но он печатает неправильные символы. Странно то, что какое-то время он работал нормально, а когда я обновил код (но не менял ничего, связанного с ЖК-дисплеем), он начал отображать неправильные символы. Это произошло и сегодня утром. Тогда переустановка библиотеки LiquidCrystal сработала, а сейчас нет.
Кто-нибудь знает, в чем может быть проблема, чтобы я мог исправить ее навсегда?
SDA и SCL ЖК-дисплея подключены к A4 и A5 соответственно, и я запускаю этот код:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // устанавливаем адрес ЖК-дисплея на 0x27 для отображения 16 символов и 2 строк
void setup()
{
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Hello, world!");
}
void loop()
{
}
и вот что отображается на экране:
3 ответа
Лучший ответ:
Если вы сравните коды ASCII для того, что вы отправили, с тем, что было отображено, а также посмотрите «Таблицу 4 Соответствие между кодами символов и шаблонами символов (код ПЗУ: A00)» в спецификации HD44780U, вы найдете шестнадцатеричные значения, подобные следующим.
- е 65, В 56
- л 6С, ニ С6
- о 6F, θ F2
- о 6Ф, π Ф7
- r 72, & 26
- д 64, Б 24
- и так далее.
Похоже, что старший полубайт того, что вы отправили, используется как младший полубайт того, что отображается, а младший полубайт используется как старший, но некоторые биты иногда идут не так. Обратите внимание, что пробел — это 0x20, а обратный ему — 0x02, что позволит получить доступ к символу из ОЗУ генератора символов, который будет содержать случайные биты и создавать случайный блоб, как на вашей картинке.
Если ваша неправильная спецификация размера дисплея (20, 4 против 16, 2) не является причиной проблемы, то, возможно, проблема в оборудовании рюкзака, который вы припаяли к ЖК-дисплею. Посмотрите на него под ярким светом, используя бинокулярный микроскоп для проверки деталей, если он у вас есть, и проверьте, нет ли на этой плате свободных частиц припоя, излишков флюса для пайки или свободных паяных соединений. Если у вас есть осциллограф, проверьте, чистые ли ваши сигналы I2C и имеют ли они полный размах.
Сомневаюсь, что перестановка выводов вызвана плохой пайкой. Но +1 за то, что продираюсь через даташит в поисках ссылки., @CharlieHanson
Большое спасибо @jwpat7 и @brianrho! Странно, но когда я только что переподключил свой ЖК-дисплей с помощью этого кода, он снова случайно заработал. В любом случае, я исправил 20,4 на 16,2, просто чтобы быть уверенным, и если он снова начнет барахлить, я внимательно посмотрю на рюкзак., @Wouter van Dijke
Спасибо, @WoutervanDijke, у меня была та же проблема, просто моя проблема была в том, что я печатал в цикле(), не устанавливая курсор в положение 0,0, поэтому внутренняя память ЖК-дисплея была повреждена, и он начал печатать случайные символы. Я исправил код, но это не помогло, сразу после повторного подключения контакта питания 5 В ЖК-дисплей начал вести себя как обычно. Поэтому повторное подключение контакта питания работает как кнопка «сброса к заводским настройкам» для ЖК-дисплея. Круто! Ты спас мне жизнь :-), @Agnius Vasiliauskas
Из того, что я вижу, это, кажется, в этой строке:
LiquidCrystal_I2C lcd(0x27,20,4);
конструктору переданы неверные параметры. Последние два аргумента должны указывать количество столбцов и строк на экране. На вашем экране 16 столбцов и 2 строки, тогда как вы передали конструктору 20 столбцов и 4 строки. Это может быть проблемой.
Я столкнулся с этим при использовании платы обнаружения STM32f429 и обнаружил, что это происходит по двум причинам.
- при использовании быстрого микроконтроллера (тактовая частота 180 МГц), если вы отправляете последовательный пакет I2C, ЖК-дисплей может быть не таким быстрым, чтобы понять это, и, как сказал Джеймс в другом посте, ЖК-дисплей может потерять некоторые пакеты и запутаться. Чтобы справиться с этим, вам придется установить задержку между пакетами.
- Если вы перезагрузите плату MCU, пока ваш ЖК-дисплей что-то записывает, не отключая питание, ЖК-дисплей может получить первый полубайт, но потерять второй 4-битный полубайт и интерпретировать ваши данные инициализации как данные второго полубайта для отображения на ЖК-дисплее и просто запутаться. Если бы на ЖК-дисплее было что-то вроде программного сброса, это могло бы помочь, но я ничего не нашел в таблице данных. Хотя я думаю, что есть аппаратный обходной путь
Если бы вы могли отключить транзистор K в транзисторе 8050 и подключить заземление ЖК-дисплея к этой точке, тогда вы могли бы отключить и подключить питание ЖК-дисплея, просто переключив контакт P3 через микросхему PCF8574 при инициализации ЖК-дисплея. На самом деле вы потеряете некоторый контроль над подсветкой ЖК-дисплея. . вы также можете рассмотреть контакт R/W, потому что почти все прошивки просто пишут на ЖК-дисплее и просто опускают этот контакт. Схему цели я привожу ниже
В модуле просто отсоедините контакт заземления от модуля и ЖК-дисплея, а на плате ЖК-дисплея подключите контакт K к земле, как я поместил здесь изображение
в вашем коде. Когда вы инициализируете, напишите 0xF7 в I2C и задержите на 200 мс, затем напишите 0 и задержите 100 мс, а затем выполните другую инициализацию. Извините за плохой английский
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- 16/2 arduino I2C ЖК-дисплей не загорается?
- Альтернатива LCD-дисплеям UART/I2C?
- Отправка буквы за буквой на ЖК-дисплей, однако дисплей знает полную строку?
- Датчики I2C не работают при подключении к LCD дисплею 20X04
- Проблема стабильности кода прерываний, связанного с датчиком расхода
- проблемы с кодированием
- Проблемы с подключением ЖК-дисплея I2C
добавьте фото проводки, пожалуйста!, @tuskiomi
Является ли «LiquidCrystal_I2C lcd(0x27,20,4);» это подходит для этого дисплея? Выглядит как дисплей 16X2. Выложите, пожалуйста, фото ЖК-адаптера., @Mikael Patel