Сначала немного о дисплее:

LCD дисплей размерности 1602 (по 16 символов в 2 строки), на базе контроллера HD44780.
Выводы дисплея:
На дисплее имеется 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) — Катод (-) питания подсветки
В зависимости от модели бывает два типа питания дисплея: 3,3В и 5В.
В нашем случае мы будем использовать дисплей с питанием 3,3В.
Подключать будем дисплей по следующей схеме:

Используем следующие пины (в принципе кому какие удобно): A9, А10, А11, А12, А15, В3. Пины для наглядности можно посмотреть на рисунке №1 в разделе «Схемы«.
С помощью резистора R9 регулируем контрастность.
Теперь необходимо собрать проект в CubeMX — > Новый проект — > Выбираем наш контроллер — > Настраиваем выгрузку проекта для IDE Workbench

Итак по настройке:
- Подключаем внешний кварц — > RCC — > Crystal/Ceramic Resonator
- Отладка — > SYS — > Serial Wire
- Настраиваем пины в режиме GPIO Output, меняем User Label на пинах для удобства восприятия
Во вкладке Clock Configuration оставляем тактирование HSE:

Во вкладке Configuration — > GPIO проверяем настройки:

По конфигурации:
- GPIO output level — Low — состояние пина — «высокое» или «низкое»
- GPIO mode — Output Push Pull — двухтактный выход
- GPIO Pull-up/Pull-down — No pull-up and no pull-down — без внутренней подтяжки пина через резистор к Vdd или Vss
- Maximum output speed — High — скорость
- User Label — LCD_xx — название или метка пина

