ЖК-дисплей 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()
{
    }

и вот что отображается на экране:

некоторые случайные символы

, 👍4

Обсуждение

добавьте фото проводки, пожалуйста!, @tuskiomi

Является ли «LiquidCrystal_I2C lcd(0x27,20,4);» это подходит для этого дисплея? Выглядит как дисплей 16X2. Выложите, пожалуйста, фото ЖК-адаптера., @Mikael Patel


3 ответа


Лучший ответ:

7

Если вы сравните коды 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


2

Из того, что я вижу, это, кажется, в этой строке:

 LiquidCrystal_I2C lcd(0x27,20,4);

конструктору переданы неверные параметры. Последние два аргумента должны указывать количество столбцов и строк на экране. На вашем экране 16 столбцов и 2 строки, тогда как вы передали конструктору 20 столбцов и 4 строки. Это может быть проблемой.

,

2

Я столкнулся с этим при использовании платы обнаружения STM32f429 и обнаружил, что это происходит по двум причинам.

  1. при использовании быстрого микроконтроллера (тактовая частота 180 МГц), если вы отправляете последовательный пакет I2C, ЖК-дисплей может быть не таким быстрым, чтобы понять это, и, как сказал Джеймс в другом посте, ЖК-дисплей может потерять некоторые пакеты и запутаться. Чтобы справиться с этим, вам придется установить задержку между пакетами.
  2. Если вы перезагрузите плату MCU, пока ваш ЖК-дисплей что-то записывает, не отключая питание, ЖК-дисплей может получить первый полубайт, но потерять второй 4-битный полубайт и интерпретировать ваши данные инициализации как данные второго полубайта для отображения на ЖК-дисплее и просто запутаться. Если бы на ЖК-дисплее было что-то вроде программного сброса, это могло бы помочь, но я ничего не нашел в таблице данных. Хотя я думаю, что есть аппаратный обходной путь

 Схема ЖК-модуля I2C на основе PCF8574

Если бы вы могли отключить транзистор K в транзисторе 8050 и подключить заземление ЖК-дисплея к этой точке, тогда вы могли бы отключить и подключить питание ЖК-дисплея, просто переключив контакт P3 через микросхему PCF8574 при инициализации ЖК-дисплея. На самом деле вы потеряете некоторый контроль над подсветкой ЖК-дисплея. . вы также можете рассмотреть контакт R/W, потому что почти все прошивки просто пишут на ЖК-дисплее и просто опускают этот контакт. Схему цели я привожу ниже

модифицированная схема

В модуле просто отсоедините контакт заземления от модуля и ЖК-дисплея, а на плате ЖК-дисплея подключите контакт K к земле, как я поместил здесь изображение

отсоединить PIN-код заземления

подключите Baklight Katode к PIN-коду заземления

в вашем коде. Когда вы инициализируете, напишите 0xF7 в I2C и задержите на 200 мс, затем напишите 0 и задержите 100 мс, а затем выполните другую инициализацию. Извините за плохой английский

,