Библиотека для символьного дисплея на базе hd44780

Библиотека для работы с HD44780

В прошлой статье мы рассмотрели теоретические основы управления LCD дисплеем на базе контроллера HD44780. Но разумеется теория без практики ничего не значит, а поэтому я предлагаю побаловаться с этим дисплеем вживую. Дисплей стоит не дорого, что-то в районе 6$, лично я экспериментировал с дисплеем под названием ACM1602K-FL-YTH-02. Редкостный отстой скажу я вам, не покупайте такой.

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

Лучше купить на бакс подороже и не иметь проблем в будующем, мне например понравились наши отечественные МЭЛТовские дисплеи они кстати лишены некоторых проблем с русскими символами (об этом подробнее позже).

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

Сразу хочу сказать, что код рассчитан на двухстрочный 16-ти символьный дисплей, хотя я почти уверен что он заработает и с дисплеем 8х2 без всяких изменений, да и с однострочными наверное тоже.

Первым делом нужно скопировать папку hd44780_driver вместе со всем её содержимым в директорию с файлами своего проекта. Файлов там всего два: Один заголовочный, с кучей малопонятных дефайнов, а другой непосредственно с кодом который реализует функционал.

Если вы подключили дисплей к тому же самому порту и к тем же самым его выводам, то ничего изменять в заголовочном файле (который с расширением .h) не надо.

Если же вы ради удобства разводки платы или по каким либо другим причинам решили пересадить дисплей на другие выводы то нужно их указать в заголовочном файле. Первым делом указываем порт. У меня указан порт С.

После порта идет описание того к каким ножкам порта С подключены определённые ноги дисплея. Напомню, что вывод дисплея R/W я всегда жестко сажаю на землю, так как ничего из дисплея я не читаю, а только пишу в него. 

#define LCD_PORT GPIOC
#define LCD_CD 0
#define LCD_EN 1
#define LCD_DB4 2
#define LCD_DB5 3
#define LCD_DB6 4
#define LCD_DB7 5

На этом настройка заканчивается и теперь можно использовать функции библиотеки предварительно конечно же добавив в файл main.c строчку 

#include “hd44780_driverhd44780_driver.h”

Теперь посмотрим что за функции есть в этой библиотеке, и начнем с инициализации дисплея. Она происходит после вызова функции lcd_init(). Первым делом происходит настройка ног порта которые определены в заголовочном файле. Если этот порт уже был настроен каким либо образом, то настройки других ног не перетираются.

Именно для этого служат все эти адские конструкции из директив препроцессора в заголовочном файле. После настройки ног выполняется непосредственно сама инициализация.

По умолчанию дисплей настраивается следующим образом: 4-х битный режим, включен курсор, при поступлении данных счетчик адреса увеличивается на единицу, дисплей чист, курсор в позиции X0, Y0. Для очистки дисплея используется функция lcd_clear(), с ней я думаю всё понятно.

После её вызова очищается DDRAM и курсор встаёт в позицию с координатами 0,0. Если же вам требуется просто переместить  курсор без очистки дисплея, то на этот случай в библиотеке имеется своя функция lcd_set_xy(x,y), где x и y координаты курсора на экране.

Так же присутствует функция lcd_set_state для управления отображением курсора и состоянием самого дисплея. При помощи неё можно прятать и показывать курсор и заставлять его мигать. Так же существует возможность выключать/включать LCD дисплей. Возможен вызов данной функции со следующими параметрами: 

  • lcd_set_state(LCD_DISABLE, CURSOR_DISABLE, NO_BLINK); – дисплей ничего не показывает, даже если данные в DDRAM есть. Если в качестве первого параметра выступает LCD_DISABLE, то по идее вторые два вообще не важны, так как ни какого курсора при выключенном дисплее мы не увидим.
  • lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK); – дисплей включен, курсора нет, ничего не мигает
  • lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, BLINK); – дисплей включен, курсора нет, но мигает все знакоместо (черным квадратом)
  • lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, NO_BLINK); – дисплей включен, есть не мигающий курсор
  • lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK); – дисплей включен, курсор есть, мигает всё знакоместо. 

При помощи функции lcd_out можно вывести строку текста в текущую позицию курсора, которая может быть установлена вызовом функции lcd_set_xy. В функцию lcd_out следует передавать указатель на строку (строка разумеется должна заканчиваться нульсимволом).

Следующая функция lcd_send принимает два параметра: Первый – байт данных, второй – COMMAND или DATA.  Не трудно догадаться, что она служит для передачи в дисплей байта данных или команды.

И наконец функция lcd_set_user_char предназначена для того чтоб записать пользовательский символ в CGRAM память дисплея. Подробнее о том как это сделать, будет написано в примере. 

Для того чтоб показать как оно работает я написал простенький пример который использует функции из этой библиотеки. Собственно вот он: 

#include “stm32F10x.h”
#include “hd44780_driverhd44780_driver.h”
#include “stm32f10x_rcc.h” int main(void)
{ uint8_t user_char[8]; //Сюда будем записывать пользовательский символ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //Вкл порт С lcd_init(); //Инициализируем дисплей user_char[0]=0b01110; //А вот тут user_char[1]=0b10001; // рисуем user_char[2]=0b10001; // наш символ user_char[3]=0b10001; // user_char[4]=0b10001; // Это типа рыба 🙂 user_char[5]=0b01010; user_char[6]=0b10001; user_char[7]=0b10001; lcd_set_user_char(0, user_char); // Наша рыба это символ номер ноль lcd_out(“This is fish”); //Выводим надпись в нулевую строку lcd_set_xy(0,1); //переводим курсор в первую строку lcd_send(0,DATA); //Выводим символ номер ноль lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK); //Включаем курсор и мигалку while(1) { }
}

