Жидкокристаллический (ЖК) дисплей формат 16x2 является самым распространенным дисплеем, применяемым в электронных устройствах для отображения алфавитно-цифровой информации. Кроме целей непосредственного отображения информации ЖК дисплеи могут использоваться в качестве устройств для отладки работы проектов. В данной статье мы рассмотрим подключение ЖК дисплея 16x2 к плате разработки STM32F103C8T6, известной также под названием STM32 Blue Pill ("синяя таблетка").
Ранее на нашем сайте мы уже рассматривали подключение ЖК дисплея 16x2 к следующим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате Raspberry Pi;
- к плате Raspberry Pi Pico;
- к плате Raspberry Pi Zero;
- к модулю ESP32.
Также на нашем сайте вы можете посмотреть статью про начало работы с платой STM32F103C8T6.
Необходимые компоненты
- Плата разработки STM32F103C8T6 (STM32 Blue Pill) (купить на AliExpress).
- FTDI программатор (плата) (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Основные принципы работы ЖК дисплея 16x2
ЖК дисплей 16x2 содержит 16 столбцов и 2 строки, вместе получается 32 блока пикселов. Внешний вид одного такого блока показан на следующем рисунке.
Данный блок содержит 40 пикселов (точек), упорядоченных в форме 5 строк и 8 столбцов, эти 40 пикселов вместе формируют один символ. Назначение контактов (распиновка) ЖК дисплея 16x2 приведена на следующем рисунке.
Всего ЖК дисплей 16x2 содержит 16 контактов, которые можно условно разделить на следующие 4 группы.
Source Pins (1, 2 и 3): используются для подачи питания на дисплей и регулировки уровня его контрастности.
Control Pins (4, 5 и 6): контакты управления. Используются для установки различных режимов работы дисплея.
Data/Command Pins (7-14): контакты для передачи данных/команд.
LED pins (15 и 16): контакты для включения/выключения фоновой подсветки дисплея (если она нужна).
Для корректной работы дисплея обязательно использование только 10 контактов из 16 перечисленных.
Схема проекта
Схема подключения ЖК дисплея 16x2 к плате STM32 Blue Pill представлена на следующем рисунке.
Для программирования платы STM32 Blue Pill мы используем плату FTDI, ее контакты Vcc и ground подключены к контактам 5V и ground платы STM32. С помощью этого подключения запитываются плата STM32 и ЖК дисплей поскольку они оба могут запитываться от +5V. Контакты Rx и Tx платы FTDI подключены к контактам A9 и A10 платы STM32 для ее непосредственного программирования.
ЖК дисплей 16x2 подключен к плате STM32 в 4-битном режиме – к плате STM32F103C8T6 подключены его 4 контакта данных и два управляющих контакта (RS и EN). Полная схема соединений между платой STM32 и ЖК дисплеем 16x2 приведена в следующей таблице.
№ контакта ЖК дисплея | Обозначение контакта ЖК дисплея | Контакт платы STM32 |
1 | Ground (Gnd) | Ground (G) |
2 | VCC | 5V |
3 | VEE | Ground (G) |
4 | Register Select (RS) | PB11 |
5 | Read/Write (RW) | Ground (G) |
6 | Enable (EN) | PB10 |
7 | Data Bit 0 (DB0) | No Connection (NC) |
8 | Data Bit 1 (DB1) | No Connection (NC) |
9 | Data Bit 2 (DB2) | No Connection (NC) |
10 | Data Bit 3 (DB3) | No Connection (NC) |
11 | Data Bit 4 (DB4) | PB0 |
12 | Data Bit 5 (DB5) | PB1 |
13 | Data Bit 6 (DB6) | PC13 |
14 | Data Bit 7 (DB7) | PC14 |
15 | LED Positive | 5V |
16 | LED Negative | Ground (G) |
Далее рассмотрим программу проекта.
Объяснение программы для платы STM32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Для программирования платы STM32 мы будем использовать Arduino IDE, которую необходимо предварительно подготовить, установив в нее необходимые пакеты для работы с платой STM32. Подробно эти процессы описаны в следующей статье.
Наша программа по взаимодействию с ЖК дисплеем очень похожа на аналогичную программу для платы Arduino, необходимо будет всего лишь изменить номера контактов – они у плат STM32 и Arduino отличаются.
Одним из весомых преимуществ платформы Arduino является то, что в ней уже присутствуют необходимые библиотеки для работы со всеми возможными датчиками, исполнительными механизмами и дисплеями. Поэтому первым делом в программе подключим библиотеку для работы с ЖК дисплеем.
1 |
#include <LiquidCrystal.h> // include the LCD library |
Далее мы укажем к каким контактам платы STM32 подключен ЖК дисплея и с помощью функции LiquidCrystal создадим объект для работы с дисплеем под названием “lcd”.
1 2 |
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD |
Затем в функции void setup() мы укажем тип дисплея (16х2). Далее мы покажем приветственное сообщение на экране ЖК дисплея и через 2 секунды очистим его экран.
1 2 3 4 5 6 7 8 9 |
void setup() { lcd.begin(16, 2);//We are using a 16*2 LCD lcd.setCursor(0, 0); //At first row first column lcd.print("Interfacing LCD"); //Print this lcd.setCursor(0, 1); //At secound row first column lcd.print("-CircuitDigest"); //Print this delay(2000); //wait for two secounds lcd.clear(); //Clear the screen } |
После этого внутри функции void loop мы отобразим строку “STM32 –Blue Pill” на первой строке дисплея и значение секунд на второй строке дисплея. Значение в секундах мы будем получать с помощью функции millis(). Фактически, функция millis() представляет собой таймер, который отсчитывает, прошедшее с момента подачи питания на плату. Значение, получаемое от функции millis(), мы будем делить на 1000, перед тем как выводить его на экран дисплея.
1 2 3 4 5 6 |
void loop() { lcd.setCursor(0, 0); //At first row first column lcd.print("STM32 -Blue Pill"); //Print this lcd.setCursor(0, 1); //At secound row first column lcd.print(millis() / 1000); //Print the value of secounds } |
Загрузка программы в плату STM32F103C8T6
Соберите схему, показанную выше в нашей статье. Убедитесь что в настройках Arduino IDE выбран правильный тип платы. Перед началом загрузки программы в плату проверьте что джампер boot 0 установлен в положение 1 как показано на рисунке ниже и нажмите кнопку сброса (reset button). Затем, после нажатия кнопки upload в Arduino IDE код программы должен начать загружаться в плату. После его загрузки на экране ЖК дисплея должно отобразиться сообщение как показано на следующем рисунке.
Тестирование работы проекта
После загрузки программы в плату STM32F103C8T6 на экране ЖК дисплея вы должны увидеть выводимое сообщение. Но в следующий раз, когда вы снова подадите питание на плату, программа не будет работать поскольку она все еще находится в режиме программирования. Чтобы она работала при каждой подаче питания на плату ее (плату) необходимо перевести в рабочий режим (Operating Mode), доля этого после загрузки программы в плату измените положение джампера boot 0 в положение 0. После этого нам уже будет не нужна плата FTDI и мы можем отключить ее от схемы и наша программа теперь будет работать при каждой подаче питания на плату STM32.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/* Program to test 16*2 Alaphanumeric LCD with STM32 (Blue Pill) For: http://www.circuitdigest.com/ The circuit: * LCD RS pin to digital pin PB11 * LCD Enable pin to digital pin PB10 * LCD D4 pin to digital pin PB0 * LCD D5 pin to digital pin PB1 * LCD D6 pin to digital pin PC13 * LCD D7 pin to digital pin PC14 * LCD R/W pin to ground * LCD VSS pin to ground * LCD VCC pin to 5V */ #include <LiquidCrystal.h> // подключаем библиотеку для работы с ЖК дисплеем const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //указываем контакты платы, к которым подключен ЖК дисплей LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // инициализируем ЖК дисплей void setup() { lcd.begin(16, 2);// мы используем ЖК дисплей 16х2 lcd.setCursor(0, 0); // перемещаем курсор в первый столбец первой строки lcd.print("Interfacing LCD"); // выводим сообщение на экран дисплея lcd.setCursor(0, 1); // перемещаем курсор в 1-й столбец 2-й строки lcd.print("-CircuitDigest"); // выводим сообщение на экран дисплея delay(2000); // ждем 2 секунды lcd.clear(); // очищаем экран дисплея } void loop() { lcd.setCursor(0, 0); // перемещаем курсор в первый столбец первой строки lcd.print("STM32 -Blue Pill"); // выводим сообщение на экран дисплея lcd.setCursor(0, 1); // перемещаем курсор в 1-й столбец 2-й строки lcd.print(millis() / 1000); // выводим на экран значение секунд } |