В данной статье рассмотрим работу LCD1602 на STM32. Про LCD 1602 в интернете очень много информации. Мы же в статье рассмотрим подключение данного экрана к STM32. Его работу в 4-х битном режиме. А так же как правильно инициализировать экран для работы на STM32. В конце рассмотрим как отобразить русские символы LCD1602 на STM32.
LCD 1602: подключаем к STM32
Из даташита на данный LCD мы видим, что у него имеется 16 контактов.
Для работы в 4 битном режиме нам понадобятся контакты: RS, E, DB4,DB5,DB6,DB7
В CubeMX подключение выглядит следующим образом:
Не забудьте подключить резистор для настройки контрастности. Иначе ничего на экране не увидите.
LCD 1602 и кириллица
У меня дисплей у которого уже есть в памяти русские символы, задача состоит в том, что бы эти символы вывести на экран. Проблема состоит в том, что, что бы сэкономить место китайцы похожие буквы из русского заменили английским, например A, H, O и т.д. По этому не получиться сместиться по адресу и выводить по порядку весь алфавит.
ВНИМАНИЕ: если вы работаете в CubeIDE, то необходимо указать в настройках работу с страницей CP1251. Как это сделать написано здесь.
Мы создали двумерный массив, где каждой букве русского алфавита соответствует символьный код в памяти LCD 1602.
uint8_t Russian_ABC[66][2] = {{/*А*/192,0x41},{/*Б*/193,0xA0},{/*В*/194,0x42},{/*Г*/195,0xA1},{/*Д*/196,0xE0},{/*Е*/197,0x45},{/*Ё*/136,0xA2},{/*Ж*/198,0xA3},
{/*З*/199,0xA4},{/*И*/200,0xA5},{/*Й*/201,0xA6},{/*К*/202,0x4B},{/*Л*/203,0xA7},{/*М*/204,0x4D},{/*Н*/205,0x48},{/*О*/206,0x4F},
{/*П*/207,0xA8},{/*Р*/208,0x50},{/*С*/209,0x43},{/*Т*/210,0x54},{/*У*/211,0xA9},{/*Ф*/212,0xAA},{/*Х*/213,0x58},{/*Ц*/214,0xE1},
{/*Ч*/215,0xAB},{/*Ш*/216,0xAC},{/*Щ*/217,0xE2},{/*Ъ*/218,0xAD},{/*Ы*/219,0xAE},{/*Э*/221,0xAF},{/*Ю*/222,0xB0},{/*Я*/223,0xB1},
//Маленькие буквы
{224,0x61},{225,0xB2},{226,0xB3},{227,0xB4},{228,0xE3},{229,0x65},{152,0xB5},{230,0xB6},{231,0xB7},{232,0xB8},{233,0xB9},{234,0xBA},
{235,0xBB},{236,0xBC},{237,0xBD},{238,0x6F},{239,0xBE},{240,0x70},{241,0x63},{242,0xBF},{243,0x79},{244,0xE4},{245,0xD5},{246,0xE5},
{247,0xC0},{248,0xC1},{249,0xE6},{250,0xC2},{251,0xC3},{252,0xC4},{253,0xC5},{254,0xC6},{255,0xC7}};
Функция вывода текста выглядит следующим образом:
void MT_WH1602_String(char* st, uint8_t size)
{
uint8_t rus_simvol = 0;
for (uint8_t i = 0; i < size;i++)
{
for(uint8_t j = 0; j <=65; j++)
{
uint8_t rus = st[i];
uint8_t rusout = Russian_ABC[j][0];
if (rus == rusout)
{
MT_WH1602_WriteData(Russian_ABC[j][1],1);
rus_simvol = 1;
break;
}
}
if (rus_simvol == 0)
MT_WH1602_WriteData(st[i],1);
rus_simvol = 0;
MT_WH1602_Delay(1000);
}
}
Данная функция позволяет выводить как английский так и русский текст. В начале мы проверяем есть ли символ в нашем массиве, если его нет то выводим из английского, если есть выводим из массива и переходим к следующему символу.
Библиотека STM32 для экрана LCD1602
ВНИМАНИЕ! Библиотека поддерживает экраны LCD1602 с встроенными русскими символами, а так же использующие параллельную передачу данных.
lcd.h
/* * ls.h * * Created on: Sep 11, 2023 * Author: rxtx.su */ #include "stm32f4xx_hal.h" #include <stdio.h> #include <stdbool.h> // Set RS port #define MT_WH1602_RS_PORT GPIOA // Set RS pin #define MT_WH1602_RS_PIN GPIO_PIN_6 // Set E port #define MT_WH1602_E_PORT GPIOA // Set E pin #define MT_WH1602_E_PIN GPIO_PIN_7 // Set DB7 port #define MT_WH1602_DB7_PORT GPIOB // Set DB7 pin #define MT_WH1602_DB7_PIN GPIO_PIN_1 // Set DB6 port #define MT_WH1602_DB6_PORT GPIOB // Set DB6 pin #define MT_WH1602_DB6_PIN GPIO_PIN_0 // Set DB5 port #define MT_WH1602_DB5_PORT GPIOC // Set DB5 pin #define MT_WH1602_DB5_PIN GPIO_PIN_5 // Set DB4 port #define MT_WH1602_DB4_PORT GPIOC // Set DB4 pi #define MT_WH1602_DB4_PIN GPIO_PIN_4 // Bit masks for different bits in byte #define BIT_7_MASK 0x80 #define BIT_6_MASK 0x40 #define BIT_5_MASK 0x20 #define BIT_4_MASK 0x10 #define BIT_3_MASK 0x08 #define BIT_2_MASK 0x04 #define BIT_1_MASK 0x02 #define BIT_0_MASK 0x01 #define DWT_CYCCNT *(volatile unsigned long *)0xE0001004 #define DWT_CONTROL *(volatile unsigned long *)0xE0001000 #define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC void MT_WH1602_Delay(uint32_t us); void MT_WH1602_DataReadWrite(); void MT_WH1602_FunctionSet8bit(); void MT_WH1602_FunctionSet4bit(bool N, bool F); void MT_WH1602_DisplayOnOff(bool Dbit, bool Cbit, bool Bbit); void MT_WH1602_FunctionSet(bool DLbit, bool Nbit, bool Fbit); void MT_WH1602_DisplayClear(); void MT_WH1602_WriteData(uint8_t data, uint8_t cmd); void MT_WH1602_Setpos(unsigned char x, unsigned y); void MT_WH1602_String(char* st, uint8_t size); void MT_WH1602_Display();
lcd.c
#include "ls.h"
uint8_t Russian_ABC[66][2] = {{/*А*/192,0x41},{/*Б*/193,0xA0},{/*В*/194,0x42},{/*Г*/195,0xA1},{/*Д*/196,0xE0},{/*Е*/197,0x45},{/*Ё*/136,0xA2},{/*Ж*/198,0xA3},
{/*З*/199,0xA4},{/*И*/200,0xA5},{/*Й*/201,0xA6},{/*К*/202,0x4B},{/*Л*/203,0xA7},{/*М*/204,0x4D},{/*Н*/205,0x48},{/*О*/206,0x4F},
{/*П*/207,0xA8},{/*Р*/208,0x50},{/*С*/209,0x43},{/*Т*/210,0x54},{/*У*/211,0xA9},{/*Ф*/212,0xAA},{/*Х*/213,0x58},{/*Ц*/214,0xE1},
{/*Ч*/215,0xAB},{/*Ш*/216,0xAC},{/*Щ*/217,0xE2},{/*Ъ*/218,0xAD},{/*Ы*/219,0xAE},{/*Э*/221,0xAF},{/*Ю*/222,0xB0},{/*Я*/223,0xB1},
{224,0x61},{225,0xB2},{226,0xB3},{227,0xB4},{228,0xE3},{229,0x65},{152,0xB5},{230,0xB6},{231,0xB7},{232,0xB8}
,{233,0xB9},{234,0xBA},{235,0xBB},{236,0xBC},{237,0xBD},{238,0x6F},{239,0xBE},{240,0x70},{241,0x63},{242,0xBF}
,{243,0x79},{244,0xE4},{245,0xD5},{246,0xE5},{247,0xC0},{248,0xC1},{249,0xE6},{250,0xC2},{251,0xC3},{252,0xC4}
,{253,0xC5},{254,0xC6},{255,0xC7}};
/***************************************************************************************/
void MT_WH1602_Delay(uint32_t us)
{
int32_t us_count_tick = us * (SystemCoreClock/1000000);
SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT_CYCCNT = 0;
DWT_CONTROL |= DWT_CTRL_CYCCNTENA_Msk;
while(DWT_CYCCNT < us_count_tick);
DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk;
}
/***************************************************************************************/
void MT_WH1602_DataReadWrite()
{
HAL_GPIO_WritePin(MT_WH1602_E_PORT, MT_WH1602_E_PIN,SET);
MT_WH1602_Delay(50);
HAL_GPIO_WritePin(MT_WH1602_E_PORT, MT_WH1602_E_PIN,RESET);
}
/***************************************************************************************/
void MT_WH1602_FunctionSet8bit()
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,RESET);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,SET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,SET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(1000);
}
/***************************************************************************************/
void MT_WH1602_FunctionSet4bit(bool N, bool F)
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN, RESET);
// GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN, RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN, RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN, SET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN, RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
if (N == 1)
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
}
if (F == 1)
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
}
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(1000);
}
void MT_WH1602_DisplayOnOff(bool Dbit, bool Cbit, bool Bbit)
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,RESET);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
if (Dbit == true)
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
}
if (Cbit == true)
{
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
}
if (Bbit == true)
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
}
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(1000);
} // End of function MT_WH1602_DisplayOnOff()
/***************************************************************************************/
void MT_WH1602_DisplayClear()
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,RESET);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,SET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(1000);
}
/***************************************************************************************/
// Функция отсылает команды и данные. cmd = 1 - данные, cmd = 0 команда
void MT_WH1602_WriteData(uint8_t data, uint8_t cmd)
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,cmd);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
if (data & BIT_7_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
}
if (data & BIT_6_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
}
if (data & BIT_5_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
}
if (data & BIT_4_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
}
MT_WH1602_Delay(100);
MT_WH1602_DataReadWrite();
if (data & BIT_3_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
}
if (data & BIT_2_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
}
if (data & BIT_1_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
}
if (data & BIT_0_MASK)
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
}
MT_WH1602_Delay(100);
MT_WH1602_DataReadWrite();
}
void MT_WH1602_Setpos(unsigned char x, unsigned y)
{
if (y == 1)
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,RESET);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,SET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
}else
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,RESET);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
}
MT_WH1602_Delay(10000);
}
void MT_WH1602_String(char* st, uint8_t size)
{
uint8_t rus_simvol = 0;
for (uint8_t i = 0; i < size;i++)
{
for(uint8_t j = 0; j <=65; j++)
{
uint8_t rus = st[i];
uint8_t rusout = Russian_ABC[j][0];
if (rus == rusout)
{
MT_WH1602_WriteData(Russian_ABC[j][1],1);
rus_simvol = 1;
break;
}
}
if (rus_simvol == 0)
MT_WH1602_WriteData(st[i],1);
rus_simvol = 0;
MT_WH1602_Delay(1000);
}
}
void MT_WH1602_FunctionSet(bool DLbit, bool Nbit, bool Fbit)
{
HAL_GPIO_WritePin(MT_WH1602_RS_PORT, MT_WH1602_RS_PIN,RESET);
//GPIO_ResetBits(MT_WH1602_RW_PORT, MT_WH1602_RW_PIN);
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,SET);
if (DLbit == true)
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
}
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(100);
if (Nbit == true)
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB7_PORT, MT_WH1602_DB7_PIN,RESET);
}
if (Fbit == true)
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,SET);
}
else
{
HAL_GPIO_WritePin(MT_WH1602_DB6_PORT, MT_WH1602_DB6_PIN,RESET);
}
HAL_GPIO_WritePin(MT_WH1602_DB5_PORT, MT_WH1602_DB5_PIN,RESET);
HAL_GPIO_WritePin(MT_WH1602_DB4_PORT, MT_WH1602_DB4_PIN,RESET);
MT_WH1602_DataReadWrite();
MT_WH1602_Delay(1000);
} // End of function MT_WH1602_FunctionSet()
void MT_WH1602_Init()
{
HAL_Delay(100);
MT_WH1602_WriteData(0x03,0);
HAL_Delay(1);
MT_WH1602_WriteData(0x03,0);
HAL_Delay(1);
MT_WH1602_WriteData(0x03,0);
HAL_Delay(1);
MT_WH1602_WriteData(0x02,0);
HAL_Delay(1);
MT_WH1602_WriteData(0x28, 0); //mode 4 bit, 2 lines (from our large display is 4 lines, font 5x8
HAL_Delay(1);
MT_WH1602_WriteData(0x28, 0); //mode 4 bit, 2 lines (from our large display is 4 lines, font 5x8
HAL_Delay(1);
MT_WH1602_WriteData(0x0C,0); //Display ON, Cursor OFF, blink OFF
HAL_Delay(1);
MT_WH1602_WriteData(0x01,0); // Clear Display
HAL_Delay(2);
MT_WH1602_WriteData(0x06,0); // direction left to right
HAL_Delay(1);
MT_WH1602_WriteData(0x02,0); //Cursor reset
HAL_Delay(1);
MT_WH1602_WriteData(0X80,0); //SET POS LINE 0
HAL_Delay(2);
}
Вот собственно и вся библиотека. Как видим нет никаких сложностей подключить LCD 1602 на STM32. Если будут вопросы, ответим всем в комментариях.






