Найти в Дзене
Реальная Сталь

Ардуино. Программирование с нуля до ЧПУ. Вывод на дисплей без библиотек

Самое важное и единственное предназначение Ардуино обработка какой либо информации. Но все это не имеет смысла, если обработанную информацию куда либо не выводить.

Устройства вывода это могут быть световые индикаторы (светодиоды, светодиодные ленты, лампочки, итд), различные звуковые сигнализаторы (динамики, пищалки), семисегментные индикаторы и наконец дисплеи.

Дисплеи могут быть выполнены по LCD, TFT и OLED-технологии.

В этой статье мы рассмотрим жидкокристаллические знакосинтезирующие то есть символьные дисплеи для Arduino, как их подключить и заставить работать. Анимацию картинок в таких дисплеях воспроизвести не получиться, как например в TFT, только символьная информация, цифры, латиница, кириллица, специальные символы из таблицы ASCII (American Standard Code for Information Interchange), сокращенно от Американского стандартного кода для обмена информацией, является стандартом кодирования символов для электронной связи.

ПРИМЕЧАНИЕ В некоторых дисплеях, особенно в китайских, могут отсутствовать кириллица и некоторые символы. Смотрите документацию.

Все это находится во флеш памяти самого дисплея. Дисплей можно назвать мини компьютером. У него есть флеш память, оперативная память, процессор, порты ввода\ вывода. Основано на контролере, обычно HD44780 или ему подобных KS0066, КБ1013ВГ6

LCD дисплеи маркируются следующим образом, например:

1602 - шестнадцать символов, 2 строки

2002 - двадцать символов, 2 строки

2004 - двадцать символов, 4 строки

                                          LCD дисплеи фирмы МЭЛТ
LCD дисплеи фирмы МЭЛТ
.
.
                        КИТАЙСКИЙ ДИСПЛЕЙ С ПОДПИСАННОЙ РАСПИНОВКОЙ
КИТАЙСКИЙ ДИСПЛЕЙ С ПОДПИСАННОЙ РАСПИНОВКОЙ

Мы видим шестнадцать (или более) выводов на дисплее. Через них мы управляем контроллером дисплея, а контроллер управляет экранчиком. Рассмотрим их назначение. Ищем в сети и открываем документацию ( даташит, Datasheet ) на наш дисплей и видим.

  1. —  VSS — это общий провод или "земля"
  2. —  VDD — питание согласно даташиту, обычно 5 вольт, 1,5 ма
  3. — V0 — это ножка, с помощью которой регулируется контрастность дисплея.
  4. — RS(A0) — это ножка, с помощью которой контроллер дисплея будет "знать", какие именно данные находятся на шине данных. Если мы подадим на данную ножку логический 0, то значит будет команда, если 1 — то это данные.
  5. — RW — данная ножка в зависимости от логического состояния на ней говорит контроллеру дисплея, будем мы с него читать или будем мы в него писать данные. Если будет 0 — то мы в контроллер дисплея будем писать, а если 1 — то будем читать данные из контроллера дисплея. Функция чтения используется редко, поэтому мы просто подключим ее к земле, то есть подадим логический 0.
  6. — E — стробирующая шина по спадающему фронту, когда 1 меняется на 0, контроллер дисплея понимает, что именно сейчас наступил момент чтения данных на ножках данных D0 — D7.

7-14 — ножки D0 — D7 — это параллельная восьмибитная шина данных, через которую и передаются данные. Номера 0 — 7 соответствуют одноименным битам в байте данных. Но также есть ещё 4-битный способ передачи данных в контроллер дисплея, когда используются только ножки данных D4 — D7, а ножки D0 — D3 уже не используются.

15 +LED (А) плюс питания подсветки , 5 вольт 150 ма

16 –LED(К) минус питания подсветки, земля

Подсветку можно подключить напрямую к 5 вольтам, но очень рекомендуется через резистор 100-200 ом, или поставить переменный резистор 10 к, для регулировки интенсивности подсветки. Если хотите временную подсветку, например при нажатии кнопки светится определенное время, ставим транзисторный ключ и управляем этим ключом из программы Ардуино

Простым языком.

  • Подаем на ножку RS 0 или 1, в зависимости команда у нас или данные
  • Подаем на ножку Е логическую 1,
  • Подаем на D0 — D7 данные (RS 1) или команду (RS 0). В четырех битном режиме работает D4 — D7, данные или команда отправляется в два приема.
  • Подаем на ножку Е логический 0(строб). В этот момент контроллер дисплея, в зависимости от состояния RS или записывает в память команду или выводить символ на экран.

