Arduino с символьными LCD дисплеями на базе HD44780

Содержание:

  • Введение

  • Библиотеки Arduino

  • Параллельный интерфейс: начало работы с JHD162A 16x2

  • Интерфейс I2C: начало работы с 20x4 дисплеем

  • Пользовательские символы

Введение

LCD-дисплеи, совместимые с HD44780, бывают разных форм и размеров. Два очень распространённых варианта – 16x2 и 20x4 символов. Хотя большинство экранов оснащены подсветкой, некоторые – нет. И хотя оригинальный интерфейс параллельный, некоторые экраны поставляются с предустановленным I2C-адаптером (их можно купить и отдельно).

LCD-дисплеи 16x2 и 20x4

LCD-дисплеи 16x2 и 20x4

С подсветкой и без

С подсветкой и без подсветки

Модули без подсветки не так распространены, но всё же стоит проверить перед покупкой.

С I2C-адаптером и без

С I2C-адаптером и без I2C-адаптера

LCD без адаптера требуют 8 или 12 подключений (см. 4-бит / 8-бит ниже), а экраны с адаптером – всего 4 подключения. Это делает модули с I2C-адаптерами значительно проще в подключении.

Ещё один момент – набор символов. HD44780 может иметь один из двух наборов: европейский или азиатский.

Два набора символов

Два возможных набора символов

Библиотеки Arduino

Ключевое преимущество использования библиотеки – не нужно беспокоиться о технических деталях. Библиотека делает всё за нас. Недостаток – когда разные библиотеки пытаются использовать одни ресурсы, найти проблему сложно.

Arduino IDE поставляется с предустановленной библиотекой LiquidCrystal (только параллельный интерфейс). Работает хорошо, но с ограничениями.

Я рекомендую две библиотеки:

  • NewLiquidCrystal от Francisco Malpartida – поддерживает почти все HD44780-совместимые дисплеи, включая I2C. Заменяет стандартную библиотеку.

  • Extensible hd44780 LCD library от Bill Perry – новая, но хорошо работающая.

Скачивание NewLiquidCrystal:

На wiki-странице нажмите Download.

Wiki NewLiquidCrystal Wiki NewLiquidCrystal

Скачайте последнюю версию (на момент написания – 1.3.4).

Страница загрузки

Скачанный zip-архив. Извлеките папку NewLiquidCrystal.

Извлечение из архива

Удалите стандартную библиотеку LiquidCrystal из папки библиотек Arduino.

Папка библиотек Удаление стандартной библиотеки

Скопируйте NewLiquidCrystal в папку библиотек Arduino.

Копирование библиотеки

Если IDE открыта – перезапустите её.

Сравнение команд LiquidCrystal и NewLiquidCrystal:

Команда

LiquidCrystal

NewLiquidCrystal

begin

ДА

ДА

clear

ДА

ДА

home

ДА

ДА

print

ДА

ДА

println

НЕТ

ДА

write

ДА

ДА

setCursor

ДА

ДА

cursor / noCursor

ДА

ДА

blink / noBlink

ДА

ДА

display / noDisplay

ДА

ДА

scrollDisplayLeft/Right

ДА

ДА

leftToRight / rightToLeft

ДА

ДА

createChar

ДА

ДА

moveCursorLeft/Right

НЕТ

ДА

autoscroll / noAutoscroll

НЕТ

ДА

backlight / noBacklight

НЕТ

ДА

on / off

НЕТ

ДА

setBacklightPin

НЕТ

ДА

setBacklight

НЕТ

ДА

Описание основных команд:

  • LiquidCrystalLiquidCrystal lcd(RS, Enable, D4, D5, D6, D7) – создание объекта lcd. 4 пина – 4-битный режим, 8 пинов – 8-битный.

  • LiquidCrystal_I2CLiquidCrystal_I2C LCD(I2C_ADDR); – создание I2C LCD объекта.

  • beginlcd.begin(width, height); – инициализация экрана.

  • clearlcd.clear(); – очистка экрана, курсор в 0,0.

  • homelcd.home(); – курсор в 0,0.

  • printlcd.print(data); – вывод данных (char, byte, int, long, string). Поддерживает BASE (BIN, OCT, DEC, HEX).

  • writelcd.write(data); – запись одного символа. lcd.write(65) выводит «A».

  • setCursorlcd.setCursor(x, y); – перемещение курсора. Координаты с 0.

  • cursor / noCursor – вкл/выкл курсор (подчёркивание).

  • blink / noBlink – вкл/выкл мигание курсора.

  • noDisplay / display – скрыть/показать текст без стирания из памяти.

  • createCharcreateChar(номер, byteArray[]); – создание пользовательского символа (до 8).

  • backlight / noBacklight – вкл/выкл подсветку.

  • setBacklightsetBacklight(int); – 0=выкл, 255=вкл, 1-255 яркость.

