Как подключить дисплей 1602 к stm32

Обновлено: 04.07.2024

Продолжаем работу с библиотекой LL, а также с шиной I2C. В прошлом занятии мы уже достаточно глубоко познакомились с аппаратной организацией данной шины, а также подтвердили очень неплохо свои полученные знания на практике, подключив к контроллеру STM32F103 микросхему памяти EEPROM AT24C32 и произведя чтение и запись по шине I2C. Но, думаю, что для более глубокого понимания работы данной шины и её программирования при помощи средств библиотеки LL одного урока будет недостаточно. Поэтому на данном уроке мы попробуем также подключить к данной шине контроллера символьный дисплей на контроллере HD44780 разрешением 16 x 2 символа.

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

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

Начнём со схемы подключения дисплея.

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

Для удобства подключения дисплея к контроллеру мы всё же поместим нашу плату в небольшую макетницу


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


Подведём к дисплею питание от отдельного 5-вольтового источника, общий провод (или минус) источника можно подключить и на макетную плату к контроллеру


Подключим также программатор к ПК и начнём заниматься нашим проектом.

Проект был сделан из проекта предыдущего занятия с именем LL_I2C_EEPROM и имя ему было присвоено LL_I2C_LCD1602.

Откроем наш проект в проектогенераторе Cube MX и для шины I2C1 выставим стандартную скорость обмена, так как спешить нам с символьным дисплеем некуда


Отключим таймер 2



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


Сгенерируем проект для Keil и откроем его там. Настроим программатор на автоперезагрузку и уберём оптимизацию до 0.

В этой статье я хотел бы рассказать о своем опыте подключения LCD дисплеев к микроконтроллеру STM32 с использованием библиотеки HAL по I2C шине.

image

Подключать буду дисплей 1602 и 2004. Они оба имеют припаянный I2C адаптер на основе чипа PCF8574T. Отладочной платой выступит Nucleo767ZI, а средой разработки – STM32CubeIDE 1.3.0.

Про принцип работы I2C шины подробно рассказывать не буду, советую заглянуть сюда и сюда.

Создаем проект, выбираем отладочную плату:

image

Указываем, что будем использовать I2C1. Также я подключу UART5 для общения с платой, это нужно для получения информации от платы об адресе дисплея.

image

image

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

image

Для начала подключим всего один дисплей, я начну с 1602. Также я подключу известный бывалым ардуинщикам адаптер USB-UART CH340 для получения данных с платы.

image

Обратите внимание, адаптер подключается RX к TX и TX к RX, перемычка на адаптере стоит на 3.3В

image

Рассмотрим подробнее работу с микросхемой PCF8574T и дисплеем. Ниже приведена принципиальная схема модуля с дисплеем:

image

Микросхема PCF8574T по функционалу схожа с регистром сдвига 74hc595 – она получает по I2C интерфейсу байт и присваивает своим выводам (P0-P7) значения соответствующего бита.

Рассмотрим какие выводы микросхемы соединены с дисплеем и за что отвечают:

  • Вывод Р0 микросхемы соединен с выводом RS дисплея, отвечающего за то, принимает дисплей данные (1) или инструкции по работе дисплея (0);
  • Вывод Р1 соединен с R\W, если 1 – запись данных в дисплей, 0 – считывание;
  • Вывод Р2 соединен с CS – вывод, по изменению состояния которого идет считывание;
  • Вывод Р3 – управление подсветкой;
  • Выводы Р4 — Р7 служат для передачи данных дисплею.


Данная функция опрашивает все адреса от 0 до 127 и если с этого адреса поступил ответ, она отправляет номер этого адреса в 16-тиричной форме в UART.

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

image

Точками отображаются все адреса, с которых ответ не был получен. Адрес у моего дисплея 0х26, так как я запаял перемычку А0. Теперь подключим второй дисплей параллельно первому, и посмотрим, что выдаст программа:

image

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


Эти команды поместим перед началом бесконечного цикла, чтобы настройки отправлялись единожды перед началом работы (как void setup у ардуинки). Функция I2C_send помимо байта требует указать, будут отправляться настройки дисплея или же данные. Если второй аргумент функции 0, то настройки, а если 1, то данные.

И последний штрих – нужна функция, которая будет отправлять сроку посимвольно. Тут все довольно просто:


Собрав все эти функции воедино можно написать:


image

image

Для перевода строки я пользовался командой I2C_send(0b11000000,0);, она просто переходит к 40 ячейке. В дисплее 2004 все поинтереснее.

image

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

image

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


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

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

Подключение дисплея на базе HD44780

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

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

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

Команды дисплея WH1602

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

Получаем в свое распоряжение 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:

Тут нам надо выбрать STM32F4xx или STM32F10x мы будем использовать. То есть либо пишем:

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

Осталось выбрать ножки. Например, RS у меня на выводе PC2, значит:

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

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

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

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

Команды дисплея WH1602.

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

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

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

Работа с дисплеем на базе HD44780

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

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

Символы WH1602

Вот теперь вроде все! Мы успешно осуществили подключение дисплея на базе HD44780, так что до скорых встреч в новых статьях!

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





Обратите внимание, что дисплей питается от 5В в то время как контроллеры stm32 от 3,3В.
Упростим себе задачу и не будем считывать флаг занятости с устройства. Заменим эту функцию задержкой в коде. Следовательно пин 5 (RW) суем на землю.

ГРАБЛИ 1!! Пин 3 - регулировка контрастности дисплея.
Ложим её на землю видим закрашенные квадраты (таким образом можно проверить целостность дисплея). Для нормального вывода туда нужно напряжения 0,7-0,9В.
Делается это либо переменным резистором либо делителем напряжения.

Теперь разберёмся с тем как управлять. Каждая буква имеет свой код. Для латинского алфавита этот код совпадает с кодом символа (char), для русского можно создать массив с нужными кодами. Смотрите даташит.
Присоединили 8 пинов данных к ногам контроллера. Рекомендую это делать к соответствующим ногам чтобы сразу писать в регистр без сдвигов данных.
т.е.

DB7 -- PC7
DB6 -- PC6

и так далее.
Это всё существенно упрощает и даёт нам разбираться.

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

Теперь посылаем данные.

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

Мы "выставляем" данные на ноги порта соединённого с lcd и устанавливаем пин E в 1.
Ждём пока данные "зарегистрируются" и устанавливаем E в ноль. Остальные пины тоже сбрасываем.

Вот и всё. Уже сейчас можно выводить порции данных на дисплей.
Но мы ещё опишем функцию для перемещения курсора:

line - номер строки (0 или 1)
pos - позиция. тоже от 0 до 16.

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

Задержку я сделал просто циклом:

Для работы также нужно определить константы порта и пинов RS,E
У меня вот так:

зы не претендую на самый крутой код и прочее. Даю гарантию работоспособности в Eclipse + st-util + stm32f4discovery + wh1602b

Читайте также: