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

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

Хотел бы представить Вашему вниманию свою собственную библиотеку для работы с широко распространёнными символьными дисплеями на базе контроллера HD44780.


Рис.1 Внешний вид дисплея на базе контроллера HD44780 ( 2 строки Х 16 символов).

Библиотека написана на С#, в Atmel Studio 6.2. Библиотека состоит из двух файлов: HD44780_Config.h и HD44780.c. Первый файл является заголовочным, он, собственно, и подключается в Ваш разрабатываемый проект директивой #include «HD44780_Config.h». Также, в этом файле мы прописываем все необходимые нам начальные настройки. Вот, собственно, исходный код этого заголовочно — настроечного файла:

Здесь, в общем и целом, каждая функция и каждый заданный макрос описаны между знаками комментария /* */. Большее внимание хотелось бы уделить макросам, определяющим инициализационные настройки:

Данный макрос определяет, по какой схеме Вы хотите подключить свой дисплей к микроконтроллеру — 4-х проводная (Data_Length 0) или 8-ми проводная (Data_Length 1).


Рис.2 Схемы подключения дисплея к МК

а) 8-ми проводная б) 4-х проводная

Если вы выбираете 4-х проводную схему, то побитно записываете порты МК, к которым подключены линии дисплея, в этот макрос:

Например, где PORT_bus_4 — это имя порта МК, к которому подключена линия дисплея DB4. Аналогично и с записью бита порта: PIN_bus — номер бита порта, к которому подключена линия дисплея DB4.

Если вы выбираете 8-ми проводную схему, то побитно записываете порты МК, к которым подключены линии дисплея, в этот макрос:

Здесь все так же, только проводов больше. Зачем же такие сложности, спросите вы? Ответ прост-благодаря этому, Вы можете подключать линии дисплея абсолютно в разброс по всем портам МК, к которым захотите и ножки которых будут свободны. Просто зачастую получается так, что при проектировании какого-либо устройства не удаётся сохранить абсолютно свободным целый порт. Я часто сталкивался с этой проблемой, и решил её таким вот образом. Здесь Вы не привязаны к конкретным ножкам МК, какие цифры напишете и названия портов в вышеприведённых макросах настройки, по таким линиям микроконтроллера и будет работать ваш дисплей.

Остальные макросы и функции, я думаю, не вызовут затруднений в использовании, поскольку их описание приводится непосредственно в исходном коде заголовочного файла. Единственная функция, которой я хотел бы уделить дополнительное внимание-функция записи в память CGRAM пользовательских символов, которых нет в таблице ASCI:

LCD_UserSymbolsWrite(uchar Addr, uchar *data);

Данная функция позволяет нам записать в энергозависимую память знакогенератора 8 собственных символов, которые Вы сами и придумаете. Для большей ясности, дабы мне не повторять автора, можете почитать интересную статью: //cxem.net/mc/book52.php. Там расписана вся работа дисплея на аппаратном уровне. Моя статья и библиотека призваны упростить применение дисплея=)

Так, я немножко отвлёкся от темы. Запись в дисплей пользовательских символов. — Для упрощения этой задачи, в дополнение к библиотеке, я написал простую программу:


Рис.3 Внешний вид программы для рисования пользовательских символов

Синие квадратики соответствуют не активированным пикселям сегмента дисплея. Кликом мыши можно переключать эти пиксели между видимым состоянием и не видимым. Программа рассчитывает значения байтов данных и автоматически создаёт готовый массив одного символа Symbol[8], состоящего из восьми байт. После того, как вы закончили рисование своего символа, копируете весь массив в Ваш проект и запихиваете его в память дисплея функцией LCD_UserSymbolsWrite вот так:

где i — адрес памяти CGRAM, предназначенный для пользовательских символов. Диапазон адресов: 0х00-0х07;

&Symbol[0] — указатель на нулевой (начало) элемент массива с данными для сегмента.

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


Рис.4 Внешний вид программы для рисования пользовательских символов с готовым результатом


