Войти
Android, Windows, Apple, Ликбез. Социальные сети. Драйверы
  • Японские телефоны Новый японский смартфон
  • Lenovo G500S: характеристики, основные особенности
  • Определяем серию продукта видеокарт Nvidia Характеристики карты nvidia 9800 gt
  • А конкуренты у смартфона есть
  • Что такое расширение файла TRZ?
  • Не работает динамик в "айфоне"
  • LCD WH1602B компании Winstar. LCD WH1602B компании Winstar Схема подключения lcd 1602 к arduino uno

    LCD WH1602B компании Winstar. LCD WH1602B компании Winstar Схема подключения lcd 1602 к arduino uno

    Жидкокристаллический дисплей (LCD) мод. 1602 (даташит) - отличный выбор для ваших проектов.

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

    Контакты и схема подключения LCD 1602 к Arduino

    Контакты на этом дисплее пронумерованы от 1 до 16. Нанесены они на задней части платы. Как именно они подключаются к Arduino, показано в таблице ниже.

    Табл. 1. Подключение контактов LCD 1620 к Arduino

    Подключение 1602 к ArduinoЕсли дисплей 1602 питается от Arduino через 5-ти вольтовой USB-кабель и соответствующий пин, для контакта контраста дисплея (3-й коннектор – Contrast) можно использовать номинал 2 кОм. Для Back LED+ контакта можно использовать резистор на 100 Ом. Можно использовать и переменный резистор – потенциометр для настройки контраста вручную.

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

    Табл. 2. Предпочтительные цвета проводников

    Схема подключения LCD дисплея 1602 к Arduino:


    Базовый пример программы для работы LCD 1602 с Arduino

    В примере используются 0, 1, 2, 3, 4, и 5 пины Arduino для подключения соответствующих пинов 4, 6, 11, 12, 13 и 14 с дисплея 1602 (смотри табл. 1). После этого в коде для Arduino мы инициализируем lcd() следующим образом:

    LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

    Этот кусок кода объясняет Arduino, как именно подключен LCD дисплей.

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

    LCD 1602A, Arduino и датчик освещенности (фоторезистор)

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


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

    Необходимые материалы

    • 1 Arduino UNO;
    • 1 макетная плата (63 рельсы);
    • 1 датчик освещенности (фоторезистор);
    • 1 потенциометр на 50 кОм;
    • 1 LCD дисплей 1602A;
    • 1 резистор на 10кОм;
    • 1 рельса коннекторов (на 16 пинов);
    • 1 USB кабель.

    LCD Дисплей 1602A

    Дисплеи, как правило, продаются без распаянных коннекторов. То есть, паяльник в руках придется подержать. Вам понадобится 16 пинов. Запаивайте со стороны коротких ног, длинные оставляйте для дальнейшего подключения к плате или другим периферийным устройствам.

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

    Подключение дисплея 1602A к Arduino

    Первое что необходим о – запитать дисплей. Подключите два кабеля от +5 вольт и земли к соответствующим рядам плюс-минус на макетной плате.

    Подключите: пин на 5 вольт (5V) с Arduino к одной из дорожек макетной платы.

    Подключите: пин Земля (GND) Arduino к другой дорожек (макетной платы).

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

    Подключите: дорожку GND (минус) на макетной плате к 1 пину на LCD экране (он обозначен как VSS).

    Подключите: дорожку 5 вольт (плюс) на макетной плате ко 2 пину на LCD экране (он обозначен как VDD).

    Подключите: дорожку 5 вольт (плюс) на макетной плате к 15 пину на LCD экране (он обозначен как A).

    Подключите: дорожку GND (минус) на макетной плате к 16 пину на LCD экране (он обозначен как K).

    Подключаем нашу Arduino к персональному компьютеру через USB-кабель и вуаля! Экран должен включиться.

    Следующий шаг – подключение потенциометра для регулировки контрастности дисплея. В большинстве гайдов, используется потенциометр на 10 кОм, но 50 кОм тоже подойдет. Из-за большего диапазона значений сопротивлений на выходе потенциометра, более точная настройка становится сложнее, но для нас в данном случае это не критично. Установите потенциометр на макетной плате и подключите три его пина.

    Подключите: первый пин на потенциометре к минусу на макетке.

    Подключите: средний пин потенциометра к 3 пину на дисплее (он обозначен как V0).

    Подключите: третий пин на потенциометре к плюсу на макетке.

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

    Продолжим. Теперь нам надо обеспечить обмен данными между Arduino и LCD дисплеем 1602A для отображения символов.

    Для этого подключите 4 пин дисплея (RS) к 7 пину Arduino (желтый коннектор). 5 пин дисплея (RW) – к ряду пинов земля на макетке (черный кабель).

    6 пин дисплея (E) – к 8 пину Arduino (ШИМ).

    11 пин дисплея (D4) – к 9 пину Arduino (ШИМ).

    12 пин дисплея (D5) – к 10 пину Arduino (ШИМ).

    13 пин дисплея (D6) – к 11 пину Arduino (ШИМ).

    14 пин дисплея (D7) – к 12 пину Arduino (ШИМ).

    Программа для Arduino IDE – отображение надписи на дисплее 1602A

    Представленный ниже кусок кода достаточно скопипастить в Arduino IDE и загрузить на плату:

    #include <LiquidCrystal.h>

    LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

    lcd.begin(16, 2);

    lcd.setCursor(0,1);

    lcd.write("LIGHT: ");

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

    Своеобразный "hello world!" на LCD 1602A запущен. Я вас поздравляю.

    Подключаем фоторезистор и заливаем всю программу в Arduino

    Теперь подключим фоторезистор. Подключите три провода к свободным рельсам на макетной плате (условно пронумеруем их 1, 2, 3). Оставьте в рельсах немного места для самого датчика освещенности и резистора.

    Рельсу GND с макетной платы подключаем к рельсе 1. A0 (аналоговый вход) с Arduino - к рельсе 2. 5 вольт с макетной платы - к рельсе 3.

    Дальше подключаем наш датчик и резистор к подготовленным рельсам. Какие именно ноги идут к земле, а какие - к питанию для нашего датчика освещенности и резистора неважно (в отличие от, например, светодиода, в котором есть катод и анод). Так что тут не перепутаете.

    Датчик освещенности подключаем к рельсе 1 и рельсе 2. Резистор – к рельсе 2 и к рельсе 3.

    Теперь вернемся к нашей программе и добавим несколько строк в пустующее пока что тело функции loop():

    int sensorValue = analogRead(A0);

    lcd.setCursor(7,1);

    lcd.print(sensorValue);

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

    LCD дисплеи размерности 1602, на базе контроллера HD44780, являются одними из самых простых, доступных и востребованных дисплеев для разработки различных электронных устройств. Его можно встретить как и в устройствах собранных на коленке, так и в промышленных устройствах, таких, как например, автоматы для приготовления кофе. На базе данного дисплея собраны самые популярные модули и шилды в тематике Arduino такие как и .

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

    Используемые компоненты (купить в Китае):

    . Управляющая плата

    . Соединительные провода

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

    Размерность дисплеев на контроллере HD44780 может быть различной, управляться они будут одинаково. Самые распространенные размерности 16x02 (т.е. по 16 символов в двух строках) либо 20x04. Разрешение же самих символов - 5x8 точек.

    Большинство дисплеев не имеют поддержку кириллицы, имеют её лишь дисплеи с маркировкой 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 ("сайт" ); // Вывод информации 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, главное в коде задать правильную последовательность.

    Пример программного кода:

    #include LiquidCrystal lcd(7, 6, 5, 4, 3, 2); void setup (){ lcd.begin (16, 2); // Задаем размерность экрана lcd.setCursor (0, 0); lcd.print ("Hello, world!" ); // Выводим текст lcd.setCursor (0, 1); // Устанавливаем курсор в начало 2 строки lcd.print ("сайт" ); // Выводим текст } void loop (){ }

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

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

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

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

    Пример программного кода

    //Тестировалось на Arduino IDE 1.0.5 #include #include // Лобавляем необходимую библиотеку // Битовая маска символа улыбки byte smile = { 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 (){ }

    Бонус

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

    • igorka

        генератор символов по примеру выше,
        сделал потому что не слабо)

    Что является неотъемлемой частью большого количества электронных девайсов? Конечно, средства индикации и графического вывода данных. Пользователю всегда удобнее и приятнее когда результат работы «умной коробочки» можно увидеть визуально. Поэтому сегодня мы подключим к STM32 дисплей для вывода текста и цифр. Героем наших экспериментов станет довольно-таки популярный дисплей от Winstar’а. Вот кстати в комментариях появилось важное уточнение, что методика в принципе одинакова для всех дисплеев на базе HD44780. Спасибо JekaKey за важное дополнение)

    Для начала дисплей надо собственно подключить к контроллеру. Скачиваем даташит и ищем распиновку WH1602. Вот смотрите:

    Как вы уже поняли, дисплей WH1602 имеет 16 выводов. Рассмотрим каждый в отдельности…

    Пины Vss, Vdd и K нужно подключать к земле и к питанию, то есть прямо так, как указано в таблице, тут без сюрпризов и даже нечего обсуждать)

    Вывод под номером 3 служит для регулировки контрастности – если подадим туда +5В, то не увидим абсолютно ничего, а если закоротим вывод на землю, то будем любоваться двумя рядами черных квадратов 😉 Естественно, это нас не устраивает, поэтому туда надо повесить потенциометр (резистор с переменным сопротивлением) для регулировки контрастности. Самая лучшая видимость символов обеспечивается напряжением 0.5-0.7 В на этом выводе дисплея.

    Пин RS – это уже вывод, которым мы сами будем управлять при помощи микроконтроллера. Низкий уровень напряжения (0) на этом выводе означает, что сейчас последует команда, высокий уровень (1) – значит сейчас будут данные для записи в память дисплея.

    Пин R/W – тут понятно, либо мы читаем данные (флаг занятости дисплея, например), в этом случае на этом выводе 1, либо записываем команду/данные в дисплей, тогда тут у нас 0.

    DB7 – DB0 – шина данных, и этим все сказано)

    Пин E – так называемый Enable signal. Нужен он вот для чего. Чтобы работать с дисплеем – записывать данные или подавать команду – нам надо выдать на этот вывод положительный импульс. То есть, процедура будет выглядеть следующим образом:

    1. На пины RS, R/W, DB7 – DB0 – нужные сигналы, соответствующие нашей команде.
    2. Подаем единицу на вывод E.
    3. Ждемс (по даташиту – не менее 150 нс)
    4. Подаем на вывод E низкий уровень (0).

    На ножку A/Vee надо сунуть 4.2 В для питания подсветки дисплея.

    Вот так вот происходит общение с дисплеем WH1602.

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

    Тут описаны все команды и сигналы, которые должны быть на соответствующих выводах WH1602 для каждой конкретной команды. Вот хотим мы например, очистить дисплей, смотрим в таблицу, и вот она нужная команда! Clear Display!

    Подаем на выводы RS, R/W, DB7, DB6, DB5, DB4, DB3, DB2, DB1 нули, а на ножку DB0 – единицу. Готово, что дальше? Верно, единицу на пин E, затем ожидаем некоторое время и снова опускаем E в ноль. Все, дисплей очищен 😉 Только перед выполнением следующей команды необходимо выдержать паузу, указанную в даташите для каждой команды. Более эффективным будет опрос флага занятости, как только он сбросился в 0 – можно работать дальше. Для чтения этого флага тоже есть специальная команда, так что с этим все понятно) Идем дальше…

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

    Получаем в свое распоряжение 2 файла, MT_WH1602.c и MT_WH1602.h. Отрываем второй, тут нам надо произвести выбор выводов и используемого контроллера.

    Дисплей у меня, кстати, подключен так:

    RS – PC2
    R/W – PB10
    E – PB14
    DB7 – PD2
    DB6 – PC12
    DB5 – PA8
    DB4 – PA10
    DB3 – PA15
    DB2 – PD11
    DB1 – PA3
    DB0 – PA5

    Открываем файл MT_WH1602.h:

    #define PLATFORM (STM32F10x)

    Далее выбираем выводы микроконтроллера, к которым у нас подключен дисплей. Только сначала зададим, какие порты у нас задействованы. Вот при моем подключении у меня используются GPIOA, GPIOB, GPIOC и GPIOD, пишем:

    Аналогично для других ножек микроконтроллера.

    С настройкой покончили, продолжаем) Для вызова команд, приведенных в начале статьи в файле MT_WH1602.c содержатся следующие функции (названы они по названию команд, так что тут, думаю, все понятно):

    void MT_WH1602_ClearDisplay(void ) ; void MT_WH1602_ReturnHome(void ) ; void MT_WH1602_EntryModeSet (bool IDaddress, bool shift) ; void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ; void MT_WH1602_CursorOrDisplayShift (bool SCbit, bool RLbit) ; void MT_WH1602_FunctionSet (bool DLbit, bool Nbit, bool Fbit) ; void MT_WH1602_SetCGRAMAddress (uint8_t address) ; void MT_WH1602_SetDDRAMAddress (uint8_t address) ; bool MT_WH1602_ReadBusy(void ) ; void MT_WH1602_WriteData(uint8_t data) ;

    Для некоторых команд нам нужно передать в функцию параметры, вот, например:

    void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ;

    Смотрим в таблицу команд:

    Видим, что командой Display ON/OFF не только включать/выключать дисплей, но также активировать/деактивировать курсор и мигание курсора. В даташите эти биты команды обозначены как D,C и B, их то мы и передаем в качестве параметров в функцию. Если нам нужно включить дисплей и курсор, но отключить мигание курсора, вызываем команду следующим образом:

    MT_WH1602_DisplayOnOff(1, 1, 0);

    В общем, все просто 😉

    Короче, создаем новый проект, добавляем библиотеку для работы с дисплеем WH1602, создаем пустой.c файл и начинаем заполнять его кодом:

    // Подключаем файл библиотеки #include "MT_WH1602.h" /*******************************************************************/ int main(void ) { // Вызываем функцию инициализации, без этого никуда=) () ; // Теперь надо произвести начальную конфигурацию дисплея // Документация и интернет рекомендуют делать так;) MT_WH1602_FunctionSet(1 , 0 , 0 ) ; MT_WH1602_Delay(1000 ) ; MT_WH1602_FunctionSet(1 , 0 , 0 ) ; MT_WH1602_Delay(1000 ) ; MT_WH1602_FunctionSet(1 , 0 , 0 ) ; MT_WH1602_Delay(1000 ) ; MT_WH1602_FunctionSet(1 , 1 , 1 ) ; MT_WH1602_Delay(1000 ) ; MT_WH1602_DisplayOnOff(1 , 0 , 0 ) ; MT_WH1602_Delay(1000 ) ; MT_WH1602_ClearDisplay() ; MT_WH1602_Delay(2000 ) ; // Я тут значения задержки для примера взял первые пришедшие в голову) // Вообще нужно проверять флаг занятости дисплея // Давайте теперь выведем что-нибудь на дисплей, например название нашего сайта MT_WH1602_WriteData(0x6D ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x69 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x63 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x72 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x6F ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x74 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x65 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x63 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x68 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x6E ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x69 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x63 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x73 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x2E ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x72 ) ; MT_WH1602_Delay(100 ) ; MT_WH1602_WriteData(0x75 ) ; MT_WH1602_Delay(100 ) ; while (1 ) { __NOP() ; } } /*******************************************************************/

    Готово, проверяем)


    Как видите, все работает правильно)

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

    Так вот, чтобы определить какое значение записать в память дисплея, нужно для конкретного символа взять числа, написанные сверху и слева в этой таблице. Например, символ “А”. Смотрим – этому символу соответствует колонка 0100 (0х4) и строка 0001 (0х1). Получается, что для вывода символа “А” нужно записать в дисплей значение 0х41.

    Вот теперь вроде все =) Разобрались мы с подключением и работой дисплея WH1602, так что до скорого!

    P.S. Я при работе с библиотекой не тестировал функцию чтения флага занятости, так что, если вдруг что-то будет работать не так, как надо, пишите, будем разбираться)

    В сегодняшнем уроке будет рассмотрена работа с символьным LCD дисплеем фирмы Winstar на контроллере HD44780. Следует сразу отметить, что аналогов данного дисплея великое множество и прошивка будет работать со всеми ними. Также была проверена работа данного кода с графическими и символьными OLED дисплеями.

    Начнем, как и обычно, с постановки задачи. Необходимо подключить дисплей по 4х-битной шине к отладочной плате STM32F4 и вывести на него любой текст.

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

    Схема подключения показана на рисунке ниже.

    Следует отметить один очень важный момент: 1 вывод - "+5В" и 2 - "GND", на многих дисплеях поменяны местами, поэтому прежде чем подключить дисплей, прочитайте даташит. Неправильное подключение может привести к выходу дисплея из строя.

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

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

    //---Переопределяем порты для подключения дисплея, для удобства---// #define LCM_OUT GPIOB->ODR #define LCM_PIN_RS GPIO_Pin_0 // PB0 #define LCM_PIN_EN GPIO_Pin_1 // PB1 #define LCM_PIN_D7 GPIO_Pin_7 // PB7 #define LCM_PIN_D6 GPIO_Pin_6 // PB6 #define LCM_PIN_D5 GPIO_Pin_5 // PB5 #define LCM_PIN_D4 GPIO_Pin_4 // PB4 #define LCM_PIN_MASK ((LCM_PIN_RS | LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 | LCM_PIN_D5 | LCM_PIN_D4)) GPIO_InitTypeDef GPIO_InitStructure; //---Функция задержки---// void delay(int a) { int i = 0; int f = 0; while(f < a) { while(i<60) {i++;} f++; } } //---Нужная функция для работы с дисплеем, по сути "дергаем ножкой" EN---// void PulseLCD() { LCM_OUT &= ~LCM_PIN_EN; delay(220); LCM_OUT |= LCM_PIN_EN; delay(220); LCM_OUT &= (~LCM_PIN_EN); delay(220); } //---Отсылка байта в дисплей---// void SendByte(char ByteToSend, int IsData) { LCM_OUT &= (~LCM_PIN_MASK); LCM_OUT |= (ByteToSend & 0xF0); if (IsData == 1) LCM_OUT |= LCM_PIN_RS; else LCM_OUT &= ~LCM_PIN_RS; PulseLCD(); LCM_OUT &= (~LCM_PIN_MASK); LCM_OUT |= ((ByteToSend & 0x0F) << 4); if (IsData == 1) LCM_OUT |= LCM_PIN_RS; else LCM_OUT &= ~LCM_PIN_RS; PulseLCD(); } //---Установка позиции курсора---// void Cursor(char Row, char Col) { char address; if (Row == 0) address = 0; else address = 0x40; address |= Col; SendByte(0x80 | address, 0); } //---Очистка дисплея---// void ClearLCDScreen() { SendByte(0x01, 0); SendByte(0x02, 0); } //---Инициализация дисплея---// void InitializeLCD(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); LCM_OUT &= ~(LCM_PIN_MASK); delay(32000); delay(32000); delay(32000); LCM_OUT &= ~LCM_PIN_RS; LCM_OUT &= ~LCM_PIN_EN; LCM_OUT = 0x20; PulseLCD(); SendByte(0x28, 0); SendByte(0x0E, 0); SendByte(0x06, 0); } //---Печать строки---// void PrintStr(char *Text) { char *c; c = Text; while ((c != 0) && (*c != 0)) { SendByte(*c, 1); c++; } }

    Пройдемся по основным функциям библиотеки:

    InitializeLCD() - инициализация дисплея, необходимо выполнять при старте программы.

    InitializeLCD(); //Инициализация дисплея

    ClearLCDScree n ( ) - очистка памяти дисплея.

    ClearLCDScreen(); //Очистка памяти дисплея

    Curso r (№ строки, № столбца) - установка позиции курсора, отсчет начинается с нулевой строки и нулевого столбца.

    Cursor(0,2); //Установка курсора, 0-ая строка, 2-ой столбец

    PrintStr(текст ) - написание строки на дисплее.

    PrintStr("сайт");

    SendByte( байт, режим) - если коротко, то эта функция отправляет байт в дисплей. Если параметр «режим» равен «1», то на дисплее появится символ, а если «0» - то байт будет принят дисплеем в режиме настройки. Например очистка дисплея, установка курсора или выбор типа курсора.

    SendByte(0b00001100, 0); //Курсор выключен

    С библиотекой закончили. Теперь пора запускать дисплей. Для этого в основном файле main.c надо написать следующий код:

    #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "lcd.h" int main(void) { InitializeLCD(); //Инициализация дисплея ClearLCDScreen(); //Очистка дисплея от мусора Cursor(0,2); //Установка курсора PrintStr("Specially for"); //Написание текста Cursor(1,4); PrintStr("сайт"); while(1) { } }

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

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

    LCD 1602

    Среди множества вариантов среди дисплеев отдельно хочется отметить именно дисплей LCD1602 на базе контроллера HD4478. Существует этот дисплей в двух цветах: белые буквы на синем фоне, черные буквы на желтом фоне. Подключение LCD 1602 к Arduino также не вызовет никаких проблем, так как есть встроенная библиотека, и ничего скачивать дополнительно не нужно. Дисплеи отличаются не только ценой, но и размером. Зачастую радиолюбителями используется 16 x 2, то есть 2 строки по 16 символов. Но существует также и 20 x 4, где 4 строки по 20 символов. Размеры и цвет не играют никакой роли в подключении дисплея lcd 1602 к Arduno, подключаются они одинаково. Угол обзора составляет 35 градусов, время отклика дисплея - 250 мс. Работать может при температурах от -20 до 70 градусов по Цельсию. При работе использует 4 мА на экран и на подсветку 120 мА.

    Где используется?

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

    Подключение к Arduino

    Подключение LCD 1602 к Arduino Nano и Uno не отличается. С дисплеем можно работать в двух режимах: 4 бита и 8. При работе с 8-битным используются и младшие, и старшие биты, а с 4-битным - только младшие. Работать с 8-битным особого смысла нет, так как добавится для подключения еще 4 контакта, что не целесообразно, ведь скорости выше не будет, предел обновлений дисплея - 10 раз в секунду. Вообще, для подключения lcd 1602 к Arduino используется много проводов, что доставляет некие неудобства, но существует особые шилды, но об этом позже. На фотографии изображено подключение дисплея к Arduino Uno:

    Пример программного кода:

    #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("сайт"); // Выводим текст } void loop(){ }

    Что же делает код? Первым делом подключается библиотека для работы с дисплеем. Как уже говорилось выше, эта библиотека уже входит в состав Arduino IDE и дополнительно скачивать и устанавливать ее не надо. Далее определяются контакты, которые подключены к выводам: RS, E, DB4, DB5, DB6, DB7 соответственно. После чего задается размерность экрана. Так как мы работаем с версией, где 16 символов и 2 строки, то пишем такие значения. Устанавливаем курсор в начало первой строки и выводим наш первый текст Hello World. Далее ставим курсор на вторую строку и выводим название сайта. Вот и все! Было рассмотрено подключение lcd 1602 к Arduino Uno.

    Что такое I2C и зачем он нужен?

    Как уже говорилось выше, подключение дисплея занимает очень много контактов. Например, при работе с несколькими датчиками и дисплеем LCD 1602 контактов может просто не хватить. Зачастую радиолюбителями используются версии Uno или Nano, где не так много контактов. Тогда люди придумали специальные шилды. Например, I2C. Он позволяет подключать дисплей всего в 4 контакта. Это в два раза меньше. Продается модуль I2C как отдельно, где самому нужно припаивать, так и уже припаянный к дисплею LCD 1602.

    Подключение с помощью I2C модуля

    Подключение LCD 1602 к Arduino Nano с I2C занимает мало места, всего 4 контакта: земля, питание и 2 выхода для передачи данных. Питание и землю подключаем на 5V и GND на Arduino соответственно. Оставшиеся два контакта: SCL и SDA подключаем к любым аналоговым пинам. На фотографии можно увидеть пример подключения lcd 1602 к arduino с I2C модулем:

    Программный код

    Если для работы с дисплеем без модуля необходимо было воспользоваться только одной библиотекой, то для работы с модулем нужно две библиотеки. Одна из них уже есть в составе Arduino IDE - Wire. Другую библиотеку, LiquidCrystal I2C, надо скачивать отдельно и устанавливать. Для установки библиотеки в Arduino содержимое скачанного архива необходимо загрузить в корневую папку Libraries. Пример программного кода с использованием I2C:

    #include #include LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей void setup() { lcd.init(); lcd.backlight();// Включаем подсветку дисплея lcd..setCursor(8, 1); lcd.print("LCD 1602"); } void loop() { // Устанавливаем курсор на вторую строку и нулевой символ. lcd.setCursor(0, 1); // Выводим на экран количество секунд с момента запуска ардуины lcd.print(millis()/1000); }

    Как можно увидеть, код почти не отличается.

    Как добавить свой символ?

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

    0 0 0 1 0
    0 0 0 0 1
    1 1 0 0 1
    0 0 0 0 1
    1 1 0 0 1
    0 0 0 0 1
    0 0 0 1 0
    0 0 0 0 0

    Если 0 - там ничего нет, если 1 - это закрашенный участок. В примере выше можно увидеть создание символа "улыбающийся смайл". На примере программы в Arduino это будет выглядеть следующим образом:

    #include #include // Лобавляем необходимую библиотеку // Битовая маска символа улыбки byte smile = { 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(){ }

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

    Проблемы при которых дисплей может не работать

    Бывают такие случаи, когда дисплей не работает. Например, включается, но не показывает символы. Или вовсе не включается. Сначала посмотрите, правильно ли вы подключили контакты. Если вы использовали подключение lcd 1202 к Arduino без I2C, то очень легко запутаться в проводах, что может стать причиной некорректной работы дисплея. Также следует удостовериться в том, что контрастность дисплея увеличена, так как при минимальной контрастности даже не видно, включен ли LCD 1602 или нет. Если это ничего не помогает, то, возможно, проблема может кроется в пайке контактов, это при использовании модуля I2C. Также частой причиной, при которой дисплей может не работать, является неправильная установка I2C адреса. Дело в том, что производителей много, и они могут ставить разный адрес, исправлять нужно тут:

    LiquidCrystal_I2C lcd(0x27,16,2);

    В скобках можно увидеть два значения, 0x27 и 16,2 (16, 2 - является размером дисплея, а 0x27 как раз таки адрес I2C). Вместо этих значений можно попробовать поставить 0x37 или 0x3F. Ну и еще одной причиной является просто неисправный LCD 1602. Учитывая, что практически все для Arduino изготавливается в Китае, то нельзя быть уверенным на 100%, что приобретенный товар не является браком.

    Плюсы и минусы LCD 1602

    Рассмотрим плюсы и минусы дисплея LCD 1602.

    • Цена. Этот модуль можно приобрести совсем по демократичной цене в китайских магазинах. Цена составляет 200-300 рублей. Иногда продается даже вместе с I2C модулем.
    • Легко подключать. Вероятно, никто сейчас не подключает LCD 1602 без I2C. А с этим модулем подключение занимает всего 4 контакта, никаких "паутин" из проводов не будет.
    • Программирование. Благодаря готовым библиотекам работать с этим модулем легко, все функции уже прописаны. А при необходимости добавить свой символ затрачивается всего пару минут.
    • За время использования тысячами радиолюбителями никаких больших минусов выявлено не было, только бывают случаи покупки брака, так как в основном используются китайские варианты дисплеев.

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