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

16-03-2020, 18:40 0 комментариев
Предлагаем на обзор подключение LCD дисплея на базе HD44780 к Ардуино. Модуль выбран как всегда не случайно, т.к. имеет определенные преимущества, о которых спешим вам рассказать. Прежде всего, это ценовая доступность всех задействованных элементов и легкость сборки. Ну и не стоит забывать о практичности и функциональности подобных устройств.

Давайте обсудим последнее утверждение. Подобные символьные ЖК дисплеи широко востребованы в различных проектах (как домашних «умельцев-ардуинщиков», так и в промышленных электронных системах у специалистов). Везде, где необходим вывод текстовых либо графических символов – может понадобится такой цифровой модуль.

Его технические параметры таковы:
  • напряжение питания: 5V;
  • видимая область: 64,5 x 13,8mm (формат 16х2 символов);
  • угол обзора: 180 гр.;
  • колористика символов: черный, белый;
  • светодиодная подсветка;
  • диапазон поддерживаемых температур: -20С … +70С;
  • габариты: 80 x 36 мм.
Распиновка выводов показана на скриншоте:
Рассмотрим подключение HD44780 к Ардуино. Для реализации несложной сборки рекомендуем использовать такое «железо»:
  1. Микроконтроллер Arduino Uno (и другие совместимые)
  2. Модуль LCD-дисплея
  3. Потенциометр
  4. Макетная плата
  5. Соединительные провода (комплект)
  6. USB-кабель для соединения с компьютером
Получившийся макет схемы показан далее:
В данном конкретном случае мы не использовали протокол I2C.

Для проверки работоспособности и тестирования устройств задействуем специализированный софт – библиотеки Wire (для работы с шиной) и LiquidCrystal_I2C. Первая уже имеется в среде разработки Arduino IDE. Вторую следует скачать и инсталлировать (обязательно в папку libraries).
https://arduinomaster.ru/wp-content/uploads/2018/12/LiquidCrystal_I2Cv1-1.zip или https://iarduino.ru/file/134.html

Заливаем проверочный скетч:
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> // Подключение библиотеки
//#include <LiquidCrystal_PCF8574.h> // Подключение альтернативной библиотеки
LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой 
//LiquidCrystal_PCF8574 lcd(0x27); // Вариант для библиотеки PCF8574 
void setup()
{
  lcd.init();                      // Инициализация дисплея  
  lcd.backlight();                 // Подключение подсветки
  lcd.setCursor(0,0);              // Установка курсора в начало первой строки
  lcd.print("Hello");       // Набор текста на первой строке
  lcd.setCursor(0,1);              // Установка курсора в начало второй строки
  lcd.print("ArduinoMaster");       // Набор текста на второй строке
}
void loop()
{
}
Помните, в одной из статей мы писали фразу «Hello, world»? Давайте напишем ее – только на русском. Коды будут следующими:
#include <LineDriver.h>
#include <LiquidCrystalExt.h>
#include <LiquidCrystalRus.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16, 2);
  lcd.print("Здравствуй, мир!");
}

void loop()
{
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);
}
Ну а если вам интересно опробовать больше опций, советуем расширить программную прошивку:
#include <LiquidCrystal.h>

/* Константа: высота символа в точках */
enum { SYMBOL_HEIGHT = 8 };

/* Описываем наши собственные символы в виде массивов битовых масок.
 * Каждый символ - это восемь масок по пять бит.
 */
byte arnie[SYMBOL_HEIGHT] =
{
  B10101,
  B11111,
  B10111,
  B11111,
  B11111,
  B00111,
  B11110,
  B00000,
};

byte skull_and_bones[SYMBOL_HEIGHT] =
{
  B01110,
  B10101,
  B11011,
  B01110,
  B00000,
  B10001,
  B01110,
  B10001,
};

byte lightning[SYMBOL_HEIGHT] =
{
  B00010,
  B00100,
  B01000,
  B11111,
  B00010,
  B00100,
  B01000,
  B00000,
};

/* Константы размеров экрана. Нужны для того, чтобы размер экрана
 * менять только в одном месте, а не по всему коду. Везде, где
 * результат вывода на дисплей должен зависеть от размера экрана,
 * следует использовать эти константы.
 */
enum { LCD_WIDTH = 16, LCD_HEIGHT = 2 };

/* Объявляем объект нашего дисплея */
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup()
{
  /* Регистрируем собственные символы с кодами 0, 1 и 2 */
  lcd.createChar(0, arnie);
  lcd.createChar(1, skull_and_bones);
  lcd.createChar(2, lightning);
  /* Начинаем работу с дисплееем */
  lcd.begin(LCD_WIDTH, LCD_HEIGHT);
}


typedef void (*LCD_demo)();

/* Это список демо-функций. Добавляйте свои или меняйте их порядок,
 * если хотите разнообразить этот скетч (:
 */
LCD_demo const demos[] =
{
  showArnie,
  showWarning,
  showScrolling,
  showAutoscroll,
  showRTL
};

/* Этот макрос - обычный "синтаксический сахар". Мне просто влом писать
 * по 10 почти одинаковых циклов for. Конечно, в серьёзном коде такое лучше не писать.
 */
#define dotimes(n, code) for (int i = 0; i < (n); ++i) code;


void loop()
{
  dotimes(sizeof(demos) / sizeof(demos[0]),
  {
    demos[i](); // запускаем очередную демонстрацию

    /* Даём насладиться её последними "кадрами", после чего очищаем экран */
    delay(2000);
    lcd.clear();
    delay(1000);
  });
}


void showArnie()
{
  lcd.cursor(); // показываем курсор
  lcd.blink(); // заставляем его мигать
  delay(1000);

  lcd.write(0); // выводим наш собственный символ с кодом 0 (ноль)
  lcd.write(' ');
  delay(1000);

  lcd.print("I'll be back"); // угадай, кто на экране (:
  delay(1000);

  lcd.noBlink(); // больше мигать не нужно
  lcd.noCursor(); // прячем курсор
}


void showWarning()
{
  /* Так как коды наших собственных символов - от 0 до 7,
   * можно смело использовать запись символов в строке при помощи
   * восьмеричных кодов: \1, \2 и т.д.
   * НО: код 0 (ноль) в C и C++ используется в качестве маркера конца строки,
   * так что используйте lcd.write(0) для вывода нулевого символа.
   */
  lcd.print("Smoke kills \1"); // в конце строки будет черепок с костями
  delay(2000);

  lcd.setCursor(0, 1); // переходим на следующую строку
  /* Можно вывести молнию как в начале, так и в середине */
  lcd.print("\2 AC/DC \2  rocks");
}


void showScrolling()
{
  lcd.print("I'm scrolling");
  delay(1000);

  /* Прокручиваем текст вправо за экран */
  dotimes(16,
  {
    lcd.scrollDisplayRight();
    delay(150);
  });

  /* И возвращаем на место, прокручивая влево */
  dotimes(16,
  {
    lcd.scrollDisplayLeft();
    delay(150);
  });
}

void showAutoscroll()
{
  lcd.setCursor(LCD_WIDTH - 2, 0);
  lcd.autoscroll(); // включаем автопрокрутку

  const char *text = "autoscroll";

  /* Печатаем строку буква за буквой. Текст будет "выползать" справа. */
  dotimes(strlen(text),
  {
    lcd.write(text[i]);
    delay(200);
  });

  lcd.noAutoscroll(); // выключаем автопрокрутку
}


void showRTL()
{
  lcd.setCursor(LCD_WIDTH - 1, 0);
  lcd.rightToLeft(); // теперь пишем справа налево

  const char *text = "tfel-ot-thgir"; // похоже на заклинание

  /* Печатаем строку буква за буквой. Текст будет выводиться задом наперёд. */
  dotimes(strlen(text),
  {
    lcd.write(text[i]);
    delay(200);
  });

  lcd.leftToRight(); // пишем слева направо
}
В этом материале мы постарались познакомить вас с основными моментами подключения и программирования популярного цифрового экрана. Надеемся, информация вам пригодится. На этом прощаемся! До новых встреч!
Поделись в социальных сетях:
О авторе
Калугин Антон

Программист микроконтроллеров с 8-ми летним стажем, работал в таких компаниях как IBM, ASUS, Microsoft.

В комментариях с радостью отвечу на ваши вопросы.

Все статьи автора
Похожие новости

Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...

Как подключить LCD 1602 к Ардуино в домашних условиях и пользоваться всеми преимуществами этого цифрового устройства – рассказываем сегодня в новой статье....

Сегодня рассмотрим подключение экрана LCD 2004A к Ардуино. Данный модуль интересен для использования (и обзора) по многим причинам. Он достаточно прост в...

Сегодня у нас на рассмотрении подключение MQ-135 к Arduino и все, что с ним связано. Данная тема и в особенности модуль сенсора выбраны не случайно, ведь в...

В данном обзоре речь пойдет о подключении L9110S к Arduino и основных параметрах этого двухканального драйвера. Напомним, подобные модули отлично вписываются...

Оставить комментарий