В результате выполнения этого кода на дисплее появится надпись и наша рыба которую мы изобразили. Если этот пример не запустился, пишете в комментариях и попробуем разобраться. 

Библиотека так себе, написал её буквально за полтора вечера, особо ничего не оптимизировал, поэтому прошу не пинать меня ногами если вы увидите в ней что-то вырвиглазное 🙂 Несмотря на это она таки работает! Хочу отметить два важных момента: Во-первых – чтоб работал русский язык нужно перекодировать русскую фразу. Т.е. написать lcd_out(“Привет мир”); не получится, вместо русских букв там будут каракули,не не совпадает кодировка. Кстати МЭЛТовские дисплеи имеют команду для смены кодировки, и тогда можно отправлять в дисплей русские буквы так как они есть без перекодирования. В интернетах имеются спец программы позволяющее это сделать, просто надо немного погуглить. Кстати можно просто допилить функцию lcd_out чтоб она сама выполняла перекодировку русских символов. Возможно я улучшу её позже, сейчас в этом нет необходимости. Во-вторых в библиотеке есть функция предназначенная для создания небольшой задержки. Если ваш контроллер работате на каких-то запредельных частотах – просто увеличте значение tmpvar раза в полтора. Если у вас не работает конечно. Сделать это можно в файле hd44780_driver.c строка номер 5. Ну и собственно прикладываю архив со своим проектом в кокосе. 

Источник: http://easystm32.ru/indication/24-library-for-hd44780

Библиотека для работы с дисплеем 1602

Моя реализация библиотеки для дисплея 16х2 под управлением HD44780.

Описывать протокол и особенности управления, пайки и настройки не буду.

https://www.youtube.com/watch?v=XEBVHUNOdx8

Краткие возможности:

  • управление отображением курсора;
  • вкл/выкл дисплея;
  • вывод текста в любое место;
  • поддержка специальных символов
    и ;
  • вывод числа с преобразованием его в строку;
  • и др.

Особенности:

  • используется исключительно 4 битный режим;
  • данные из дисплея не читаются, используются задержки силами RTOS или циклом;
  • все сигналы DATA расположены в одном порту.

Зависимости: 

  • stdint.h – обязательно;
  • string.h – обязательно;
  • stdio.h – обязательно;
  • stm32f2xx.h – определения макросов GPIO_Pin_8, GPIOC и тп, в зависимости от контроллера файл может быть stm32f10x.h, stm32f40x.h и др;
  • FreeRTOS.h – опционально, если используется в проекте, то лучше включить;
  • task.h – обязательно если используется FreeRTOS.h;

Описание функций.

void LCD1602_Init( void );

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

  • 4-битный режим работы;
  • инкремент курсора;
  • курсор невидимый;

void LCD1602_WriteUserSymbol( const uint8_t number, const uint8_t *data );

Используется для записи пользовательского символа в память дисплея в ячейку указанную в аргументе number. 

Пример использования:

// Массив определяется следующим образом:
// 00001110 – 0x0E
// 00011111 – 0x1F
// 00010001 – 0x11
// 00010001 – 0x11
// 00011111 – 0x1F
// 00011111 – 0x1F
// 00011111 – 0x1F
// 00000000 – ОБЯЗАТЕЛЬНО должно быть 0x00
uint8_t symbol[] = {0x0E, 0x1F, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x00}; LCD1602_WriteUserSymbol( 1, symbol);

Последний элемент массива обязательно должен быть нулем, так как эта строка отведена под курсор в виде подчеркивания.

void LCD1602_CursorToHome( void );

Устанавливает курсор в начальное положение координаты (0; 0).

0 1 2 3 4 5 6 7 8 9 A B C D E F
┌———————————————–┐
| | | | | | | | | | | | | | | | | 0
—+–+–+–+–+–+–+–+–+–+–+–+–+–+–+—
| | | | | | | | | | | | | | | | | 1
└———————————————–┘
┌———————————————–┐
|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|
—+–+–+–+–+–+–+–+–+–+–+–+–+–+–+—
|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
└———————————————–┘

void LCD1602_CursorToPosition( const uint8_t position );

Устанавливает курсор в позицию указанную в аргументе position, который может принимать значения от 0 до 31 (от 0 до 1F).

void LCD1602_CursorToPositionXY( const uint8_t X, const uint8_t Y );

Устанавливает курсор в строку Y и ячейку X.

void LCD1602_CursorMode( const CursoreMode cursor );

Устанавливает режим отображения курсора:

  • CURSOR_HIDE – выключает вывод курсора;
  • CURSOR_STATIC – отображается статичным подчеркиванием;
  • CURSOR_BLINK – отображается мигающим прямоугольником

void LCD1602_ClearScreen( void );

Очищает дисплей.

void LCD1602_ScreenOnOff( const FunctionalState NewState );

Включает или отключает дисплей:

  • ENABLE – дисплей включен;
  • DISABLE – дисплей выключен

void LCD1602_PrintCharOfPosition( const uint8_t position, const char symbol );

Печатает символ в выбранной позиции.

void LCD1602_PrintStringOfPosition( const uint8_t position, const char *str );

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

  • – Переносит текст на новую строку;
  • – Вставляет два пробела (пока так).

void LCD1602_PrintNumberOfPosition( const uint8_t position, const int32_t number );

Печатает число, переведенное в строку. Переводит с помощью функции sprintf.

void LCD1602_PrintCharOfPositionXY( const uint8_t X, const uint8_t Y, const char symbol );

Аналогично функции LCD1602_PrintCharOfPosition, только вместо позиции используются координаты.

void LCD1602_PrintStringOfPositionXY( const uint8_t X, const uint8_t Y, const char *str );

Аналогично функции LCD1602_PrintStringOfPosition, только вместо позиции используются координаты.