Параллельный интерфейс: начало работы с JHD162A 16x2

Используем дисплей 16x2 JHD162A в 4-битном режиме с примером HelloWorld.

JHD162A HD44780 LCD

JHD162A HD44780 символьный LCD с параллельным интерфейсом

Пины JHD162A

HD44780-совместимые дисплеи имеют 16 пинов (14 + 2 для подсветки).

Пины LCD
  • VSS – GND

  • VCC – питание

  • VEE – контрастность (подключить к потенциометру)

  • RS – Register Select. LOW=команда, HIGH=символ

  • R/W – Read/Write. LOW=запись, HIGH=чтение. Обычно подключён к GND

  • E – Enable, разрешение записи

  • DB0-DB7 – пины данных

  • LED+ / LED- – питание подсветки

4-битный и 8-битный режимы

В 4-битном режиме 4 пина данных, в 8-битном – 8. Разница в скорости минимальна. Всё зависит от доступных пинов: мало пинов – 4 бит; нужна скорость – 8 бит; совсем мало пинов – I2C (2 пина).

Подключение к Arduino

Дисплей

VSS

VCC

VEE

RS

R/W

E

DB4

DB5

DB6

DB7

LED+

LED-

Arduino

GND

VCC

POT

D12

GND

D11

D5

D4

D3

D2

VCC+RES

GND

Подключение LCD Схема

Скетч

Пример Hello World. Если всё в порядке – «hello, world!» на верхней строке, счётчик секунд на нижней.

Hello World на LCD

Если старая IDE – возможна ошибка компиляции:

D:\ProgsII\arduino-163\libraries\NewliquidCrystal\I2CIO.cpp:36:21: fatal error: Wire.h: No such file or directory
    #include <Wire.h>
                     ^
compilation terminated.
Error compiling.

Решение: скачайте последнюю IDE или отредактируйте файл I2CIO.cpp:

Файл I2CIO.cpp

Найдите:

#if (ARDUINO < 10000)
   #include <../Wire/Wire.h>
#else
   #include <Wire.h>
#endif

Замените на:

#include <Wire.h>

Полный скетч Hello World:

