Подключение LCD 16×2 на базе HD44780 к Orange Pi, Banana Pi и Raspberry Pi

Подключение ЖК-дисплея на базе HD44780 к Orange Pi, Banana Pi и Raspberry рано или поздно заинтересует вас. ЖК-дисплеи отлично подходят для вывода показаний датчиков, обычных сообщений, а также материалов из Интернета, таких как твиты. Что бы вы ни выбрали для показа, ЖК-дисплей — это простой и недорогой способ сделать это.

В этом уроке я покажу вам два разных способа подключения ЖК-дисплея на базе HD44780 к Orange Pi с помощью контактов GPIO. Первый способ — это 8-битный режим, который использует 10 контактов GPIO. Затем я покажу вам, как подключить HD44780 к Orange Pi в 4-битном режиме, который использует только 6 контактов. После того, как мы подключим ЖК-дисплей, я покажу вам, как программировать его с помощью C/C++, используя библиотеку LCD Gordon Henderson’s WiringPi.

Я покажу вам, как вывести текст на дисплее, очистить дисплей. Вы также увидите, как создавать пользовательские символы, печатать данные с датчиков.

Я буду использовать ЖК-дисплей 16×2, но приведенные ниже примеры будут работать с любым ЖК-дисплеем, который использует драйвер Hitachi HD44780.

Подключение ЖК-дисплея на базе HD44780 к Orange Pi

Большинство людей, вероятно, хотят подключить свой ЖК-дисплей в 4-битном режиме, так как он использует меньше проводов. Но в случае, если вы заинтересованы, я покажу вам, как подключить его в 8-битном режиме.

Подключение ЖК-дисплея в 8-битном режиме

В 8-разрядном режиме каждая команда или символ отправляется на ЖК-дисплей в виде одиночного байта (8 бит) данных, для обмена информацией используются контакты от D0 до D7, данные пересылаются за один такт. 8-битный режим быстрее, чем 4-битный, но основной недостаток данного режима состоит в том, что он использует большое количество контактов GPIO.

Подключение LCD в 8-битном режиме требует 10 контактов GPIO:

Подключение LCD 1602 на базе HD44780 к Orange Pi в 8-битном режимеПотенциометры яркости и контрастности — 10 кОм, но здесь вы также можете использовать резисторы от 1 до 3 кОм.

Подключение ЖК-дисплея в 4-битном режиме

В 4-битном режиме каждый байт данные пересылаются на LCD за 2-а такта по 4 бита, сначала старшие 4-е бита, потом младшие 4-е бита, а для обмена используются только контакты D4 – D7.

4-битный режим требует 6 контактов GPIO для ввода/вывода, что делает его популярным для многих проектов:

Подключение LCD 1602 на базе HD44780 к Orange Pi в 4-битном режимеПотенциометры яркости и контрастности — 10 кОм, но резисторы от 1 до 3 кОм также будут работать.

Программирование ЖК-дисплея на С/C++

WiringPi — это модуль C, который упрощает программирование ЖК-дисплея. Если у вас не установленный WiringPi, переходите на странице Установка и настройка BPI-WiringPi/WiringPi на Banana Pi или Установка и настройка WiringOP/WiringPi на Orange Pi PC, где есть инструкция по установке WiringPi для Banana Pi и Orange Pi, соответственно.

Также рекомендую установить CodeBlocks или CodeLite.

Важно:
Не забудьте добавить следующие параметры в Linker:

Code::blocks
-lwiringPi
-lwiringPiDev
-lpthread

CodeLite
wiringPi
wiringPiDev
pthread

Чтобы использовать библиотеку LCD, вам нужно будет добавить следующие строчки в начале вашей программы:

#include <wiringPi.h>
#include <lcd.h>

Функции

int  lcdInit (int rows, int cols, int bits, int rs, int strb,
            int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) ;

Это основная функция инициализации и должна быть вызвана до использования любых других функций ЖК-дисплея.

void lcdHome (int handle)
void lcdClear (int handle)

Перемещает курсор в начале экрана (0, 0) и очищают экран соответственно.

void lcdDisplay (int fd, int state) ;
void lcdCursor (int fd, int state) ;
void lcdCursorBlink (int fd, int state) ;

Включает или выключает дисплей, включает или выключает курсор, мигает или не мигает курсор. Параметр state имеет значение «true» или «false«. Установки по умолчанию ЖК-дисплей включён, курсор выключён и курсор не мигает.