void LCD1602_PrintNumberOfPositionXY( const uint8_t X, const uint8_t Y, const int32_t number );

Аналогично функции LCD1602_PrintNumberOfPosition, только вместо позиции используются координаты.

void LCD1602_AppendChar( const char symbol );

Добавляет символ в конец последнего вывода.

void LCD1602_AppendString( const char *str );

Дописывает нультерминальную строку, не поддерживает
и .

void LCD1602_AppendNumber( const int32_t number );

Дописывает число.

Настройка библиотеки

Перед использованием необходимо в файле lcd1602.h определить макросы:

#define LCD1602_USE_FREERTOS 1 ///< Определяет будет ли использоваться FREERTOS #define MCU_CLOCK_USECOND (1

Источник: http://cdeblog.ru/lcd-1602-driver-library

Библиотека LiquidCrystal для работы с символьным LCD на Arduino

Данная библиотека позволяет платам Arduino управлять жидкокристаллическими дисплеями (LCD) на основе контроллера HD44780 (или аналогах), который используется в большинстве символьных LCD дисплеев. Библиотека работает либо в четырех, либо в восьми битном режиме (то есть используется 4 или 8 линий данных в дополнение к линиям управления RS, EN и, при необходимости, RW).

Для тестирования приведенных ниже примеров необходимо подключить LCD дисплей к плате Arduino. Для этого понадобятся комплектующие, список которых приведен ниже.

В приведенных ниже примерах используется плата Arduino Uno. Для подключения LCD дисплея к своей плате соедините следующие выводы:

Кроме того, соедините вывод RW LCD дисплея с землей. Крайние выводы потенциометра 10 кОм необходимо подключить к шинам +5V и GND, а средний вывод потенциометра соединить с выводом VO (вывод 3) LCD дисплея. Резистор 220 Ом используется для питания подсветки дисплея (обычно это выводы 15 и 16 LCD дисплея).

LiquidCrystal()Создает переменную типа LiquidCrystal. Дисплей может управляться с помощью 4 или 8 линий данных. В первом случае номера выводов с D0 по D3 пропускаются, а эти выводы остаются неподключенными. Вывод RW, вместо подключения к Arduino, может быть соединен с землей; если это так, то в параметрах функции он пропускается.

Синтаксис

LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

Параметры

  • rs: номер вывода платы Arduino, который подключен к выводу RS LCD дисплея;
  • rw: номер вывода платы Arduino, который подключен к выводу RW LCD дисплея (необязательно);
  • en: номер вывода платы Arduino, который подключен к выводу включения EN LCD дисплея;
  • d0, d1, d2, d3, d4, d5, d6, d7: номера выводов платы Arduino, которые подключены к соответствующим выводам LCD дисплея. d0, d1, d2 и d3 необязательны; если они пропущены, LCD будет управляться с помощью только четырех линий данных (d4, d5, d6, d7).

Пример

#include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.begin(16,1); lcd.print(“hello, world!”); } void loop() {}begin()Инициализирует интерфейс связи с LCD дисплеем, и указывает размеры (ширину и высоту) дисплея. Функция begin() должна быть вызвана до любых других функций из библиотеки LCD.

Синтаксис

lcd.begin(cols, rows)

Параметры

  • lcd: переменная типа LiquidCrystal;
  • cols: количество столбцов (символов в строке) у дисплея;
  • rows: количество строк у дисплея.

clear()Очищает LCD дисплей и помещает курсор в верхний левый угол.

Синтаксис

lcd.clear()

Параметры

  • lcd: переменная типа LiquidCrystal.

home()Помещает курсор в верхний левый угол LCD дисплея. Используется для помещения курсора в место, куда будет выводиться последующий текст. Чтобы еще и очистить дисплей, используйте clear().

Синтаксис

lcd.home()

Параметры

  • lcd: переменная типа LiquidCrystal.

setCursor()Помещает курсор в заданное положение LCD дисплея. Используется для помещения курсора в место, куда будет выводиться последующий текст.

Синтаксис

lcd.setCursor(col, row)

Параметры

  • lcd: переменная типа LiquidCrystal;
  • col: столбец, в который необходимо поместить курсор (первому столбцу соответствует 0);
  • row: строка, в которую необходимо поместить курсор (первой строке соответствует 0).

write()Записывает символ на LCD дисплей.

Синтаксис

lcd.write(data)

Параметры

  • lcd: переменная типа LiquidCrystal;
  • data: символ для записи на LCD.

Возвращаемое значение

bytewrite() возвращает количество записанных байтов, хотя чтение этого количества необязательно.

Пример

#include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { lcd.write(Serial.read()); } }print()Печатает текст на LCD дисплее.

Синтаксис

lcd.print(data) lcd.print(data, BASE)

Параметры

  • lcd: переменная типа LiquidCrystal;
  • data: данные для печати (char, byte, int, long или string);
  • BASE (необязательно): основание для печати чисел: BIN для двоичной формы (основание 2), DEC для десятичной формы (основание 10), OCT для восьмеричной формы (основание 8), HEX для шестнадцатеричной формы (основание 16).

Возвращаемое значение

byteprint() возвращает количество записанных байтов, хотя чтение этого количества необязательно.

Пример

#include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.print(“hello, world!”); } void loop() {}cursor()Показывает курсор на LCD дисплее: подчеркивание (линия) в месте, куда будет записан следующий символ.

Синтаксис

lcd.cursor()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

Смотрите пример для функции noCursor().

noCursor()Скрывает курсор на LCD дисплее.

Синтаксис

