
В данной статье рассмотрим работу 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,1); 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, так как могут отличаться команды инициализации. Так же может быть смещена таблица кодов русских букв. В остальном должно все работать.