Рис.5 и 6 Иллюстрация работы

В общем и целом, вроде бы всё. Если что-то будет непонятно, почитать можно тут: //cxem.net/mc/book52.php.

Если даже после этого останутся вопросы — задавайте в комментариях. Спасибо за внимание!

  • Все
  • Тематические

    Писал я как-то статейку про подключение этих дисплеев к Arduino. Но сейчас моё кремниевое сердце принадлежит STM32, а с имеющимися дисплеями работать хочется. Как-то раз мне понадобилось визуально отладить алгоритм для этих МК — я собрался духом и сел писать библиотеку.

    Писать с нуля, постоянно копошась в даташите, мне не хотелось, поэтому я решил портировать ардуиновскую библиотеку LiquidCrystal на STM32F10x, для начала. После того, как основная работа была сделана (это заняло примерно три дня с отладкой, матюками и другой работой) и дисплей подружился с STM32VLDISCOVERY , я подумал, что было бы неплохо заиметь поддержку таких дисплеев и для других подсемейств STM32.

    В результате более чем недельного программерского задротства

    получилась кросс-платформенная библиотека, которую я, не мудрствуя лукаво, назвал банально — HD44780. Её исходники открыты под лицензией MIT и выложены на GitHub ( архив ). Рассмотрим библиотеку поподробнее.

    Структура

    Так как я хотел добиться максимальной портируемости кода и лёгкой его подстройки под разные семейства МК, я отделил логику работы библиотеки от непосредственной работы с выводами конкретных МК, и реализовал это известными методами абстракции — интерфейсами и драйверами. Что это такое и как работает? Библиотека работает с GPIO через интерфейс — набор функций. Каждая функция интерфейса принимает в качестве аргументов указатель на интерфейс, идентификатор вывода дисплея (HD44780_PIN_RS, HD44780_PIN_DP5 и т.п.) и остальные аргументы, необходимые для выполнения операции над GPIO:

    Скорее всего, у вас возник закономерный вопрос: на кой нужно функции, члену интерфейса, передавать указатель на этот интерфейс? А сделано это потому, что в библиотеке любой драйвер GPIO представляет собой структуру, первым членом которой является как раз такой интерфейс, поэтому можно спокойно приводить указатель на драйвер к указателю на интерфейс — таким образом, драйвер может «прикинуться» интерфейсом. Гляньте на объявление драйвера GPIO для STM32F10x:

    Теперь, если заставить библиотеку работать с GPIO только через указатель на HD44780_GPIO_Interface, можно подсунуть ей указатель на экземпляр драйвера, просто приведя последний к HD44780_GPIO_Interface*. А библиотека вообще не знает, с чем на самом деле она работает — может, там не GPIO, а толпа китайцев, замыкающих контакты по вызову функции интерфейса. Налицо реализация типичной парадигмы ООП — полиморфизма. Кто там говорил, что C — не объектно-ориентированный язык?

    Драйвер, в свою очередь, реализует функции интерфейса и в них приводит указатель на интерфейс обратно к указателю на драйвер. Получается, что библиотеке видна только «верхушка» драйвера, а оставшаяся часть видна только драйверу. Вот и инкапсуляция нарисовалась. Дополню своё объяснение схемой:

    а также кодом одной из функций драйвера:

    С такой организацией доступа к GPIO драйвера полностью отделены от библиотеки, так что если у вас есть кучка китайцев, можете написать драйвер и для них, не меняя код библиотеки (:

    Делу — время, а потехе — час

    Окей, пора браться за дело, но перед этим проясню один момент: библиотека использует пользовательскую функцию для создания задержек, которую вам нужно написать. Я предпочитаю реализовывать её при помощи таймера SysTick. Функция должна принимать число микросекунд и делать соответствующую задержку (или дольше). Конечно, delay()-ориентированное программирование не есть гуд, но потом ниже я объясню, как с этим жить.

    И да, в настройках проекта поставьте стандарт языка C99 (флаг -std=c99).

    Максимальная суммарная задержка при вызове функции библиотеки при такой реализации delay_microseconds() может составлять до 20 мс, что может быть критичным. С другой стороны, реализация полностью асинхронной библиотеки — это задача нетривиальная, а в данном случае ещё и сложная. Да и использовать такую библиотеку будет не очень-то просто.

    Но выход есть — использовать операционную систему реального времени (RTOS). Есть подробная статья о том, как подружить STM32 и FreeRTOS — свободную и открытую RTOS для микроконтроллеров. Она очень популярна, функциональна и поддерживает тонны различных МК, включая STM32. Так вот, в ней есть функция vTaskDelay(), которая замораживает не всю программу, как это было бы без RTOS, а только ту задачу (поток), в которой была вызвана функция. В этом случае реализация delay_microseconds() будет заключаться в вызове vTaskDelay(), и задержки будут влиять только на ту задачу, которая работает с LCD.

    Интерфейс библиотеки

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

    Функция hd44780_create_char() создаёт символ с заданным ASCII-кодом от 0 до 7, используя битовое описание символа в виде массива из 8 байтов, каждый из которых кодирует строку из 5 точек. Пользоваться ей нужно так:

    Разумеется, символы можно встраивать в строки через escape-последовательности, но тут нужно иметь ввиду, что код 0 является завершением строки, так что такой символ придётся печатать отдельно, как в примере. Кстати, для просмотра созданных символов не обязательно запускать код — достаточно в редакторе сделать поиск текста «1» и воспользоваться функцией подсветки результатов поиска (:

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

    Функция hd44780_clear() не только очищает экран, но и перемещает курсор в начало, как это делает hd44780_home().

    Заключение

    На данный момент я написал и протестировал драйвера GPIO для STM32F10x, STM32F2xx, STM32F4xx и STM32L1xx. Так что все STM32 охвачены, кроме ещё не поступивших в продажу STM32F0 на базе архитектуры Cortex-M0. Ну, тут я немножко лукавлю: драйвер для STM32F2xx я тестировал на STM32F4DISCOVERY, т.к. МК этой серии у меня нет (голый кристалл не в счёт). Но результатам можно верить, т.к. STM32F2xx совместимы по периферии с STM32F4xx, и более того — код для STM32F2xx таки заработал на вышеуказанной плате, так что должен работать и с настоящим STM32F2xx.

    Был у меня лёгкий порыв написать ещё дровишку для AVR, но угас, когда я вспомнил об Arduino, с которого портировал библиотеку. Впрочем, если кому сильно нужно, можете попросить меня или написать сами по образцу.

    Сами драйвера лежат в директории drivers, а в директорию examples я положил все 4 примера для STM32, на которых тестировал работу дисплея, в виде своих проектов для Eclipse. Впрочем, не обязательно импортировать проект в Eclipse — достаточно в консоли зайти в /Debug и выполнить команду make (GNU ARM Eclipse plugin создаёт makefile’ы для конфигураций Debug, Release и т.п.)

    Надеюсь, библиотека вам пригодится, несмотря на сравнительную сложность её применения (:

    Библиотека на СИ, для LCD дисплеев на базе процессора HD44780, для микроконтроллеров AVR

    Время от времени мне приходится использовать LCD дисплеи в разных изделиях. Эти изделия базируются на AVR микроконтроллерах. Раньше я писал проги на асме, и у меня была написанная мною библиотечка для этих дисплеев. Но недавно пересел на СИ. И написанной мной библиотеки на СИ еще не было. Поэтому пользовался чужими, скачанными откуда то и когда то. Но вот решил замутить для себя свою собственную сишную библиотеку. Одна из целей данной библиотеки, это лучше научится программировать на СИ. Ведь научиться можно чему то, лишь делая что то. На идеальность и красоту кода не претендую, так как я еще учусь. Если увидите, что можно улучшить, пишите. Интересно будет посмотреть.

    Итак, что может данная библиотека? Поддерживается 4х и 8ми битное подключение. Поддерживается только вывод символов на дисплей. Поддержки работы с памятью CGRAM нету. Ибо за все время использования этих дисплеев, мне это ни разу не требовалось. Кажется, что и не потребуется.

    Прежде чем начать что то писать, решил сперва освежить в памяти принцип работы с этими дисплеями. Для этого было нарыто 2 мануала на русском. Обратил внимание на несколько пунктов, которые мне показались важными.

    Первый пункт — правильная инициализация дисплея.

    Нужно выдержать паузу не менее 15 мс между установлением рабочего напряжения питания >4.5 В и выполнением каких либо операций с дисплеем. Три раза подряд подать команду 0x30 на шину LCD без проверки флага занятости BF. Между каждой командой нужно выдерживать временные паузы не менее 4.1 мс и 100 мкс.

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

    8.Далее работаем с дисплеем в обычном режиме.

    Второй пункт — назначать правильное состояние портам микроконтроллера.

    В исходном состоянии LCD, Е=0, R/W=0, RS-произвольно. Шина данных DB0-DB7 в состоянии высокого импеданса (HI). Такое состояние должно поддерживаться все время в промежутках между операциями обмена с LCD.

    Третий пункт — период сигнала Е, должен быть не менее 500 нс. Большинство операций выполняемых LCD занимают около 40 мкс, а некоторые до единиц мсек. Поэтому цикл ожидания флага BF должен предшествовать совершению любой операции с LCD.

    Освежив память этими принципами, начал писать код. Писал в AtmelStudio_6.1. Тестировал все на Atmega16, на древнем Дихальтовском пинбоарде.

    Библиотека представляет собой два файла LCD.h и LCD.c. В LCD.h находятся все дефайны и прототипы функций. В LCD.c реализация функций. Файлы к проекту подключаются так:

    Сперва файл LCD.h

    Потом файл LCD.c
    В окне Solution Explorer правой клавишей кликаем на папку с именем проекта. В появившемся окне выбираем Add/Existing item и наш файл который уже заранее положен в директорию проекта. Должно получится как на картинке.


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

    Все настройки производятся в файле LCD.h. В файле LCD.c нужно выставить только частоту кварца.

    Для начала наверное надо определиться, какая шина у дисплея будет использоваться, 4х битная или 8ми битная. После того как решили, ныряем в файл LCD.h и выбираем шину данных. Это делается раскомментированием или закомментированием #define LCD_8BIT.

    Потом назначаем выводам дисплея, управляющие выводы микроконтроллера.

    Причем выводы LCD DB0. DB7 можно подключать к порту МК как угодно, хоть по порядку, хоть в разброс, хоть наперекосяк, хоть морским узлом. Это значения не имеет.

    Например можно так:

    Управляющие пины дисплея E, RS, R/W тоже как и DB0. DB7 можно подключать как угодно, на любые свободные пины МК в выбранном порту. Теперь все настроено, осталось только проверить правильность подключения вашего дисплея к МК в соответствии с файлом LCD.h.

    Пару слов о 4х битном подключении.
    Так как в таком подключении используются только пины данных DB4. DB7, то пины E, RS, R/W можно подключить к тому же порту где висят DB4. DB7. Так же порядок подключения пинов значения не имеет, можно хоть прямо, хоть криво. А можно E, RS, R/W подключить на другой порт. В общем как вам надо так и подключайте.

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

    Некоторые функции опишу.

    Установка курсора в нужную позицию.

    Первая цифра может быть от 0 до 39. Она означает позицию в строке. А вторая цифра означает строку. Если 0 верхняя строка, 1 нижняя строка. Вот карта символов дисплея.

    Ну а про остальные функции особо нечего говорить. Просто их вызываешь и выполняется какое нибудь действие. Действие которое написано в комментарии к этой функции.

    Тест библиотеки.
    Перед тем как выложить библиотеку всенародно, я ее протестировал. Начальная схема подключения была такая:

    Тестировал так:

    1. Во время работающего дихальтовского пинбоарда, выдрал на ходу кварц на 8 Мгц и вставил на 16Мгц. Ничего не загнулось. Все продолжало работать, только в два раза быстрее. Я еще пару раз по ходу работы выдергивал и менял кварц то на 8 то на 16 Мгц. Вырубал/врубал питание на 16и Мгц, дисплей все равно инициализировался и продолжал работать.

    2. Тогда я врубил прерывание на таймере Т0 по совпадению регистра совпадения с регистром счета. Предделитель выставил 001. Меньше уже нельзя. Ну и начал уменьшать число в регистре сравнения OCR0. Когда прерывание стало возникать каждые 12 тактов кварца, то библиотека загнулась. Причем загнулась где то на уровне функции LCDinit();. Дисплей даже не инициализировался. Я не стал рыть землю ибо в реальных проектах навряд ли прерывания возникают каждые 12 тактов. Но прикольно что на 13 тактах все работает. Когда я переключил дисплей на 8ми битную схему, то библиотека стабильно работала при любом значении в регистре OCR0. Даже когда там был 0.

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

    Но опять таки, это не обязательно, так как я выше уже сказал, что навряд ли существуют такие проекты в которых прерывание возникает каждые 13 тактов кварца. Ну а после инициализации дисплея хоть все огнем гори. Прерывания могут возникать когда угодно и как угодно, на работу дисплея это никак не влияет. Ни на 4х ни на 8ми битную шину.

    3. Потом я начал собирать различные схемы подключения LCD к МК. Перепробовал разные схемы и 4х битные и 8ми. Последняя схема была 4х битная. На один порт посадил пины DB4. DB7 и E, RS, R/W. Все схемы заработали сразу.

    Так что проект выкладываю в топик. Если вам нужна эта библиотека, то качайте весь проект и выдирайте оттуда эти два файла LCD.h и LCD.c и библиотэка ваша.

    А если позарез нужны функции работы с памятью CGRAM? Могу вас обрадовать. Вопрос можно решить двумя способами.
    1. Допишите сами эти функции. Правда неплохая идея?

    2. Есть у меня еще одна библиотека, импортовая какая то. Когда то, откуда то скачал. Несколько раз использовал в довольно серьезных проектах. Все четко работает, хотя не все там сделано оптимально с точки зрения кода. И некоторые вещи сделаны не в согласии с мануалом. Однако же работает. Там тоже вагон функций, я в них даже до конца еще не разобрался. Ну и со схемами подключения там не все радужно. Так вот просто как хочется не подключишь дисплей. Постоянно надо лезть в исходники и что то там подправлять, чтоб все состыковалось с желаемой схемой подключения. Кстати когда писал свою библиотеку, то подсматривал в эту импортовую либу. Некоторые идеи оттуда содрал начисто но модернезировал. Но зато эта импортовая библиотека поддерживает работу с CGRAM. Тоже ее в топик выложил.

    Кстати об объеме кода моей библиотеки. Она влезет в чип с 2мя кб памятью, еще и место останется для других дел. Но как правило дисплеи с такими МК навряд ли используются.

    Кстати товарищ Signaller тестировал данную библиотеку в Протеусе. Говорит, что все вроде нормально моделируется.

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

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

    Подключение LCD дисплея на HD44780 к Arduino

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

    Необходимые комплектующие

    • плата Arduino или Genuino;
    • LCD дисплей (совместимый с контроллером Hitachi HD44780);
    • потенциометр 10 кОм;
    • резистор 220 Ом;
    • перемычки;
    • макетная плата.

    Схема

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

    • вывод RS LCD дисплея к цифровому выводу 12;
    • вывод EN LCD дисплея к цифровому выводу 11;
    • вывод D4 LCD дисплея к цифровому выводу 5;
    • вывод D5 LCD дисплея к цифровому выводу 4;
    • вывод D6 LCD дисплея к цифровому выводу 3;
    • вывод D7 LCD дисплея к цифровому выводу 2;

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

    Подключение LCD дисплея к Arduino. Схема соединений Подключение LCD дисплея к Arduino. Схема электрическая принципиальная

    Функции

    Синтаксис

    Параметры

    • 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 ).

    Пример

    begin() Инициализирует интерфейс связи с LCD дисплеем, и указывает размеры (ширину и высоту) дисплея. Функция begin() должна быть вызвана до любых других функций из библиотеки LCD.

    Синтаксис

    Параметры

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

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

    Синтаксис

    Параметры

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

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

    Синтаксис

    Параметры

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

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

    Синтаксис

    Параметры

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

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

    Синтаксис

    Параметры

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

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

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

    Пример

    print() Печатает текст на LCD дисплее.

    Синтаксис

    Параметры

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

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

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

    Пример

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

    Синтаксис

    Параметры

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

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

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

    Синтаксис

    Параметры

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

    Пример

    blink() Показывает на LCD дисплее мигающий курсор. Если используется в комбинации с cursor() , то результат будет зависеть от конкретного дисплея.

    Синтаксис

    Параметры

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

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

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

    Синтаксис

    Параметры

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

    Пример

    display() Включает LCD дисплей после того, как он был выключен функцией noDisplay() . Она восстанавливает текст (и курсор), который был на дисплее.

    Синтаксис

    Параметры

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

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

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

    Синтаксис

    Параметры

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

    Пример

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

    Синтаксис

    Параметры

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

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

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

    Синтаксис

    Параметры

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

    Пример

    autoscroll() Включает автоматическую прокрутку на LCD дисплее. Это приводит к тому, что каждый символ, выводимый на дисплей, передвигает предыдущие символы на одну позицию. Если направление текста задано слева-направо (по умолчанию), дисплей прокручивает влево; если направление текста задано справа-налево, дисплей прокручивает вправо. Это дает в результате вывод каждого нового символа на одном и том же месте LCD дисплея.

    Синтаксис

    Параметры

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

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

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

    Синтаксис

    Параметры

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

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

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

    Синтаксис

    Параметры

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

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

    Синтаксис

    Параметры

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

    Заключение

    Примеры использования библиотеки LiquidCrystal смотрите в статье Взаимодействие Arduino с символьным LCD дисплеем.

    Использование библиотеки для работы с LCD HD44780

    Дата публикации: 07 февраля 2012 .

    В этой статье я расскажу как с помощью достаточно распространенной библиотеки управлять LCD дисплеем на базе контроллера HD44780 и выводить на него информацию. Библиотека состоит из двух файлов lcd_lib.h и lcd_lib.c для использования с дисплеем подключенным по четырехбитной шине данных. В заголовочном файле прописываются настройки подключения дисплея к контроллеру, которые можно изменить по своему усмотрению, а также переменные и функции.

    Ниже представлены базовые функции управления и вывода информации на LCD.

    lcd_com – посылка команды в LCD

    Пример:
    lcd_com(0x01); // очистка дисплея
    lcd_com(0x38); // интерфейс 8 бит 2 строки

    lcd_dat – вывод одного символа в текущую позицию

    Пример:
    lcd_dat(«U»); // вывод символа «U»
    lcd_dat(0xB0); // вывод символа «Ю»(В соответствие с таблицей символов дисплея)

    lcd_init – Инициализация LCD

    Вот пример широко распространенной последовательности для инициализации LCD: 0x38, 0xOC, 0x06 .
    0x38 устанавливает режим отображения 2-х строк с матрицей 5 х 8 точек и работу с 8-ми разрядной шиной данных;
    0xOC включает отображение на экране ЖКИ-можуля, без отображения курсоров;
    0x06 устанавливает режим автоматического перемещения курсора слева-направо после вывода каждого символа.

    lcd_clr – очистка LCD

    lcd_home – переводит курсор в начало

    lcd_string – вывод строки указанной длинны в текущую позицию

    Пример: lcd_string(«TEST»,4); // вывод строки TEST длиной 4 символа

    lcd_gotoxy – перемещает курсор в указанную позицию

    Пример: lcd_gotoxy(12, 1); // курсор в позиции тринадцатый разряд второй строки

    copy_string_to_lcd – вывод строки из флеш-памяти в указанную позицию дисплея

    Пример: copy_string_to_lcd(«TEST»,4,0); // вывод строки TEST в позицию пятый разряд первой строки

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

    Чтобы вывести на экран дисплея собственный символ необходимо знать код символа, прописать этот код в памяти программ микроконтроллера (PROGMEM), затем поместить его в свободную ячейку памяти LCD (CGRAM) и выводить его на экран при помощи функции lcd_dat().

    Для программирования доступны 8 переопределяемых символов в режиме с матрицей 5х7 точек и 4 с матрицей 5х10 (в режиме 5х10 переопределяемые символы адресуются кодами DDRAM через один: 0x00, 0x02, 0x04, 0x06). Для кодирования матрицы используются горизонтально «уложенные» байты, пять младших битов которых несут информацию о рисунке (причем 1(единица) означает, что сегмент будет включен), 4-й разряд каждого из 8-ми (или 11-ти в режиме 5 х 10) байтов матрицы определяет левую колонку символа, а 0-й — правую. Старшие три бита не используются, равно как и старшие пять байтов, составляющих полную область матрицы символа (16 байтов) в режиме 5х10 (обратите внимание, что матрица программируемых символов допускает использование полной высоты строки (8 строчек для режима 5х7 и 11 строчек для режима 5х10), то есть можно размещать точки в области подчеркивающего курсора).

    Создавать символ более удобно в двоичном формате, к примеру создадим символ прямоугольника, код будет таким:

    lcd_shift_right – перемещает изображение на указанное число символов вправо

    lcd_shift_Left – перемещает изображение на указанное число символов влево

    lcd_cursor_on – включает курсор подчеркивание

    lcd_cursor_blink – включает мигающий курсор

    lcd_cursor_off – выключает курсор

    lcd_blank – отключает изображение, но не очищает

    lcd_visible – включает изображение

    lcd_cursor_left – перемещает курсор на указанное число символов влево

    lcd_cursor_right – перемещает курсор на указанное число символов вправо

    lcd_progress_bar — позволяет выводить на дисплей динамическую шкалу, об этой функции поговорим более подробней на практическом примере.

    lcd_num_to_str — позволяет выводить на дисплей переменную до 4 разрядов

    Пример: void lcd_num_to_str(ADC, 4); // Выводим переменную АЦП 4 разряда

    Сделаем проект «Аналоговый вольтметр» в котором информация об измеренном напряжении будет выводится на экран в виде горизонтальной динамической шкалы. Измеряемое напряжение подается на вход ADC0, максимум 5В. без использования делителя. Используем для этого проекта микроконтроллер atmega8, который тактируется от внутреннего генератора частотой 8МГц. Дисплей подключаем по четырехбитной шине в соответствие с настройками из файла lcd_lib.h. При создании проекта в AVRSTUDIO копируем 2 файла библиотеки в папку нашего проекта, а в дереве проекта добавляем эти файлы(lcd_lib.c и lcd_lib.h).

    За вывод динамической шкалы отвечает функция lcd_progress_bar(uint8_t progress, uint8_t maxprogress, uint8_t length), в зависимости от состояния переменных этой функции, шкала меняет свой уровень, progress — уровень от 0 до 255, maxprogress — максимальный уровень ограничивается числом от 0 до 255, length — длина шкалы от 0 до 16 ячеек(в зависимости от типа дисплея). Так как при максимальном напряжении на входе значение ADC равно 1024, делим это значение на 4 и присваиваем его переменной «u», а переменную «u» используем в функции вывода динамической шкалы progress().