lcd.noCursor()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(“hello, world!”); } void loop() { // Выключить курсор: lcd.noCursor(); delay(500); // Включить курсор: lcd.cursor(); delay(500); }blink()Показывает на LCD дисплее мигающий курсор. Если используется в комбинации с cursor(), то результат будет зависеть от конкретного дисплея.

Синтаксис

lcd.blink()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

Смотрите пример для функции noBlink().

noBlink()Выключает мигающий курсор на LCD дисплее.

Синтаксис

lcd.noBlink()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(“hello, world!”); } void loop() { // Выключить мигающий курсор: lcd.noBlink(); delay(3000); // Включить мигающий курсор: lcd.blink(); delay(3000); }display()Включает LCD дисплей после того, как он был выключен функцией noDisplay(). Она восстанавливает текст (и курсор), который был на дисплее.

Синтаксис

lcd.display()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

Смотрите пример для функции noDisplay().

noDisplay()Выключает LCD дисплей без потери текста, который отображается на нем в текущий момент.

Синтаксис

lcd.noDisplay()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(“hello, world!”); } void loop() { // Выключить дисплей: lcd.noDisplay(); delay(500); // Включить дисплей: lcd.display(); delay(500); }scrollDisplayLeft()Прокручивает содержимое дисплея (текст и курсор) на одну позицию влево.

Синтаксис

lcd.scrollDisplayLeft()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

Смотрите пример для функции scrollDisplayRight().

scrollDisplayRight()Прокручивает содержимое дисплея (текст и курсор) на одну позицию вправо.

Синтаксис

lcd.scrollDisplayRight()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print(“hello, world!”); delay(1000); } void loop() { // прокрутить на 13 позиций (длина строки) влево, // чтобы переместить контент за пределы дисплея влево: for (int positionCounter = 0; positionCounter < 13; positionCounter++) { // прокрутить на одну позицию влево: lcd.scrollDisplayLeft(); // немного подождать: delay(150); } // прокрутить на 29 позиций (длина строки + длина дисплея) вправо, // чтобы переместить контент за пределы дисплея вправо: for (int positionCounter = 0; positionCounter < 29; positionCounter++) { // прокрутить на одну позицию вправо: lcd.scrollDisplayRight(); // немного подождать: delay(150); } // прокрутить на 16 позиций (длина дисплея + длина строки) влево, // чтобы переместить контент снова в центр: for (int positionCounter = 0; positionCounter < 16; positionCounter++) { // прокрутить на одну позицию влево: lcd.scrollDisplayLeft(); // немного подождать: delay(150); } // задержка в конце полного цикла: delay(1000); }autoscroll()Включает автоматическую прокрутку на LCD дисплее. Это приводит к тому, что каждый символ, выводимый на дисплей, передвигает предыдущие символы на одну позицию. Если направление текста задано слева-направо (по умолчанию), дисплей прокручивает влево; если направление текста задано справа-налево, дисплей прокручивает вправо. Это дает в результате вывод каждого нового символа на одном и том же месте LCD дисплея.

Синтаксис

lcd.autoscroll()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

Смотрите пример для функции noAutoscroll().

noAutoscroll()Выключает автоматическую прокрутку на LCD дисплее.

Синтаксис

lcd.noAutoscroll()

Параметры

  • lcd: переменная типа LiquidCrystal.

Пример

Скетч печатает символы от 0 до 9 с выключенной автоматической прокруткой, затем перемещает курсор вниз и вправо, включает автоматическую прокрутку и печатает эти символы снова.

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { // поместить курсор в точку (0,0): lcd.setCursor(0, 0); // напечатать символы от 0 до 9: for (int thisChar = 0; thisChar < 10; thisChar++) { lcd.print(thisChar); delay(500); } // поместить курсор в точку (16,1): lcd.setCursor(16, 1); // включить автоматическую прокрутку на дисплее: lcd.autoscroll(); // напечатать символы от 0 до 9: for (int thisChar = 0; thisChar < 10; thisChar++) { lcd.print(thisChar); delay(500); } // выключить автоматическую прокрутку lcd.noAutoscroll(); // очистить экран для следующего цикла: lcd.clear(); }leftToRight()Устанавливает направление текста, записанного на LCD, в значение «слева направо», которое является значением по умолчанию. Это означает, что последующие символы, записанные на дисплей, идут слева направо, но это никак не влияет на ранее записанный текст.

Синтаксис

lcd.leftToRight()

Параметры

  • lcd: переменная типа LiquidCrystal.

rightToLeft()Устанавливает направление текста, записанного на LCD, в значение «справа налево» (значение по умолчанию – «слева направо»). Это означает, что последующие символы, записанные на дисплей, идут справа налево, но это никак не влияет на ранее записанный текст.

Синтаксис

lcd.rightToLeft()

Параметры

  • lcd: переменная типа LiquidCrystal.

Источник: https://radioprog.ru/post/158

Подключаем LCD-дисплей на базе HD44780 к Arduino

При работе с иногда возникает необходимость вывести какие-либо данные на дисплей, но передавать для этого данные на ПК имеет смысл только если устройство будет использоваться в связке с ПК. А как же быть с автономными устройствами? Тут на помощь придут LCD-дисплеи.

Рассмотрим LCD-дисплеи на базе контроллера HD44780 на примере WH1602B-YYK-CTK.Этот монохромный дисплей имеет опциональную подсветку и может отображать 2 строки по 16 символов. Разрешение символов — 5×8 точек. Есть поддержка кириллицы, но странная, об этом — в конце статьи.

Чем хороши такие дисплеи? Контроллер HD44780 — стандарт де-факто среди небольших монохромных LCD-дисплеев, поэтому библиотеку для работы с дисплеями на его базе не написал только ленивый. Ленивым на сей раз оказался я, а вот разработчики Arduino написали библиотеку для своей платформы, и называется она LiquidCrystal.

Её мы и используем для работы с выбранным мной дисплеем.

Итак, прежде чем писать код, нужно подключить дисплей к Arduino. Вам понадобятся:

  • или
  • LCD-дисплей, например WH1602B-YYK-CTK
  • макетная плата
  • соединительные провода
  • потенциометр

Схема подключения в официальном руководстве на сайте Arduino выглядит так:Однако, здесь по какой-то причине не используется подсветка, без которой изображение на дисплее выглядит хуже, чем на дешёвых китайских электронных часах. Так что мы, как подобает настоящим джедаям, её задействуем.

Кстати, дисплей имеет режим самотестирования, который можно включить, подсоединив выводы:

  • 1 — Vss, земля ⇨ GND
  • 2 — Vdd, питание ⇨ +5 В
  • 3 — Vo, управление контрастностью напряжением ⇨ выход потенциометра
  • 15 — A, питание для подсветки ⇨ +5 В
  • 16 — K, земля для подсветки ⇨ GND

Верхний ряд символов должен полностью заполниться тёмными прямоугольниками:Повращайте ручку потенциометра, чтобы настроить контрастность дисплея. Если вы не видите верхний ряд прямоугольников, то либо вы неправильно подключили дисплей, либо его сожгли. Хотя, кто знает — может, просто режим самотестирования не поддерживается (:

А для полноценной работы с дисплеем подключим 12 выводов:

  • 1 — Vss, земля ⇨ GND
  • 2 — Vdd, питание ⇨ +5 В
  • 3 — Vo, управление контрастностью напряжением ⇨ выход потенциометра
  • 4 — RS, выбор регистра ⇨ пин 12 Arduino
  • 5 — R/W, чтение/запись ⇨ земля (режим записи)
  • 6 — E, он же Enable, cтроб по спаду ⇨ пин 11 Arduino
  • 7-10 — DB0-DB3, младшие биты 8-битного интерфейса; не подключены
  • 11-14 — DB4-DB7, старшие биты интерфейса ⇨ пины 5-2 Arduino
  • 15 — A, питание для подсветки ⇨ +5 В
  • 16 — K, земля для подсветки ⇨ GND

Этот дисплей, как и прочие на контроллере HD44780, поддерживает два варианта параллельного интерфейса:

  • 8-битный, выводы DB0-DB7, за один такт передаётся 1 байт (8 бит)
  • 4-битный, выводы DB4-DB7, за один такт передаётся половина байта (4 бита)

Смысла использовать 8-битный вариант нет, потому что это требует больше ног, а выигрыша в скорости всё равно нет: частота обновления дисплея не больше 10 раз в секунду, так что мы всё равно не сможем увидеть часто обновляемые данные. Поэтому выводы DB0-DB3 оставляем неподключенными.

Ну что же, всё подключено — пора писать код. Начнём с классического «Hello, World», который доступен в Arduino IDE через пункт меню File ⇨ Examples ⇨ LiquidCrystal ⇨ HelloWorld:

/* Подключаем библиотеку для работы с LCD */ #include /* Создаём объект LCD-дисплея, используя конструктор класса LiquidCrystal * с 6ю аргументами. Библиотека по количеству аргументов сама определит, * что нужно использовать 4-битный интерфейс. * Указываем, к каким пинам Arduino подключены выводы дисплея: * RS, E, DB4, DB5, DB6, DB7 */ LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { /* Инициализируем дисплей: 2 строки по 16 символов */ lcd.begin(16, 2); /* Выводим на дисплей традиционную фразу (: */ lcd.print(“hello, world!”); } void loop() { /* Устанавливаем курсор в 1 столбец 2й строки. Нумерация идёт с нуля, * первым аргументом идёт номер столбца. */ lcd.setCursor(0, 1); /* Выводим на дисплей число секунд, прошедших с момента старта Arduino */ lcd.print(millis() / 1000); }Ничего сложного, как видите: основного кода набралось всего 4 строки. Обратите внимание на инициализацию дисплея:lcd.begin(16, 2);Здесь мы задали размер экрана: 2 строки по 16 символов. Прелесть в том, что можно, ничего не меняя в схеме, подцепить другой дисплей — например, размером 16х4 символа, или сэкономить и взять 8х2. Достаточно изменить строку инициализации соответственно размеру подключенного дисплея.Но банальными надписями сыт не будешь, так что изучим документацию на предмет более продвинутых возможностей. Нам доступные следующие полезные методы:

  • home() и clear()Первый метод возвращает курсор в начало экрана; clear() делает то же самое, заодно стирая всё, что было на дисплее до этого.
  • write(ch)Выводит одиночный символ ch на дисплей.Пример:lcd.write('z'); lcd.write(0); // вывести символ с кодом 0; см. метод createChar()
  • cursor() и noCursor()Позволяют показать курсор на дисплее (символ подчёркивания) и скрыть его.
  • blink() и noBlink()Включить и выключить мигание курсора, если включено его отображение.
  • display() и noDisplay()Включить и выключить дисплей.
  • scrollDisplayLeft() и scrollDisplayRight()Прокрутить экран на один символ влево или вправо.
  • autoscroll() и noAutoscroll()Включить и выключить режим автопрокрутки. В этом режиме при выводе каждого следующего символа содержимое экрана будет смещено на один символ влево (или вправо, если включен режим вывода справа налево), а выводимый символ займёт место первого сдвинутого. Проще говоря, в этом режиме все последующие символы выводятся в одно и то же место, вытесняя текущее содержимое экрана.
  • leftToRight() и rightToLeft()Устанавливают направление вывода текста: слева направо и справа налево, соответственно.
  • createChar(ch, bitmap)Самая крутая функция: позволяет создать свой символ с кодом ch (от 0 до 7), пользуясь массивом битовых масок bitmap для задания тёмных и светлых точек.

Неплохо бы опробовать все эти функции, не правда ли? Сказано — сделано! Напишем большой и фаршированный функционалом скетч:#include /* Константа: высота символа в точках */ 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(); // пишем слева направо }Видеозапись процесса работы этого скетча:

Надеюсь, вас не испугал такой объём кода. Зато всё в одном скетче, а не в нескольких, как в примерах к библиотеке LiquidCrystal. Исходный код с комментариями на английском языке также доступен вот и на GitHub в .

Теперь о кириллице. Дело в том, что китайцы решили, что поддержка кириллицы — это значит произвольным образом раскидать по таблице знаков кириллические символы, без соответствия какой-либо кодировке.

Один добрый человек, , в далёком 2010 году написал библиотеку LiquidCrystalRus, которая умело справляется с китайской кириллицей, делая её поддержку прозрачной.

Однако с тех пор она малость устарела, поэтому я, да не осудит меня автор, её освежил и выкладываю .

Напишем с её помощью русский вариант «Hello, World»:#include #include #include 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); }
Теперь вы знаете всё о работе с библиотекой LiquidCrystal, и в ваших силах создать более функциональное устройство с LCD-дисплеем — нужно только проявить фантазию (:

Для написания статьи были использованы:

Выражаю всяческие благодарности и за железо и помощь в подготовке статьи, а также Илье Данилову за библиотеку с поддержкой кириллицы.

Источник: http://robocraft.ru/blog/arduino/503.html

Подключение HD44780 Работа с алфавитно-цифровым ЖКИ инициализация

Рассмотрим взаимодействие пользователя и устройства на базе микроконтроллера. Очень часто пользователю нужно чем-то вводить информацию, и с чего-то ее считывать. Для этих целей очень хорошо подходит клавиатура и дисплей (заметка про считывание клавиши).

Рассмотрим взаимодействие пользователя и устройства на базе микроконтроллера. Очень часто пользователю нужно чем-то вводить информацию, и с чего-то ее считывать. Для этих целей очень хорошо подходит клавиатура и дисплей (заметка про считывание клавиши).

В этой заметке рассмотрим поподробнее отображение информации на символьном ЖКИ со знакосинтезирующим контроллером HD44780.

Такие индикаторы часто используются при проектировании цифровых устройств, поэтому с ним необходимо уметь работать.
Рассмотрим типовое внутреннее строение знакосинтезирующего ЖКИ:

Внутренняя структура HD44780

В основе ЖКИ лежит матрица из жидких кристаллов, подавая напряжение на элемент которой мы можем «зажечь» точку на экране. В нашем случае матрица состоит из знакомест (чаще всего 8х5 пикселей), сгруппированых в несколько рядков. Этим всем управляет встроенный контроллер HD44780.

У контроллера есть однобайтные ячейки памяти (DDRAM), содержимое которых собственно отображается на экране согласно таблице записанной в CGRAM. Ячеек памяти обычно больше чем знакомест в ЖКИ, поэтому адресацию знакомест нужно смотреть в даташите.

То есть нам необходимо только в нужную позицию записать код нужного знака, а все остальное HD44780 сделает сам.

Для выбора позиции существует виртуальный курсор (номер текущей ячейки памяти, АС), которым можно управлять посредством команд, курсор можно сделать видимым. По умолчанию при записи символа в ячейку, курсор сдвигаеться вперед на одну позицию.

Коды символов для ЖКИ поддерживающего кириллицу можно увидеть в таблице:

Старшая тетрада кода будет равна ряду выбранного символа, а младшая – строке. Можно создать свою таблицу символов, записав ее в CGRAM. На каждый символ требуется 5 байт, где единицы отвечают за «зажженные» пиксели.

Например, цифра «8» кодируется последовательностью 0x6c,0x92,0x92,0x92,0x6c.
Коды команд приведены в таблице.

Таблица символов HD44780

Значения флагов:

Остается открытым вопрос: «как записать в нужную позицию код требуемого символа»? Для этого рассмотрим за что отвечают выводы ЖКИ. Выводы DB0-DB7 отвечают за входящие/исходящие данные. Высокий уровень на выводе RS дает индикатору понять, что сигнал на выводах DB0-DB7 является данными, а низкий – командой. Вывод W/R отвечает за направление данных, пишутся ли данные в память или читаются из нее (обычно чтение из ЖКИ не используется, можем смело на него подать низкий уровень). Импульс на выводе Е (длительностью не менее 500 нс) используется как сигнал для записи/чтения данных с выводов DB0-DB7, RS и W/R.

Вывод V0 используется для задания контраста изображения, вывода А,К – для питания подсветки (если она есть в вашей модели ЖКИ). Оставшиеся 2 вывода – собственно питание ЖКИ. То есть, для управления ЖКИ потребуется 8+1+1=10 выводов.

Но можно работать в режиме 4-х битного интерфейса. При этом, сперва будет передавать старшая тетрада команды/данных на выводах DB4-DB7, а после – младшая. Выводы при DB0-DB3 при этом не используются. Итого для управления требуется 6 выводов микроконтроллера.

Теперь рассмотрим живой пример. Напишем программу для вывода текста «avrlab.com» на имеющийся у меня в наличии WH1602А (2 строки по 16 символов).

Для других ЖКИ следует сверить соответствие ячеек DDRAM знакоместам.

Схема подключения ЖКИ к контроллеру выглядит так.

Схема подключения к микроконтроллеру AVR

Резистор R3 – 17 Ом ограничивает ток через подсветку, а переменный VR1 задает контраст (если все правильно подключено и запрограммировано, но индикатор молчит, покрутите VR1, чтобы изображения стало видимым).

Также не в коем случае не следует путать полярность ЖКИ, питать его выше 5,5В, со своего опыта могу сказать, что горят они моментально. Назначение всех остальных деталей такое же как в макетной платы для ATtiny2313.
Теперь перейдем к написанию программы.

Для контроля индикатора напишем программу с несколькими ключевыми функциями работы с ЖКИ: lcd_dat(unsigned char x) – для записи данных х, lcd_com(unsigned char x) – для записи команды х, lcd_init(void) – для начальной инициализации индикатора:

  1. #include //библиотека ввода/вывода

  2. #define RS 2 //RS=PD2 – сигнал управления ЖКИ

  3. #define E 3 //E=PD3 – сигнал управления ЖКИ

  4. #define TIME 10 //Константа временной задержки для ЖКИ

  5. //Частота тактирование МК – 4Мгц

  6. //Программа формирвоания задержки

  7. void pause (unsigned int a)<\p>

  8. { unsigned int i;

  9. for (i=a;i>0;i–);

  10. }

  11. //Программа передачи команд в ЖКИ

  12. void lcd_com (unsigned char lcd)

  13. { unsigned char temp;

  14. temp=(lcd&~(1

Источник: https://avrlab.com/node/80

Alex_EXE

STM32. 4. Последовательный порт (UART)

Для вывода текстовой информации различного содержания удобно применять символьные дисплеи в виду их распространённости и простоты использования. В основе большинства таких дисплеев лежит контроллер HD44780, который позволяет подключаться к дисплею по 4 или 8 линейной шины данных и 3-х линий управления.

WH1602 подключенный к STM32

В статье расскажу, как подключить такие дисплеи по упрощенной 4-х проводной линии данных с 2-мя линиями управления к контроллеру STM32F100RB установленному на STM32vlDiscovery с помощью двух библиотек: для дисплеев с HD44780 контроллерами и Standard Peripheral Library.

Как и в предыдущей статье по применению дисплея от nokia1100 с stm32 контроллером за основу возьму свой старый код, написанный под PIC контроллер, адаптирую и оформлю в библиотеку.

Из-за того, что большинство winstar дисплеев (на нашем рынке среди символьных дисплеев на HD44780 преобладают они) имеют 5В питание и логику – это внесёт некоторые особенности их подключения к 3,3В stm32 контроллерам. А именно: Во-первых: понадобиться 5В источник питания для дисплея, в наше случае на Discovery он есть;

Во-вторых: такой дисплей можно подключить или через согласователь интерфейса , или только к 5В толерантным выводам контроллера с подтяжкой к 5В. Воспользуемся вторым способом. Из таких выходов удобно и подряд расположенные это: RB10 – RB15.

Схема

На макетной плате без пайки такое количество резисторов, скрытое на первой фото под дисплеем, выглядит следующим образом.

Небольшой резисторный ад под дисплеем

Вдаваться в специфику работы дисплеев построенных на HD44780 не буду, если кому интересно в Интернете такого материала много, например можно посмотреть на сайте gaw.ru .

Способы общения с такими дисплеями давно реализованы, и взяв за основу свой старый код сформировал библиотеку под stm32. О ней и расскажу. Для работы с дисплеем остается только добавить в проект 2 файла: lcd-hd44780.c и lcd-hd44780.

h , сконфигурировать выводы для работы с дисплеем и работать в своё удовольствие.

Возможности библиотеки:
lcd44780_init_pins() — конфигурирование выводов дисплея
lcd44780_init() — инициализация дисплея
lcd44780_ClearLCD() – очистка дисплея
lcd44780_SetLCDPosition(x,y) — установка курсора
x, y – положение курсора
lcd44780_ShowChar(c) — вывод символа в ASCII
c – символ
lcd44780_ShowStr(*s) — вывод строки
*s – ссылка на строку (массив символов)

Конфигурация порта для работы с дисплеем, описанная в lcd-hd44780.h

// Конфигурация порта // используемый порт #define lcd44780_port GPIOB // используемые выводы #define lcd44780_pin_RS GPIO_Pin_11 #define lcd44780_pin_E GPIO_Pin_10 #define lcd44780_pins_data GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 // включить тактирование порта #define lcd44780_RCC RCC_APB2Periph_GPIOB // смещение начала линии данных #define lcd44780_offset 12

Библиотека рассчитана на подключения дисплея с помощью 6-ти линий одного порта контроллера. Две линии управления на этом порте могут быть любыми, а вот 4 линии данных должны идти подряд.

В примере дисплей подключен к 5В толерантным линиям порта B, выводы с открытым коллектором. Линии управления E – PB10, RS – PB11. 4 подряд идущих линии данных: PB12, PB13, PB14, PB15 и ещё указано смещение 12, т.к. начинаем с 12 вывода порта.

После задания конфигурации выводов в коде вызываем конфигурирования выводов дисплея функцией — lcd44780_init_pins(), далее инициализируем дисплей — lcd44780_init() и можно с ним работать.

Код примера:

lcd44780_init_pins(); // конфигурирование выводов дисплея lcd44780_init(); // инициализация дисплея lcd44780_ShowStr(«wh1602 + STM32»);// вывод надписи на дисплей lcd44780_SetLCDPosition(5, 1);// установка курсора lcd44780_ShowStr(«alex-exe.ru»);// вывод надписи на дисплей while(1==1){} // основная программа в бесконечном цикле

Скачать библиотеку для работы с дисплеями на основе контроллера HD44780

Скачать файлы проекта

STM32. 6. АЦП, RTC или что-то другое

Источник: https://alex-exe.ru/radio/stm32/stm32-lcd-hd44780-spl/

Подключение LCD 1602 (HD44780) к Arduino

Опубликовано 18.03.2014 10:17:00

LCD дисплеи размерности 1602, на базе контроллера HD44780, являются одними из самых простых, доступных и востребованных дисплеев для разработки различных электронных устройств.

Его можно встретить как и в устройствах собранных на коленке, так и в промышленных устройствах, таких, как например, автоматы для приготовления кофе.

 На базе данного дисплея собраны самые популярные модули и шилды в тематике Arduino такие как LCD I2C модуль и LCD Keypad Shield.

В данной статье мы расскажем как его подключить к Arduino и вывести информацию.

Данные дисплеи имеют два исполнения: желтая подсветка с черными буквами либо, что встречается чаще, синюю подсветку с белыми буквами. 

Размерность дисплеев на контроллере HD44780 может быть различной, управляться они будут одинаково. Самые распространенные размерности 16×02 (т.е. по 16 символов в двух строках) либо 20×04. Разрешение же самих символов – 5×8 точек.

Большинство дисплеев не имеют поддержку кириллицы, имеют её лишь дисплеи с маркировкой CTK. Но данную проблему можно попытаться частично решить (продолжение в статье).

Выводы дисплея:

На дисплее имеется 16pin разъем для подключения. Выводы промаркированы на тыльной стороне платы.

1 (VSS) – Питание контроллера (-) 2 (VDD) – Питание контроллера (+) 3 (VO) – Вывод управления контрастом 4 (RS) – Выбор регистра  5 (R/W) – Чтение/запись ( режим записи при соединении с землей) 6 (E) – Еnable (строб по спаду)  7-10 (DB0-DB3) – Младшие биты 8-битного интерфейса 11-14 (DB4-DB7) – Старшие биты интерфейса 15 (A) – Анод (+) питания подсветки

16 (K) – Катод (-) питания подсветки

 

Режим самотестирования:

Перед попытками подключения и вывода информации, было бы неплохо узнать рабочий дисплей или нет. Для этого необходимо подать напряжение на сам контроллер (VSS и VDD), запитать подсветку (A и K), а также настроить контрастность.

Для настройки контрастности следует использовать потенциометр на 10 кОм. Каким он будет по форме – не важно. На крайние ноги подается +5V и GND, центральная ножка соединяется с выводом VO

После подачи питания на схему необходимо добиться правильного контраста, если он будет настроен не верно, то на экране ничего не будет отображаться. Для настройки контраста следует поиграться с потенциометром.

При правильной сборке схемы и правильной настройке контраста, на экране должна заполниться прямоугольниками верхняя строка.

Вывод информации:

Для работы дисплея используется встроенная с среду Arduino IDE библиотека LiquidCrystal.h

//Работа с курсором 
lcd.setCursor(0, 0); // Устанавливаем курсор (номер ячейки, строка)
lcd.home(); // Установка курсора в ноль (0, 0)
lcd.cursor(); // Включить видимость курсора (подчеркивание)
lcd.noCursor(); // Убрать видимость курсора (подчеркивание)
lcd.blink(); // Включить мигание курсора (курсор 5х8)
lcd.noBlink(); // Выключить мигание курсора (курсор 5х8) //Вывод информации
lcd.print(“zelectro.cc”); // Вывод информации
lcd.clear(); // Очистка дисплея, (удаление всех данных) установка курсора в ноль
lcd.rightToLeft(); // Запись производится справа на лево
lcd.leftToRight(); // Запись производится слева на право
lcd.scrollDisplayRight(); // Смещение всего изображенного на дисплее на один символ вправо
lcd.scrollDisplayLeft(); // Смещение всего изображенного на дисплее на один символ влево //Информация полезная для шпионов:)
lcd.noDisplay(); // Информация на дисплее становится невидимой, данные не стираются
// если, в момент когда данная функция активна, ничего не выводить на дисплей, то
lcd.display(); // При вызове функции display() на дисплее восстанавливается вся информация которая была

Сам же дисплей может работать в двух режимах :

• 8-битный режим – для этого используются и младшие и старшие биты (BB0- DB7)

• 4-битный режим – для этого используются и только младшие биты (BB4- DB7)

Использование 8-битного режима на данном дисплее не целесообразно. Для его работы требуется на 4 ноги больше, а выигрыша в скорости практически нет т.к. частота обновления данного дисплея упирается в предел < 10раз в секунду.

Для вывода текста необходимо подключить выводы RS, E, DB4, DB5, DB6, DB7 к выводам контроллера. Их можно подключать к либым пинам Arduino, главное в коде задать правильную последовательность.

Пример программного кода:
//Тестировалось на Arduino IDE 1.0.5 #include  // Лобавляем необходимую библиотеку
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup(){   lcd.

begin(16, 2); // Задаем размерность экрана   lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
  lcd.print(“Hello, world!”); // Выводим текст
  lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
  lcd.print(“zelectro.

cc”); // Выводим текст
} void loop(){
}

 

Создание собственных символов

С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера внутри дисплея и с ними проблем нет. А вот что делать если нужного символа в памяти контроллера нет?

Не беда, требуемый символ можно сделать вручную (всего до 7ми символов). Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.

В ниже приведенном примере нарисуем смайлик.

//Тестировалось на Arduino IDE 1.0.5 #include 
#include  // Лобавляем необходимую библиотеку
// Битовая маска символа улыбки
byte smile[8] =
{
  B00010,
  B00001,
  B11001,
  B00001,
  B11001,
  B00001,
  B00010,
};    
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup(){   lcd.begin(16, 2); // Задаем размерность экрана   lcd.createChar(1, smile); // Создаем символ под номером 1   lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
  lcd.print(“1”); // Выводим смайлик (символ под номером 1) – “1”
      } void loop(){
}

Бонус

В комментариях участник сообщества скинул ссылку на генератор символов

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Источник: http://zelectro.cc/LCD1602

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}