С полным описанием всех параметров и характеристик модуля ЖК-дисплея можно ознакомиться здесь. В данной статье детально описано, что необходимо для подключения дисплея к плате Arduino UNO, а также, что заложено в основу его поддержки посредством программы.
При этом стоит понимать, что применение такого дисплея не будет очень востребовано в большинстве устройств. Основная причина тому — отсутствие возможности осуществлять настройки с таким очень простым ЖК-модулем. Для реализации таких функций нужна клавиатура.
Данная тема более детально будет рассмотрена в одной из следующих статей, но на сегодняшний день можно воспользоваться уже готовым решением Arduinо — платой Olimex, имеющей название SHIELDLCD16x2.
Данная плата является платой расширения, посредством которой существенно увеличиваются возможности Arduino. Плата оснащена модулем ЖК-дисплея (две строки и в каждой по 16 символов), 4 кнопки и 8 дополнительных линий GPIO. На плате установлен процессор PIC, осуществляющий обмен данными с Arduino UNO посредством интерфейса TWI. На практике проблем с применением такого модуля (со встроенным микроконтроллером) возникнуть не должно, ведь имеется доступ к библиотеке функций. Процесс подготовки модуля к рабочему процессу должен выглядеть следующим образом.
Подготовительные процессы для начала работы с платой Olimex
Подготовительный этап модуля для выполнения предстоящих задач состоит из двух этапов:
- аппаратный: тривиальный, ведь нет никакой проблемы в том, чтобы вставить плату расширения в плату Arduino UNO;
- программный: заключается в процессе установления библиотеки, неотъемлемой частью которой являются функции поддержки модуля.
Для того, чтобы установить библиотеку, переходим на сайт создателя модуля (компания Olimex). Далее в поле поиска (находится возле кнопки Search) прописываем часть названия модуля «LCD16x2» (рис 1). При помощи мышки нажимаем на Search. Из появившихся на экране результатов выбираем «SHIELD-LCD16x2».
Блок «Software» расположен под описанием модуля (рис 2). Указанная в таком поле любая строка текста представляет собой ссылку на файл (загрузка происходит с веб-сайта Olimex). В данном случае наш интерес касается ссылки, имеющей название «OLIMEXINO-328 + SHIELD-LCD16x2 — a library and set of demo examples». Нажав на данную ссылку происходит загрузка zip-файла, который сохраняется на ПК. Также предоставляется возможность просмотреть иные предлагаемые варианты, но для нашей ситуации вполне хватит установки библиотеки с каталога LCD16x2.
Посредством Arduino IDE предоставляется возможность по установлению библиотеки в различные способы. Самым простым вариантом будет выполнение загрузки исходников в каталог проекта (подкаталог libraries).
Каталог, предназначенный для хранения проектов, который был создан в процессе установки Arduino IDE. В основном системой Windows каталог размещается в подкаталог Компьютер-Документы-Arduino (это присуще польско-язычной вариации системы). Для добавления источника библиотеки к данному примеру необходимо переместить каталог LCD16x2 в папку libraries. После чего можно приступать к запуску Arduino IDE.
Считывание положения кнопок посредством SHIELD-LCD16X2
Правильней всего до начала работы со своей программой будет ознакомиться с существующими вариантами использования функций библиотеки LCD16x2.h, которая является неотъемлемой частью каталога Examples. Предлагаемый способ обучения будет гораздо продуктивнее, в сравнении с изучением документов, хотя без этого тоже будет сложно обойтись.
Согласно вышесказанному стало понятно, что процесс обмена информацией между платой расширения и платой UNO происходит посредством последовательного интерфейса. Учитывая это, возникает необходимость в изменении описанных ранее функций, ведь они применяли 4-битный параллельный интерфейс.
Не будет ошибкой предположение, что обмен информацией между расположенным на плате расширения микроконтроллером и модулем символьного ЖК-дисплея осуществляется таким же способом. Но при этом Arduino UNO не распознаёт дисплей, из-за чего процесс управления выполняется косвенно. Это предопределяет необходимость для начала программы с присоединения библиотек поддержки конкретного последовательного интерфейса и модуля дисплея (установлен на плату расширения).
#include
#include
Для большего удобства и исключения необходимости применять длинное время имя библиотеки, рациональнее будет присвоить её алиас lcd. Оно будет применяться на практике, а после точки прописываться имя библиотечной функции.
LCD16x2 lcd;
Вспомнив ранее написанную статью, мы уже знаем, что программы, предназначенные для Arduino, разделяются на две части:
- функцию инициализации: ввод команд осуществляется в теле функции void setup(). Могут быть выполнены исключительно один раз. Посредством данной функции происходит запуск интерфейса TWI, очистка ЖК-экрана, включение подсветки дисплея на максимально допустимой яркости светодиода.
- бесконечный цикл: ввод команд осуществляется в теле функции void loop(). Выполнение происходит на постоянной основе во время функционирования программы.
void setup()
{
Wire.begin(); //TWI interface init
lcd.lcdClear(); //LCD screen clear
lcd.lcdSetBlacklight(255); //maximum backlight on
}
Рассматривая плату Olimex, при условии, что ни какая кнопка не нажата, на функции чтения кнопок происходит возврат только единицы, при нажатии на кнопку отвечает связанный с ней бит.
Посредством функции readButtons() происходит возврат переменной типа int, при этом её вызов имеет такой вид:
zmienna = lcd.readButtons();
Не составляет труда осуществлять работу с битами, являющимися логическими нулями, но проще и комфортнее для дальнейшего анализа, наличие уже установленного соответствующего бита.
Выполните это т.н. единичное дополнение:
переменная =~переменная;
В случае с установленным битом, тестирование его уровня легче выполнять при помощи логического произведения. Он будет равен «истина» в том случае, когда каждая из составляющих будет равна «истина». Проверку последовательных битовых позиций можно выполнить с помощью констант: 0х01 касательно бита на позиции 0,0х02, 1,0х04 на позиции 2, 0х08 на позиции 3 и так далее.
При этом не имеет никакого значения, применяются для проверки битов 16-цатеричные, 2-ичные или 10-тичные числа. Практика показывает, что написание значительно проще с 16-цатеричными числами.
Обратите внимание на то, что следующие, применяемые для проверки позиции бита 16-е числа, это степени 2.
buttons = lcd.readButtons();
if (buttons & 0x01) pressed = 1;
else if (buttons & 0x02) pressed = 2;
else if (buttons & 0x04) pressed = 3;
else if (buttons & 0x08) pressed = 4;
else pressed = 0;
Все данные о нажатых кнопках содержит в себе переменная buttons. После применения if … else происходит завершение тестирования кнопки по окончанию выполнения условий. Это позволяет минимизировать время функционирования программы, но при этом возникает недостаток, заключающийся в том, что кнопка как бы является частью иерархии, поэтому прочесть состоянии больше одной нажатой кнопки не предоставляется возможным. Это что-то по типу одновременного нажатия на компьютере Shift и Ctrl.
Маска 0х01 относится к первой кнопке слева, а 0х08 — к правой справа. Каждая кнопка в программе имеет свой номер, а само значение им присваивается переменной pressed, что будет непременно соответствовать условному номеру кнопки. Данные номера отображаются на экране, начиная с первой строки и первого столбца. Сообщение будет появляться только в том случае, когда pressed будет отличаться от 0. В ином случае появится сообщение «No button», свидетельствующее об отсутствии нажатия какой-либо кнопки. В конце сообщения — 3 пробела. Это позволяет очищать последние знаки надписи в процессе наложения на «1 is pressed», ведь оно длиннее.
lcd.lcdGoToXY(1, 1);
if (pressed != 0)
{
lcd.lcdWrite(pressed);
lcd.lcdGoToXY(2, 1);
lcd.lcdWrite(" is pressed");
}
else lcd.lcdWrite("No button ");
Статья дополнена всем необходимым скетчем. Непременно копируем его и направляем в память микроконтроллера Arduino UNO, нажав при этом клавиши — Ctrl+U (Sketch → Upload).
SHIELD-LCD16X2 Дочерняя плата; LCD-дисплей; I2C,UART
ARDUINO UNO REV3 Arduino; ATMEGA328; GPIO,I2C,PWM,SPI,UART