Подключение ЖК-дисплея на базе 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:
Потенциометры яркости и контрастности — 10 кОм, но здесь вы также можете использовать резисторы от 1 до 3 кОм.
Подключение ЖК-дисплея в 4-битном режиме
В 4-битном режиме каждый байт данные пересылаются на LCD за 2-а такта по 4 бита, сначала старшие 4-е бита, потом младшие 4-е бита, а для обмена используются только контакты D4 – D7.
4-битный режим требует 6 контактов GPIO для ввода/вывода, что делает его популярным для многих проектов:
Потенциометры яркости и контрастности — 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
-lpthreadCodeLite
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!"); }
Результат
Включение и выключение курсора
Курсор по умолчанию выключен, но вы можете получить различные стили курсоров, используя следующие функции:
- Подчеркнутый не мерцающий курсор:
lcdCursor(lcd, 1);
- Подчеркивание мигающего курсора:
lcdCursor(lcd, 1);
затемlcdCursorBlink(lcd, 1);
- Мигающий курсор в стиле блока:
lcdCursorBlink(lcd, 1);
- Выключить курсор:
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); }
Результат
Пользовательские символы
Каждый ЖК-символ представляет собой массив пикселей размером 5×8. Вы можете создать любой шаблон, который вы хотите, и отобразить его на ЖК-дисплее в качестве пользовательского символа. Одновременно в памяти ЖК-дисплея может храниться до 8 пользовательских символов. На этой странице 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); }
Результат
Вот и всё. Надеюсь, эта информация была вам полезна. Успехов вам!
как вывести на дисплей температуру процессора ?
не могу добавить русский текст у
к коду.
использую code blocks