Как установить связь между ЖК-дисплеем 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:

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)


С помощью первой - курсор перемещается в начало экрана, второй — очищает поле экрана.

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]) ;


Этот инструмент помогает изменить 1 из 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, ...) ;


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

Как выводится запись на дисплей в режиме 8 бит


В качестве образца ниже описана программа активации и работы с LCD в режиме 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) режим работы: определяется количество бит;
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: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);
На практике подчеркивание мерцающего курсора выглядит следующим образом:

#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. Располагая данными размерами, можно составить любой шаблон по желанию пользователя и выводить его на дисплее в качестве так называемого пользовательского символа.



В качестве примера можно воспользоваться следующей программой создания и вывода символов (в данном случае представлены символы, отображающие буквы греческого алфавита ‘?’, ‘?’ и ‘?’, а также ‘°’, термометр и символы капли воды):

#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);
}


С помощью данной команды на дисплей выводится следующее изображение:


Источник

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

дисплей






Предложить пост

Поиск



По всему сайту
По тэгам
По тэгам и заголовкам

Боковое меню

  • Карта сайта
  • RSS-каналы
  • Обратная связь
  • Пользователи



    Рейтинг@Mail.ru