GPIO Pull-up/Pull-down
Подробнее можно посмотреть в STM32F103C8T6 Reference manual на странице «Документы«.
Выгружаем наш проект в среду Workbench. Раскрываем слева дерево проекта LCD -> Src и открываем main.c
Теперь необходимо подключить библиотеку для нашего дисплея, ее можно скачать со страницы «Загрузки». Скачиваем, распаковываем, видим две папки src и inc. Содержимое этих папок нам необходимо скопировать в одноименные папки нашего проекта. Файлы в проекте подтянутся автоматически либо сделать Refresh (F5).
Подключаем библиотеку в файле main.c:
/* USER CODE BEGIN Includes */ #include "hd44780.h" /* USER CODE END Includes */
Так как используем библиотеку HAL подключаем ее либо проверяем наличие строки в начале файла main:
#include "stm32f1xx.h"
Да, немаловажным будет познакомиться с функциями нашей библиотеки:
- lcdInit — функция начальной инициализации дисплея;
- lcdClrScr — функция очистки дисплея, курсор в исходное положение;
- lcdReturn — функция возврата курсора в исходное положение;
- lcdSetMode — функция установления режимов: дисплей вкл / выкл, курсор мигает вкл / выкл, курсор вкл / выкл;
- lcdGoto — функция устанавливает курсор в определенное место: строка, столбец;
- lcdPuts — функция вывода текстовой строки;
- lcdPutc — функция вывода отдельного символа типа char;
- lcdLoadChar — функция загрузки в память дисплея пользовательского символа;
- lcdDrawChar — функция рисования на экране пользовательского символа;
- lcdBackSpace — функция смещения курсора на один символ влево и его уничтожение;
- lcdScroll — функция смещения всего текста на один столбец в нужном направлении (слева или справа)
- cursorShift — функция смещения курсора на позицию справа или слева без уничтожения символа, уже изображен. Предназначена для редактирования / исправления текста;
- lcdItos — функция вывода на экран числа типа integer;
- lcdFtos — функция вывода на экран числа типа float;
- lcdNtos — функция вывода на экран числа типа integer с определенным числом разрядов. Лишние разряды отсекаются. Разряды, которых не хватает заполняются нулями. Для фиксированного расположения на экране;
- lcdDrawBar — функция рисования индикатора выполнения;
- lcdClrBar — функция очистки индикатору выполнения.
Список некоторых параметров библиотеки
В файле «lcd_cfg.h«:
// ------------------------------- // DEFAULT CONFIGURATIONS // ----------- -------------------- #define DEFAULT_DISPLAY_CONFIG DISPLAY_CONFIG_4bit_2L_5x8 #define DEFAULT_ENTRY_MODE ENTRY_MODE_INC_NO_SHIFT #define DEFAULT_VIEW_MODE VIEW_MODE_DispOn_BlkOff_CrsOff #define USE_BUSY_FLAG 0u / * 1 (true) or 0 (false) * /
- дисплей подключен в 4-х битном режиме, на 2 или 4 строки, с шрифтом 5х8 пикселей;
- слева направо, без смещения видимой части DDR RAM памяти;
- дисплей включен, мигание выключено, курсор выключен;
- или используется сигнал дисплея R / W, в нашем случае — нет, потому 0.
#define MCU_FREQ_VALUE SystemCoreClock / 1000000 / * MHz. Minimal value = 1 MHz * /
В переменной SystemCoreClock сохраняется частота MCU в Герцах, делим на миллион, получаем в мегагерцах. Для правильных таймингов дисплея:
// ------------------------------- // SET FORMATTED OUTPUT OPTIONS // --------- ---------------------- #define USE_FORMATTED_OUTPUT 1u / * 1 (true) or 0 (false) * / #define TAB_SPACE 4u / * 1 .. 255 * /
- использовать символы форматирования / t, / n, / r в строках с текстом — 1, не использовать — 0;
- длина табуляции — 4.
// ------------------------------- // PROGRESS BAR OPTIONS // ---------- --------------------- #define USE_PROGRESS_BAR 0u / * 1 (true) or 0 (false) * / #define USE_REGRESS_BAR 1u / * 1 (true) or 0 (false) * / #define PROGRESS_BAR_LINE LCD_2nd_LINE / * Select lcd line: 1, 2, 3, 4 ... * / #define PROGRESS_BAR_HEIGHT 5u / * in pixel: 1 (min), 2, 3, 4, 5, 6, 7, 8 (max) * / #define PROGRESS_BAR_WIDTH 10u / * Number of chars in lcd line: 1, 2, .., 8, 16, 20 * /
- использовать индикатор выполнения, прогрессирующее — 1, нет — 0;
- использовать индикатор выполнения, что регрессирует — 1, нет -0;
- индикатор выполнения будет во второй строке индикатора;
- высота индикатора выполнения в пикселях;
- ширина индикатора в знакомест.
Перейдем к тестовой программе:
В начале программы в файле «main.c», в функции «main» объявляем прототип функции для имитации печати текста с клавиатуры. Саму функцию расположим уже после главной функции «main»:
/* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ void imitationPrinting(char *ptr); /* USER CODE END PFP */
Далее в теле функции «main» к началу бесконечного цикла в блоке 1 — объявляем все переменные которые понадобятся для демонстрации:
/* USER CODE BEGIN 1 */
uint32_t SystemFreq = HAL_RCC_GetHCLKFreq();
char str[17] = {};
float pi = 3.14;
int t = 123;
unsigned char men1[FONT_HEIGHT] = {0x0e,0x0e,0x04,0x1f,0x04,0x1a,0x01,0x00};
unsigned char men2[FONT_HEIGHT] = {0x07,0x07,0x0a,0x07,0x02,0x05,0x09,0x00};
/* USER CODE END 1 */
Инициализируем наш дисплей в области обозначенную как «USER CODE BEGIN 2»:
/* USER CODE BEGIN 2 */ lcdInit(); //инициализация дисплея /* USER CODE END 2 */
В бесконечном цикле пишем демонстрационную программу:
/* USER CODE BEGIN WHILE */
while (1)
{
// очищенне дисплея
lcdClrScr();
// установление позиции курсора
lcdGoto(LCD_1st_LINE,1);
// печатаем текстовую строку с переносом на другую строку
lcdPuts("Workbench STM32\nFreq MCU ");
// печатаем частоту микроконтроллера в Mhz
lcdItos(SystemFreq/1000000);
lcdPuts(" Mhz");
// ждем 3 секунды
HAL_Delay(3000);
/*
* В цикле смещаем все что на экране на 16 позиций вправо
*/
for (int i = 0; i < 16; ++i)
{
lcdScroll(RIGHT);
HAL_Delay(250);
}
// очищаем дисплей
lcdClrScr();
// в буфер str отправляем текст
sprintf(str,"STM32F103C8 and");
// функция имитации печати текста
imitationPrinting(str);
// в буфер str отправляем текст
sprintf(str,"LCD WH1602A Demo");
// установления позиции курсора
lcdGoto(LCD_2nd_LINE,0);
// функция имитации печати текста
imitationPrinting(str);
// ждем 3 секунды
HAL_Delay(3000);
/*
* В цикле смещаем все что на экране на 16 позиций слева
*/
for (int i = 0; i < 16; ++i)
{
lcdScroll(LEFT);
HAL_Delay(250);
}
// ждем секунду
HAL_Delay(1000);
/*
* В цикле смещаем все что на экране на 16 позиций вправо
*/
for (int i = 0; i < 16; ++i)
{
lcdScroll(RIGHT);
HAL_Delay(250);
}
// ждем 2 секунды
HAL_Delay(2000);
// очищаем дисплей
lcdClrScr();
// выводим текст на экран
lcdPuts("Float = ");
// выводим на экран число типа float с двумя знаками после запятой
lcdFtos(pi,2);
// устанавливаем позицию курсора
lcdGoto(LCD_2nd_LINE,0);
// выводим текст на экран
lcdPuts("Integer = ");
// выводим на экран число типа integer
lcdItos(t);
// ждем 3 секунды
HAL_Delay(3000);
// включаем режим: дисплей включен, мигание курсора отключен, курсор включен
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
// устанавливаем позицию курсора
lcdGoto(LCD_2nd_LINE,16);
// в цикле удаляем всю строку backspace'ом
for (int i = 0; i < 16; ++i)
{
lcdBackSpace();
HAL_Delay(100);
}
// устанавливаем позицию курсора
lcdGoto(LCD_1st_LINE,16);
// в цикле удаляем всю строку backspace'ом
for (int i = 0; i < 16; ++i)
{
lcdBackSpace();
HAL_Delay(100);
}
// устанавливаем режим: дисплей включен, мигание отключен, курсор выключен
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
// возвращаем курсор в дом
lcdReturn();
// печатаем текст с табуляцией
lcdPuts("\tLoading...");
// устанавливаем позицию курсора
lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH);
// печатаем текст
lcdPuts("[ %]");
// в цикле показываем индикатор выполнения
for(uint8_t i = 0; i <= PROGRESS_BAR_MAX_LOAD; ++i)
{
// устанавливаем позицию курсора
lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH + 1);
// печать процентов выполнения в четко заданной позиции на три разряда
lcdNtos((i*100)/PROGRESS_BAR_MAX_LOAD, 3 );
// показываем текущее состояние индикатора выполнения
lcdDrawBar(i);
// ждем 1/10 секунды
HAL_Delay(100);
}
// ждем 3 секунды
HAL_Delay(3000);
// очищаем дисплей
lcdClrScr();
/*
* Загружаем символ пользователя к ячейке памяти 6 и 7 в дисплей
* ячейки памяти от 0 по 5 заняты индикатором выполнения
* если вы не используете индикатор выполнения, то можно загружать
* с 0 ячейки памяти дисплея
*/
lcdLoadChar(men1,6);
lcdLoadChar(men2,7);
// печатаем текст с табуляцией и переходом на новую строку
lcdPuts("\tRunning men\n");
// в цикле показываем бегущего человека :)))
for(uint8_t i = 0; i < 8; i++)
{
lcdPutc(6);
HAL_Delay(250);
cursorShift(LEFT);
lcdPutc(' ');
lcdPutc(7);
HAL_Delay(250);
cursorShift(LEFT);
lcdPutc(' ');
}
/* USER CODE END WHILE */
Не забываем о функции, которую написали для демонстрационной программы и объявили ее прототип в начале программы. Функцию пишем после главной функции «main» в главном файле «main.c» в пользовательском блоке 4, который определил CubeMX:
/* USER CODE BEGIN 4 */
// функция имитации печати текста с клавиатуры
void imitationPrinting(char *ptr)
{
// устанавливаем режим с включенным курсором
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
// пока не конец строке
while(*ptr != 0)
{
// печатаем текущий символ
lcdPutc(*ptr++);
// ждем 1/10 секунды
HAL_Delay(100);
}
// устанавливаем режим с выключенным курсором
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
}
/* USER CODE END 4 */
Но не забываем что в демонстрационной программе используем индикатор выполнения «progress bar», а для этого в файле lcd_cfg.h константу USE_PROGRESS_BAR устанавливаем в 1u. «#define USE_PROGRESS_BAR 1u».
Полный код программы в файле main.c:
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
** This notice applies to any and all portions of this file
* that are not between comment pairs USER CODE BEGIN and
* USER CODE END. Other portions of this file, whether
* inserted by the user or by software development tools
* are owned by their respective copyright owners.
*
* COPYRIGHT(c) 2018 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "tim.h"
#include "gpio.h"
/* USER CODE BEGIN Includes */
#include "hd44780.h"
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void imitationPrinting(char *ptr);
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t SystemFreq = HAL_RCC_GetHCLKFreq();
char str[17] = {};
float pi = 3.14;
int t = 123;
unsigned char men1[FONT_HEIGHT] = {0x0e,0x0e,0x04,0x1f,0x04,0x1a,0x01,0x00};
unsigned char men2[FONT_HEIGHT] = {0x07,0x07,0x0a,0x07,0x02,0x05,0x09,0x00};
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
lcdInit(); //инициализация дисплея
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// очищенне дисплея
lcdClrScr();
// установление позиции курсора
lcdGoto(LCD_1st_LINE,1);
// печатаем текстовую строку с переносом на другую строку
lcdPuts("Workbench STM32\nFreq MCU ");
// печатаем частоту микроконтроллера в Mhz
lcdItos(SystemFreq/1000000);
lcdPuts(" Mhz");
// ждем 3 секунды
HAL_Delay(3000);
/*
* В цикле смещаем все что на экране на 16 позиций вправо
*/
for (int i = 0; i < 16; ++i)
{
lcdScroll(RIGHT);
HAL_Delay(250);
}
// очищаем дисплей
lcdClrScr();
// в буфер str отправляем текст
sprintf(str,"STM32F103C8 and");
// функция имитации печати текста
imitationPrinting(str);
// в буфер str отправляем текст
sprintf(str,"LCD WH1602A Demo");
// установления позиции курсора
lcdGoto(LCD_2nd_LINE,0);
// функция имитации печати текста
imitationPrinting(str);
// ждем 3 секунды
HAL_Delay(3000);
/*
* В цикле смещаем все что на экране на 16 позиций слева
*/
for (int i = 0; i < 16; ++i)
{
lcdScroll(LEFT);
HAL_Delay(250);
}
// ждем секунду
HAL_Delay(1000);
/*
* В цикле смещаем все что на экране на 16 позиций вправо
*/
for (int i = 0; i < 16; ++i)
{
lcdScroll(RIGHT);
HAL_Delay(250);
}
// ждем 2 секунды
HAL_Delay(2000);
// очищаем дисплей
lcdClrScr();
// выводим текст на экран
lcdPuts("Float = ");
// выводим на экран число типа float с двумя знаками после запятой
lcdFtos(pi,2);
// устанавливаем позицию курсора
lcdGoto(LCD_2nd_LINE,0);
// выводим текст на экран
lcdPuts("Integer = ");
// выводим на экран число типа integer
lcdItos(t);
// ждем 3 секунды
HAL_Delay(3000);
// включаем режим: дисплей включен, мигание курсора отключен, курсор включен
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
// устанавливаем позицию курсора
lcdGoto(LCD_2nd_LINE,16);
// в цикле удаляем всю строку backspace'ом
for (int i = 0; i < 16; ++i)
{
lcdBackSpace();
HAL_Delay(100);
}
// устанавливаем позицию курсора
lcdGoto(LCD_1st_LINE,16);
// в цикле удаляем всю строку backspace'ом
for (int i = 0; i < 16; ++i)
{
lcdBackSpace();
HAL_Delay(100);
}
// устанавливаем режим: дисплей включен, мигание отключен, курсор выключен
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
// возвращаем курсор в дом
lcdReturn();
// печатаем текст с табуляцией
lcdPuts("\tLoading...");
// устанавливаем позицию курсора
lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH);
// печатаем текст
lcdPuts("[ %]");
// в цикле показываем индикатор выполнения
for(uint8_t i = 0; i <= PROGRESS_BAR_MAX_LOAD; ++i)
{
// устанавливаем позицию курсора
lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH + 1);
// печать процентов выполнения в четко заданной позиции на три разряда
lcdNtos((i*100)/PROGRESS_BAR_MAX_LOAD, 3 );
// показываем текущее состояние индикатора выполнения
lcdDrawBar(i);
// ждем 1/10 секунды
HAL_Delay(100);
}
// ждем 3 секунды
HAL_Delay(3000);
// очищаем дисплей
lcdClrScr();
/*
* Загружаем символ пользователя к ячейке памяти 6 и 7 в дисплей
* ячейки памяти от 0 по 5 заняты индикатором выполнения
* если вы не используете индикатор выполнения, то можно загружать
* с 0 ячейки памяти дисплея
*/
lcdLoadChar(men1,6);
lcdLoadChar(men2,7);
// печатаем текст с табуляцией и переходом на новую строку
lcdPuts("\tRunning men\n");
// в цикле показываем бегущего человека :)))
for(uint8_t i = 0; i < 8; i++)
{
lcdPutc(6);
HAL_Delay(250);
cursorShift(LEFT);
lcdPutc(' ');
lcdPutc(7);
HAL_Delay(250);
cursorShift(LEFT);
lcdPutc(' ');
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/* USER CODE BEGIN 4 */
// функция имитации печати текста с клавиатуры
void imitationPrinting(char *ptr)
{
// устанавливаем режим с включенным курсором
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
// пока не конец строке
while(*ptr != 0)
{
// печатаем текущий символ
lcdPutc(*ptr++);
// ждем 1/10 секунды
HAL_Delay(100);
}
// устанавливаем режим с выключенным курсором
lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @param file: The file name as string.
* @param line: The line in file as a number.
* @retval None
*/
void _Error_Handler(char *file, int line)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
while(1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/