Как установить связь между ЖК-дисплеем 16х2, работающим на HD44780, и одноплатным компьютером
Одноплатные Orange Pi, Banana Pi и Raspberry сегодня можно считать уже «олдскулом», тем не менее они остаются в обиходе. И однажды перед пользователями встает вопрос, как «подружить» эти компьютеры с LCD. Эти дисплеи прекрасно справляются с функцией выводы различных сообщений и объекты небольших объемов из интернет-сети (вроде твитов), показаний разного рода датчиков. ЖК-дисплей в этом случае, пожалуй, самый незамысловатый и дешевый вариант.
В данной статье описано два варианта подключений LCD на базе HD44780 к одноплатным компьютерам с использованием контактов GPIO:
1. Вариант в формате 8 бит, для которого используется 10 контактов.
2. Вариант в формате 4 бит, где задействованы лишь 6 контактов.
Речь пойдет о том, как подсоединить дисплей к одноплатным Orange Pi. Кроме процесса установки связи с дисплеем, будет разъяснено, как программировать дисплей с использованием С/С+ при помощи библиотеки LCD Gordon Henderson’s WiringPi. В статье также можно почерпнуть знания о том, как отослать набор символов на дисплей, убрать с него надпись, как воссоздавать пользовательские символы и выводить на печать показания датчиков.
Для примера берется жидкокристаллический дисплей 16х2, однако все процессы могут быть применены к любому LCD, работающий на драйвере Hitachi HD44780.
С точки зрения простоты подключения и экономии количества используемых проводов более распространенный способ подключения — 4-битный. Но не коснуться 8-битного режима было бы ошибкой, поскольку и он иногда приходится кстати.
8-битный режим присоединения
Вне всяких сомнений 8-битный режим имеет преимущество перед 4-битным по скорости передачи информации. Однако взамен приходится мириться с тем, что для подключения необходимо большее количество соединений. Для обмена информацией в 8-битном режиме применяются контакты от D0 до D7. Каждая команда передается на дисплей как одиночный байт данных, который составляет 8 бит. Для передачи достаточно одного такта.
Подключение в режиме 8-ми бит возможно лишь при наличии 10 контактов GPIO.

Потенциометры яркости и контрастности — 10 кОм. Но вполне применимы резисторы от 1 до 3 кОм.
4-битный режим присоединения LCD
В данном режиме пересылка информации на дисплей происходит в 2 такта, каждый из которых состоит из 4-х бит. И происходит это только при помощи контактов D4 – D7. Частое использование именно этого способа подключения продиктована меньшим количеством используемых контактов: их нужно всего 6.

Традиционно применяются потенциометры яркости и контрастности — 10 кОм. Однако резисторы от 1 до 3 кОм справятся со своей задачей тоже.
Как программировать LCD на C/C+
Подспорьем в процессе с успехом может стать модуль С под названием WiringPi. При его установке можно ознакомиться с правилами настройки модуля под Banana Pi и Orange Pi.
Для успешного прохождения задачи рекомендуется установить CodeBlocks. Также подойдет и CodeLite.
Важно: Не забудьте добавить следующие параметры в Linker:
-lwiringPi
-lwiringPiDev
-lpthread
CodeLite
wiringPi
wiringPiDev
pthread
Для того чтобы воспользоваться библиотекой LCD, в начале программы прописываются следующие строки: Функции
Команды
int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) ;
Эта функция является основной в процессе активации. К ней обращаются, чтобы использовать практически все функции дисплея.
void lcdClear (int handle)
С помощью первой - курсор перемещается в начало экрана, второй — очищает поле экрана.
void lcdCursor (int fd, int state) ;
void lcdCursorBlink (int fd, int state) ;
Используется для включения и выключения дисплея, активации и дизактивации курсора, включает и выключает его мигание. Функция «state» может иметь два значения: либо «true», либо «false». Настройки по умолчанию: дисплей включен, курсор не активирован и не мигает.
Данный параметр определяет положение курсора для ввода символов. Где X — столбец, а 0 — крайнее левое. Y — это строка, а 0 — верхняя строка.
Этот инструмент помогает изменить 1 из 8 символов на дисплее, доступных для изменения пользователем. Передаваемые данные состоят из 8 байтов, которые представляют символ от верхней до нижней строчки. Поскольку параметры символов составляют 5х8, то участвуют только младшие 5 битов. Индекс от 0 до 7. В процессе работы могут быть напечатаны символы вызовом lcdPutchar(...).
void lcdPuts (int handle, const char *string) ;
void lcdPrintf (int handle, const char *message, ...) ;
Указанные команды выводят 1 символ ASCII, строку или форматированную строку, апеллируя классическими командами форматирования printf(...).
Как выводится запись на дисплей в режиме 8 бит
В качестве образца ниже описана программа активации и работы с LCD в режиме 8 бит. В результате на дисплей должна быть выведена надпись «Hello, world!».
#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(...) применяется для приведения дисплея в активное состояние:
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) режим работы: определяется количество бит;
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 бит посредством такого кода:
#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:orangepi.su");
lcdPosition(fd, 0, 1);
lcdPuts(fd, "Hello, world!");
}
Все сделано верно, если получился следующий результат:

Как активировать и отключить курсоров
По умолчанию курсор находит в неактивном состоянии, они включается при необходимости вывести некую информацию с помощью символов. Курсор можно не только активировать, но и подобрать его стиль. Для этого используются такие команды:
1. Курсор с подчеркиванием без мигания: lcdCursor(lcd, 1);
2. Чтобы подчеркнуть мерцающий курсор, вводится команда: lcdCursor(lcd, 1); а потом lcdCursorBlink(lcd, 1);
3. Курсор в виде блока, который мигает: lcdCursorBlink(lcd, 1);
4. Отключение курсора: lcdCursor(lcd, 0);
На практике подчеркивание мерцающего курсора выглядит следующим образом:
#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. Располагая данными размерами, можно составить любой шаблон по желанию пользователя и выводить его на дисплее в качестве так называемого пользовательского символа.

В качестве примера можно воспользоваться следующей программой создания и вывода символов (в данном случае представлены символы, отображающие буквы греческого алфавита ‘?’, ‘?’ и ‘?’, а также ‘°’, термометр и символы капли воды):
#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);
}
С помощью данной команды на дисплей выводится следующее изображение:

Источник
21.05.2020 в 12:01, Просмотров: 5979
Опубликовал: ak167