Где нам брать команды и зачем они? Ищем в сети и смотрим даташит(data sheets) нашего дисплея

                                                      Команды LCD
Команды LCD

Где Х любое значение 0 или 1. C=0, B=0 — курсора нет, ничего не мигает, C=0, B=1 — курсора нет, мигает весь символ в позиции курсора, C=1, B=0 — курсор есть (подчёркивание), ничего не мигает, C=1, B=1 — курсор есть (подчёркивание) и только он и мигает.

Внимательный читатель спросит, зачем нам 8 битный или 4 битный режим. Это борьба между скоростью, экономией ножек и памятью Ардуино.

.
.

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

Четырехбитный режим требует 6 ножек. Работает чуть медленнее восьмибитного режима и требует чуть больше памяти.

Есть способ подключения LCD вообще по двум поводам, по протоколу I2C (TWI). Медленная работа, "Кушает" много памяти и требует приобретения дополнительного компонента.

                                  Подключение LCD по протоколу I2C (TWI)  И2С
Подключение LCD по протоколу I2C (TWI) И2С

Для каждого способа существуют готовые библиотеки, созданные сообществом Ардуинщиков, <LiquidCrystal.h>, <LiquidCrystal_I2C.h> и. т. д

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

Оптимизированный скетч без использования библиотеки экономит более 30 процентов памяти Ардуино и ускоряет работу. Не подумайте, это не антибиблиотечина, их создали умные люди для нас. Но мы все таки учимся программировать.

Для н наглядности кода дадим имя каждому пину Ардуино согласно схеме вверху в виде глобальных констант

.
.

Теперь каким то образом  нужно организовывать процесс общения с дисплеем, то есть каким образом мы будем этим процессом управлять. Что бы передавать данные с помощью этих ножек напишем функцию принимающую два параметра. Назовем ее Send_Lcd_4Bit (byte State , uint8_t data){тело нашей функции}.Функция ни чего не возвращает, пишем впереди void. Функцию помещаем за пределами цикла loop.

.
.

Как видим функция при вызове принимает два параметра byte State и uint8_t data. Если мы в byte State передаем логическую 1 то будет команда, если 0 то будет символ. В uint8_t data мы передаем или команду или символ.

Стоит объяснить bitRead (data,7). В данной строке читаем восьмой бит в байте data и функцией digitalWrite устанавливаем его состояние на ножке D7 LCD (12 ножка ардуино). И так 4 раза, затем на E LCD (8 ножка ардуино) делаем строб, Происходит запись в память LCD состояние D4-D7, полубайт. Затем так же остальной полубайт.

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

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

Для передачи команды создадим функцию void Command_LCD(uint8_t cmd){тело;}.В переменной cmd посылаем команду. Размещаем функцию так же за пределами loop. Вызывать функцию будем например из setup.

Для передачи символа создадим функцию void lcdChar(const char chr){тело;} В переменной chr мы будем передавать символ. Обратите внимание на ее тип CHAR.

.
.

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

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

.
.

Как видим нужно послать в дисплей три раза 00000011, затем 00000010 через определенные паузы, затем идет установка параметров из таблицы команд сверху . Это количество строк дисплея, размер шрифта, курсор .

.
.

Первоначальная установка(Инициализация) произведена, пора выводить символы, вспоминаем функцию void lcdChar(const char chr). Но этой функцией мы можем выводить только по одному символу, да еще каждому символу задать адрес знакоместа.

.
.

Давайте лучше создадим функцию вывода строки void lcdString(const char* str) и в ее теле сделаем цикл while(*str != '\0'). Условием выхода из цикла будет окончание строки. Тип переменной char увидит '\0'. Пробел считается символом.

В этом цикле, при каждом проходе будем вызывать функцию вывода символа lcdChar, а она будет вызывать функцию Send_Lcd_4Bit (0, (uint8_t)chr); , где в chr будет код символа , а логический 0 установит RS в логическую 1, то есть не команда, символ.

.
.

Теперь мы можем выводить целые строки, конечно не более 20 символов в строке, включая пробелы. 20 символов, 4 строки в данном случае или сколько позволит ваш дисплей.

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

Полный текст скетча можно скачать ТУТ

Смело паяем схему, прошиваем, она у Вас обязательно заработает.

А можно и не паять. В нашем распоряжении есть отличный симулятор, под названием ПРОТЕУС(Proteus)

.
.

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

Протеус и ардуино будет в следующей сатье ТУТ