/*
  LiquidCrystal Library - Hello World

 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.

 This sketch prints "Hello World!" to the LCD
 and shows the time.

  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}
Синий LCD с подсветкой

Синий LCD с подсветкой

Зелёный LCD без подсветки

Зелёный LCD без подсветки

Основные части скетча

  • #include <LiquidCrystal.h> – подключение библиотеки

  • LiquidCrystal lcd(12, 11, 5, 4, 3, 2); – создание объекта lcd (4-бит)

  • lcd.begin(16, 2); – инициализация с размером

  • lcd.print("hello, world!"); – вывод текста

  • lcd.setCursor(0, 1); – курсор на вторую строку

  • lcd.print(millis() / 1000); – вывод секунд

Управление подсветкой (параллельный интерфейс)

Полный контроль: вкл/выкл и регулировка яркости. Потенциометр – ручная регулировка, ШИМ – автоматическая.

Схема с потенциометром Регулировка подсветки Затемнение

Для ШИМ-управления используйте транзистор 2N2222:

  • LED+ через резистор 220 Ом к 5V

  • LED- к коллектору 2N2222

  • Эмиттер к GND

  • База через 1 кОм к пину 6 Arduino (ШИМ)

ШИМ подсветка Схема с 2N2222

Скетч с ШИМ-управлением подсветкой:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int backLightPWMpin = 6;
int brightness = 0;


void setup()
{
  // set the back light pin to output
  pinMode(backLightPWMpin, OUTPUT);

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop()
{
  // increase the brightness
  brightness = brightness + 10;

  // the maximum value for analogeWrite is 255
  if (brightness >255) { brightness = 0; }

  // set the PWM speed to the brightness value
  analogWrite(backLightPWMpin, brightness);

  // display the brightness value on screen. The spaces clear the old value. Required when we go from 250 to 0.
  lcd.setCursor(0, 1);  lcd.print( "   " );
  lcd.setCursor(0, 1);  lcd.print( brightness );

  delay(1000);
}
ШИМ яркость

Автоматическая регулировка яркости через ШИМ

В NewLiquidCrystal это встроено: setBacklightPin() + setBacklight() (0=выкл, 255=макс).

Интерфейс I2C: начало работы с 20x4 дисплеем

LCD 20x4 с I2C

I2C дочерняя плата преобразует I2C-связь в параллельную. Два распространённых типа: с фиксированным адресом и с перемычками.

I2C адаптер (фиксированный адрес)

I2C адаптер с фиксированным адресом

I2C адаптер (перемычки)

I2C адаптер с перемычками для изменения адреса

Фиксированный адрес обычно 0x27 (может быть 0x20 или 0x3F). Модули с перемычками A0, A1, A2:

Перемычки I2C
I2C-адреса

A0

A1

A2

Адрес

OPEN

OPEN

OPEN

0x27

CLOSED

OPEN

OPEN

0x26

OPEN

CLOSED

OPEN

0x25

CLOSED

CLOSED

OPEN

0x24

OPEN

OPEN

CLOSED

0x23

CLOSED

OPEN

CLOSED

0x22

OPEN

CLOSED

CLOSED

0x21

CLOSED

CLOSED

CLOSED

0x20

Если адрес неизвестен – используйте I2C сканер.

Пины I2C адаптера

Подключение: GND к GND, VCC к +5V, SDA к A4, SCL к A5. Рекомендуются подтягивающие резисторы 4.7 кОм.

Подсветка:

Пины подсветки

Замкните перемычку для включения подсветки. Яркость не регулируется через I2C без модификации.

Все I2C-платы используют чип PCF8574. Без „A“: адреса 0x20-0x27. С „A“: адреса 0x38-0x3F.

Схема подключения

Подключение I2C LCD Схема I2C LCD

Hello World (I2C)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//                    ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup()
{
    lcd.begin(20, 4);
    lcd.setCursor(0, 0);
    lcd.print("Hello World!");
}

void loop()
{
    ;
}

Если в конструкторе указать только адрес без пинов:

LiquidCrystal_I2C lcd(0x38);  // Set the LCD I2C address

Библиотека использует маппинг по умолчанию для LCDXIO, отличающийся от обычных адаптеров – поэтому пины нужно указывать.

Неправильные определения пинов

Бледные блоки с мигающим блоком = неправильные пины

Управление подсветкой (I2C)

Команды lcd.backlight() и lcd.noBacklight(). Скетч с мигающей подсветкой:

// Simple 20x4 LCD with I2C adapter test
//
// Displays Hello World on the LCD and then flashes the back light on and off

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//                    ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


void setup()
{
    lcd.begin(20, 4);
    lcd.setCursor(0, 0);
    lcd.print("Hello World!");
    delay(2000);
}

void loop()
{
    lcd.noBacklight();
    delay(1000);
    lcd.backlight();
    delay(1000);
}

Карта памяти 20x4 LCD

При переполнении: строка 1 -> строка 3, строка 2 -> строка 4.

Карта памяти 20x4

Скетч-демонстрация переполнения:

// Demonstration of overflow on a 20x4 LCD

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//                    ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


void setup()
{
    lcd.begin(20, 4);
    lcd.setCursor(0, 0);
    lcd.print("This is a large piece of text that overflows across four lines on the LCD.");
}

void loop()
{
  ;
}
Переполнение строк

Пользовательские символы

8 ячеек памяти для пользовательских символов (сетка 5x8). Создание через createChar(), отображение через lcd.write().

Пользовательские символы
// Custom characters

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//                    ADDR, EN,RW,RS,D4,D5,D6,D7,BL,POLARITY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup()
{
    lcd.begin(20, 4);
    byte chr1[8] =  {
                        B00000,
                        B10001,
                        B00000,
                        B00000,
                        B10001,
                        B01110,
                        B00000,
                        B00000
                    };
    byte chr2[8] =  {
                        B00000,
                        B10001,
                        B00000,
                        B00000,
                        B01110,
                        B10001,
                        B00000,
                        B00000
                    };


   lcd.createChar(1, chr1);
   lcd.createChar(2, chr2);

   lcd.setCursor(0, 0); lcd.write(1);
   lcd.setCursor(2, 0); lcd.write(2);
}

void loop()
{
  ;
}

Хотя одновременно можно создать только 8 символов, их можно переопределить в любое время «на лету».

Онлайн-генераторы

Генератор символов

Генератор Omer Kilic

Генератор символов

Генератор maxpromer

Крупные шрифты:

Крупные шрифты

Создатель: digimike (Arduino Forum)

Excel генератор

Excel генератор на AVR Freaks

Демо:

Библиотека Extensible hd44780 LCD

Скачать с GitHub. Включает диагностический скетч.

Примеры hd44780 Диагностика

Заметки

  • Сброс Arduino не сбрасывает LCD.

  • clear() медленная. Заполнение пробелами быстрее.

  • home() тоже медленная.

  • Проблема подсветки на некоторых шилдах – hd44780 обходит программно.

Ссылки

Ручное управление LCD

8-Bit Guy – видео о ручном управлении HD44780 LCD без микропроцессора.