LCD 1602 на STM32

В данной статье рассмотрим работу LCD1602 на STM32. Про LCD 1602 в интернете очень много информации. Мы же в статье рассмотрим подключение данного экрана к STM32. Его работу в 4-х битном режиме. А так же как правильно инициализировать экран для работы на STM32. В конце рассмотрим как отобразить русские символы LCD1602 на STM32.

LCD 1602: подключаем к STM32

Из даташита на данный LCD мы видим, что у него имеется 16 контактов.

Выводы контактов LCD 1602

Для работы в 4 битном режиме нам понадобятся контакты: RS, E, DB4,DB5,DB6,DB7

В CubeMX подключение выглядит следующим образом:

Подключение LCD 1602 в 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. Если будут вопросы, ответим всем в комментариях.

Загрузки

Где купить

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
6 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Андрей
Андрей
4 месяцев назад

Здравствуйте. Подойдет ли эта библиотека к дисплею 2004?
В чем принципиальная разница*

Даниил
Даниил
1 месяц назад

Здравствуйте, спасибо за работу. Подключить библиотеку удалось, настроить тоже. Только вот непонятно, как же всё таки вывести символы на дисплей? Если есть возможность хотелось бы увидеть пример кода по выводу какого-нибудь слова)

Николай
Николай
38 минут назад

void MT_WH1602_Setpos(unsigned char x, unsigned y)
Здравствуйте! Как я понял х в функции устанавливает курсор по х, но в функции нет кода связанного с х. Не дописали?