void lcdPosition (int handle, int x, int y) ;

Задаёт положение курсора для последующего ввода текста. X — столбец, а 0 — крайнее левое. Y — это строка, а 0 — верхняя строка.

void lcdCharDef (int handle, int index, unsigned char data [8]) ;

Эта функция позволяет вам переопределить один из 8 определяемых пользователём символов на дисплее. Массив данных представляет собой 8 байтов, которые представляют символ от верхней строки до нижней строки. Обратите внимание, что символы фактически равны 5×8, поэтому используются только младшие 5 битов. Индекс от 0 до 7, и впоследствии вы можете напечатать символ, определенный с помощью вызова lcdPutchar(...).

void lcdPutchar (int handle, unsigned char data) ;
void lcdPuts (int handle, const char *string) ;
void lcdPrintf (int handle, const char *message, ...) ;

Эти функции выводят один символ ASCII, строку или форматированную строку, используя обычные команды форматирования printf(...).

Запись на ЖК-дисплей в 8-битном режиме

Ниже приведён пример программы инициализации и работы с ЖК-дисплеем в 8-битном режиме. Данная программа выводит на экран сообщение «Hello, world!».

#include <wiringPi.h>
#include <lcd.h>

#define LCD_RS  25  // RS - Выбор регистра 
#define LCD_E   24  // E  - Еnable (строб по спаду)
#define LCD_D0  29  // D0 - бит данных
#define LCD_D1  28  // D1 - бит данных
#define LCD_D2  27  // D2 - бит данных
#define LCD_D3  26  // D3 - бит данных
#define LCD_D4  23  // D4 - бит данных
#define LCD_D5  22  // D5 - бит данных
#define LCD_D6  21  // D6 - бит данных
#define LCD_D7  14  // D7 - бит данных

int main() {
  int code = wiringPiSetup();
  if (code != 0) {
    return -1;
  }
  int fd = lcdInit(2, 16, 8, LCD_RS, LCD_E, 
                   LCD_D0, LCD_D1, LCD_D2, LCD_D3, 
                   LCD_D4, LCD_D5, LCD_D6, LCD_D7);
  lcdClear(fd);
  lcdPosition(fd, 0, 0);
  lcdPuts(fd, "Hello, world!");
}

Функция lcdInit(...) используется для инициализации ЖК-дисплея:

int fd = lcdInit(2, 16, 8, LCD_RS, LCD_E, 
                 LCD_D0, LCD_D1, LCD_D2, LCD_D3, 
                 LCD_D4, LCD_D5, LCD_D6, LCD_D7);

const int rows — (2) количество строк;
const int cols — (16) количество символов;
const int bits — (8) режим работы: 8 или 4-битный режим;
const int rs — (LCD_RS) вывод с помощью которого, дисплей определяет что в него поступает данные или команды;
const int strb — (LCD_E) линия синхронизации;
const int d0 - d7 — (LCD_D0 — LCD_D7) шина команд/данных.
Функция lcdPuts(fd, "Hello, world!"); выводит на экран «Hello, world!».

Запись на ЖК-дисплей в 4-битном режиме

Чтобы использовать ЖК-дисплей в 4-битном режиме, нам необходимо установить параметр const int bits в 4 в функции инициализации lcdInit(...). Следующий код выводит на экран «Hello, world!» в 4-битном режиме:

#include <wiringPi.h>
#include <lcd.h>

#define LCD_RS  25  // RS - Выбор регистра
#define LCD_E   24  // E  - Еnable (строб по спаду)
#define LCD_D4  23  // D4 - бит данных
#define LCD_D5  22  // D5 - бит данных
#define LCD_D6  21  // D6 - бит данных
#define LCD_D7  14  // D7 - бит данных

int main1() {
  int code = wiringPiSetup();
  if (code != 0) {
    return -1;
  }
  int fd = lcdInit(2, 16, 4, LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7, 0, 0, 0, 0);
  lcdCursorBlink(fd, 1);

  lcdClear(fd);
  lcdPosition(fd, 0, 0);
  lcdPuts(fd, "site:micro-pi.ru");
  lcdPosition(fd, 0, 1);
  lcdPuts(fd, "Hello, world!");
}

Результат

HD44780 к Orange Pi - Большой курсор

Включение и выключение курсора

