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
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Андрей
Андрей
12 дней назад

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