LCD дисплей не отображает текст
Я работаю с Arduino и в настоящее время использую библиотеку жидких кристаллов Arduino для отображения данных на ЖК-экране (mc42004A6wk-bnmlw), который использует контроллер Hitachi HD44780. ЖК-дисплей обновлен до версии 2, и теперь он использует контроллер Sitronix ST7066U.
Судя по тому, что я прочитал, эти два контроллера совместимы, и библиотека жидких кристаллов должна работать для обоих. Я использую ту же настройку программного и аппаратного обеспечения, что и раньше, но на экране ничего не отображается.
Программное обеспечение, которое я использую, довольно сложное, поэтому для тестирования я перешел к простой программе hello world (ниже), и у меня все еще есть те же проблемы. Будем очень признательны за любые советы.
#include <LiquidCrystal.h>
#include <Arduino.h>
LiquidCrystal lcd(30, 31, 32, 33, 46, 47);
void setup()
{
pinMode(36,OUTPUT);
digitalWrite(36, LOW);
delay(5000);
// устанавливаем количество столбцов и строк ЖК-дисплея:
lcd.begin(20, 4);
lcd.clear();
// Выводим сообщение на ЖК-дисплей.
lcd.print("hello, world!");
}
void loop()
{
delay(5000);
// устанавливаем курсор в столбец 0, строку 1
// (примечание: строка 1 — это вторая строка, поскольку отсчет начинается с 0):
lcd.setCursor(0, 1);
// распечатываем количество секунд с момента сброса:
lcd.print(millis() / 1000);
}
@user1649972, 👍0
Обсуждение2 ответа
Лучший ответ:
Итак, после дальнейшего изучения IDE, библиотек, диспетчера плат, оборудования и т. д. я обнаружил причину проблемы.
При первоначальном проектировании аппаратного обеспечения инженер по аппаратному обеспечению поместил конденсатор на ножку включения между ЖК-экраном и микроконтроллером. Я понятия не имею, почему, поскольку я не видел этого ни на одной электрической схеме, но удаление помогло. Плата V2 теперь работает со всем исходным кодом и библиотеками.
Попробуйте использовать этот код, я отредактировал некоторые части вашего кода, так что все должно работать.
#include <LiquidCrystal.h>
const int rs = 30, en = 31, d4 = 32, d5 = 33, d6 = 46, d7 = 47;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup()
{
pinMode(36, OUTPUT);
digitalWrite(36, LOW);
delay(5000); //Здесь можно использовать задержку, поскольку она находится в функции setup() и запускается только один раз
// устанавливаем количество столбцов и строк ЖК-дисплея:
lcd.begin(20, 4);
// Выводим сообщение на ЖК-дисплей.
lcd.print("hello, world!");
}
void loop()
{
// устанавливаем курсор в столбец 0, строку 1
// (примечание: строка 1 — это вторая строка, поскольку отсчет начинается с 0):
lcd.setCursor(0, 1);
// распечатываем количество секунд с момента сброса:
lcd.print(millis() / 1000);
}
Для этого эскиза Hello World избегайте использования оператора delay();
в void цикле()
, поскольку его нецелесообразно использовать, если у вас есть millis();
используется.
Если вышеуказанное не работает, проверьте проводку ЖК-дисплея, многие проблемы обычно возникают из-за неправильного подключения. Также я могу посоветовать вам использовать несколько дешевых рюкзаков I2C с ЖК-дисплеем, поскольку это облегчит кодирование и позволит использовать меньше проводов и контактов на вашем Arduino. Вот пример
Если вы собираетесь использовать рюкзак с ЖК-дисплеем I2C, вот рабочий пример кода.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 13
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Устанавливаем адрес I2C ЖК-дисплея
// Создаем набор новых символов
const uint8_t charBitmap[][8] = {
{ 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
{ 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
{ 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
{ 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
{ 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
{ 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
{ 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
{ 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }
};
void setup()
{
int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));
// Включаем подсветку
pinMode ( BACKLIGHT_PIN, OUTPUT );
digitalWrite ( BACKLIGHT_PIN, HIGH );
//lcd.begin(16,2);
lcd.begin(20,4); // инициализируем ЖК-дисплей
for ( int i = 0; i < charBitmapSize; i++ )
{
lcd.createChar ( i, (uint8_t *)charBitmap[i] );
}
lcd.home (); // иди домой
lcd.print("LCD TESTER - BY:");
lcd.setCursor ( 0, 1 ); // переходим на следующую строку
lcd.print ("ABBAS (PRJCT.ME)");
delay ( 3000 );
}
void loop()
{
lcd.home ();
// Делаем небольшую анимацию, записывая в то же место
//for (int i = 0; i < 2; i++)
for ( int i = 0; i < 4; i++ )
{
//for (int j = 0; j < 16; j++)
for ( int j = 0; j < 20; j++ )
{
lcd.print (char(random(7)));
}
lcd.setCursor ( 0, 1 );
for ( int j = 0; j < 20; j++ )
{
lcd.print (char(random(7)));
}
lcd.setCursor ( 0, 2 );
for ( int j = 0; j < 20; j++ )
{
lcd.print (char(random(7)));
}
lcd.setCursor ( 0, 3 );
}
delay (200);
}
Привет, ЭнгрАббас, большое спасибо за ответ и код. Устранение задержки принесло мне некоторый прогресс. Экран печатается неправильно, но теперь на экране печатаются случайные символы, такие как «?/?/ooo|||» и т. д. Я правда начинаю думать, что библиотека жидких кристаллов несовместима с экраном. При использовании предыдущей версии у меня не было проблем, даже при использовании задержек и милли., @user1649972
Я заметил, что контроллеры имеют разное время инициализации. Как вы думаете, это может быть причиной проблемы? Инициализация по команде — время ожидания после включения питания ST7066U = Время ожидания > 40 мс, Hitachi HD44780 = Время ожидания > 15 мс . Инициализация по команде – время ожидания после первой установки функции ST7066U = Время ожидания > 37 мкс, Hitachi HD44780 = Время ожидания > 4,1 мс, @user1649972
У меня было так много проблем с ЖК-дисплеем 20x4, который требовал большого количества линий передачи данных. Это сработало один раз, затем я выключил и снова включил его, но он не работал - вместо этого ничего не показывалось. Я проверил всю проводку и попробовал еще раз, а затем получил тот же результат, что и @user1649972, с появлением случайных символов. Я думал, что поджарил ЖК-дисплей. Я заказал версию I2C (https://amzn.to/2MAOAjL). Это намного проще. Но я все еще хотел проверить, есть ли мой оригинал. ЖК работал. Я подключил линию каждой линии данных от нового ЖК-дисплея I2C к старому, и о чудо, все заработало! Если какая-либо строка данных не равна 100%, она терпит неудачу., @raddevus
- Ошибки библиотеки OLED-LCD SSD1306
- Как я могу правильно вызвать функцию lcd.begin() из нескольких разных файлов кода?
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Arduino Due vs Mega 2560
- Отправка значения с одного Arduino на другой
- Точность часов времени Arduino
- Регистры ввода-вывода SAM3X8E (Arduino Due)
Контраст настраивали?, @gre_gor
Я действительно так и сделал, не повезло. Я думаю, что проблема в том, как библиотека жидких кристаллов инициализирует экран. Просто не могу определить причину., @user1649972