Здравствуйте. Подойдет ли эта библиотека к дисплею 2004?
В чем принципиальная разница*
Доброго времени суток. Дисплей 2004 на 4 строчки, по этому необходимо переделать функцию SetPos. Так же необходимо изменить функцию инициализации MT_WH1602_Init, так как могут отличаться команды инициализации. Так же может быть смещена таблица кодов русских букв. В остальном должно все работать.
Здравствуйте, спасибо за работу. Подключить библиотеку удалось, настроить тоже. Только вот непонятно, как же всё таки вывести символы на дисплей? Если есть возможность хотелось бы увидеть пример кода по выводу какого-нибудь слова)
Доброго времени суток!
Вот пример с реально работающим кодом для вывода текста
case SYS_ERROR_E7:
{
MT_WH1602_DisplayClear(); // очищаем дисплей
MT_WH1602_Setpos(0, 0); // устанавливаем курсор в нужную строку
MT_WH1602_String(E7,9); // Выводим текст на дисплей Е7 - текст, 9 - количество символов в тексте
MT_WH1602_Setpos(0, 1);
MT_WH1602_String("Нажмите клавишу",15);
paramgen.stopSystem = 3;
break;
}
void MT_WH1602_Setpos(unsigned char x, unsigned y)
Здравствуйте! Как я понял х в функции устанавливает курсор по х, но в функции нет кода связанного с х. Не дописали?
Добрый день. К сожалению, да, функция устанавливает позицию Y, X = 0. Сейчас это можно обойти функцией MT_WH1602_String. Сдвигая на нужную позицию пробелом
Хорошая библиотека. Но, кажется, есть неточность, из-за которой дисплей нестабильно инициализируется при подаче питания. В функции инициализации при переключении в 4-битный режим подаётся команда 0х02 с линией RS (А) в “1”, тогда, как в даташите вроде как должна быть в “0”.
Спасибо, что обнаружили неточность. Все верно, должен быть “0”. 1 – когда идет работа с внутренней памятью.