Курсор по умолчанию выключен, но вы можете получить различные стили курсоров, используя следующие функции:

  1. Подчеркнутый не мерцающий курсор: lcdCursor(lcd, 1);
  2. Подчеркивание мигающего курсора: lcdCursor(lcd, 1); затем lcdCursorBlink(lcd, 1);
  3. Мигающий курсор в стиле блока: lcdCursorBlink(lcd, 1);
  4. Выключить курсор: lcdCursor(lcd, 0);

Пример программы: подчеркивание мигающего курсора

#include <wiringPi.h>
#include <lcd.h>

#define LCD_RS  25  // RS - Выбор регистра
#define LCD_E   24  // E  - Еnable (строб по спаду)
#define LCD_D4  23  // D4 - бит данных
#define LCD_D5  22  // D5 - бит данных
#define LCD_D6  21  // D6 - бит данных
#define LCD_D7  14  // D7 - бит данных

int main2() {
  int code = wiringPiSetup();
  if (code != 0) {
    return -1;
  }
  int fd = lcdInit(2, 16, 4, LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7, 0, 0, 0, 0);

  lcdCursor(fd, 1);
  lcdCursorBlink(fd, 1);

  lcdClear(fd);
  lcdPosition(fd, 0, 0);
  lcdPuts(fd, "Hello, world!");
  delay(1000);
}

Результат

HD44780 к Orange Pi - Маленький курсор

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

Каждый ЖК-символ представляет собой массив пикселей размером 5×8. Вы можете создать любой шаблон, который вы хотите, и отобразить его на ЖК-дисплее в качестве пользовательского символа. Одновременно в памяти ЖК-дисплея может храниться до 8 пользовательских символов. На этой странице Custom Character Generator for HD44780 LCD Modules вы найдёте хороший визуальный инструмент для генерации массива.

Custom Character Generator for HD44780 LCD Modules

Пример программы: Записи/вывод пользовательских символов

Вот пример использования нескольких пользовательских символов, которые печатают греческие буквы ‘Ω’, ‘π’ и ‘μ’, а также ‘°’, термометр и символы капли воды:

#include <wiringPi.h>
#include <lcd.h>

#define LCD_RS  25  // RS - Выбор регистра
#define LCD_E   24  // E  - Еnable (строб по спаду)
#define LCD_D4  23  // D4 - бит данных
#define LCD_D5  22  // D5 - бит данных
#define LCD_D6  21  // D6 - бит данных
#define LCD_D7  14  // D7 - бит данных

unsigned char omega[8] =
{
0b00000,
0b01110,
0b10001,
0b10001,
0b10001,
0b01010,
0b11011,
0b00000
};

unsigned char pi[8] =
{
0b00000,
0b00000,
0b11111,
0b01010,
0b01010,
0b01010,
0b10011,
0b00000
};

unsigned char mu[8] =
{
0b00000,
0b10010,
0b10010,
0b10010,
0b10010,
0b11101,
0b10000,
0b10000
};

unsigned char drop[8] =
{
0b00100,
0b00100,
0b01010,
0b01010,
0b10001,
0b10001,
0b10001,
0b01110
};

unsigned char temp[8] =
{
0b00100,
0b01010,
0b01010,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110
};

unsigned char celsius[8] =
{
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};

void customChar(int fd) {
  lcdCharDef(fd, 10, omega);
  lcdCharDef(fd, 11, pi);
  lcdCharDef(fd, 12, mu);
  lcdCharDef(fd, 13, drop);
  lcdCharDef(fd, 14, temp);
  lcdCharDef(fd, 15, celsius);

  lcdClear(fd);

  lcdPutchar(fd, 10);
  lcdPutchar(fd, 11);
  lcdPutchar(fd, 12);
  lcdPutchar(fd, 13);
  lcdPutchar(fd, 14);
  lcdPutchar(fd, 15);
}

int main() {
  int code = wiringPiSetup();
  if (code != 0) {
    return -1;
  }
  int fd = lcdInit(2, 16, 4, LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7, 0, 0, 0, 0);
  customChar(fd);
  lcdPosition(fd, 0, 1);
  lcdPrintf(fd, "%c %.2f%cC", 14, 24.52, 15);
}

Результат

HD44780 к Orange Pi - Пользовательские символы
Вот и всё. Надеюсь, эта информация была вам полезна. Успехов вам!

Похожие записи

Комментарии 1

  • как вывести на дисплей температуру процессора ?
    не могу добавить русский текст у
    к коду.
    использую code blocks

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *