STM32Cube配置LCD1602液晶屏

  1. 实验目的:
    • 了解LCD1602的使用方法.
    • 掌握编写LCD1602显示程序的方法.
  2. 实验环境:
    • 硬件:STM32F103C8T6核心板,PC,USB线.
    • 软件:Windows10,STM32CubeIDE,HAL库.
  3. 实验原理:
    • LCD1602可以显示两行,每行16个字符.
    • LCD1602一共有11根线用于与MCU通信,具体如下:
      RS: 0–状态/命令 1–数据
      RW: 0–写 1–读
      E: 0–使能 1–失能
      D0-D7: 数据命令总线
    • LCD1602的基本操作可以分为以下4种:
      读状态: 输入RS=0, RW=1, E=0
      读数据: 输入RS=1, RW=1, E=0
      写命令: 输入RS=0, RW=0, E=0
      写数据: 输入RS=1, RW=0, E=0
      详见LCD1602时序图及其对照表.
      //在这个实验当中,我们只需要配置E,RS,RW,D4-D7这7个引脚即可.
  4. 程序设计:
  • 这里我们选择外部高速时钟(HSE),需要在System Core中配置RCC;
  • 配置GPIO引脚
    E--------------------PB0
    RS------------------PB1
    RW-----------------PB2
    D4------------------PB12
    D5------------------PB13
    D6------------------PB14
    D7------------------PB15
  • 配置SYS
    在这里插入图片描述
  • 配置时钟树
    在这里插入图片描述
  • 配置TIM1
    在这里插入图片描述
    在这里插入图片描述
  • 生成代码
  • 编写用户代码
    • 编写LCD1602驱动程序
    • LCD1602.C文件
/*
        LCD1602.C
         
*/
#include <lcd1602.h>
#include "stm32f1xx_hal.h"

/***********Define the LCD PINS below*********/

#define RS_Pin GPIO_PIN_1
#define RS_GPIO_Port GPIOB
#define RW_Pin GPIO_PIN_2
#define RW_GPIO_Port GPIOB
#define E_Pin GPIO_PIN_0
#define E_GPIO_Port GPIOB
#define D4_Pin GPIO_PIN_12
#define D4_GPIO_Port GPIOB
#define D5_Pin GPIO_PIN_13
#define D5_GPIO_Port GPIOB
#define D6_Pin GPIO_PIN_14
#define D6_GPIO_Port GPIOB
#define D7_Pin GPIO_PIN_15
#define D7_GPIO_Port GPIOB     //�������� 
 
/********define the timer handler beloe**********/
#define timer htim1


extern TIM_HandleTypeDef timer;
void delay (uint16_t us)
{
	__HAL_TIM_SET_COUNTER(&timer, 0);
	while(__HAL_TIM_GET_COUNTER(&timer) < us);
}

/*************************************************/

void send_to_lcd (char data, int rs)
{
	HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, rs);
	/*write the data to the respective pin*/
	HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, ((data>>3)&0x01));
	HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, ((data>>2)&0x01));
	HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, ((data>>1)&0x01));
	HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, ((data>>0)&0x01));
	/*toggle EN PIN to send the data
	 *if the HCLK > 100HZ,use the 20us delay
	 *if LCD still doesn't work,increase the delay to 50, 80 or 100..
	 */
	HAL_GPIO_WritePin(E_GPIO_Port, E_Pin, 1);
    delay (20);
    HAL_GPIO_WritePin(E_GPIO_Port, E_Pin, 0);
    delay (20);

}

void lcd_send_cmd (char cmd)
{
	char datatosend;
	
	/*send upper nibble first*/
	datatosend = ((cmd>>4)&0x0f);
	send_to_lcd(datatosend,0);  //RS must be while sending command
	
	/*send Lower Nibble*/
	datatosend = ((cmd)&0x0f);
	send_to_lcd(datatosend,0);
}

void lcd_send_data (char data)
{
	char datatosend;
	
	/*send upper nibble first*/
	datatosend = ((data>>4)&0x0f);
	send_to_lcd(datatosend, 1);  //rs = 1 for sending data
	
	/*send Lower Nibble*/
	datatosend = ((data)&0x0f);
	send_to_lcd(datatosend, 1);
}

void lcd_clear (void)
{
	lcd_send_cmd(0x01);
	HAL_Delay(2);
}
void lcd_put_cur(int row, int col)
{
	switch (row)
	{
		case 0:
			col |= 0x80;
			break;
		case 1:
			col |=0xc0;
			break;
	}
	lcd_send_cmd (col);
}

void lcd_init (void)
{
	//4 bit initialisation
	HAL_Delay(50); //wait for >40ms
	lcd_send_cmd (0x30);
	HAL_Delay(5); //wait for >4.1ms
	lcd_send_cmd (0x30);
	HAL_Delay(1); //wait for >100us
	lcd_send_cmd (0x30);
	HAL_Delay(10);
	lcd_send_cmd (0x20); //4 bit mode
	HAL_Delay(10);
	
	//dislay initialisation
	lcd_send_cmd (0x28); //function set -->DL=0 (4 bit mode), N = 1(2 lioe display) F = 0(5X8 characters)
	HAL_Delay(1); 
	lcd_send_cmd (0x08);
	HAL_Delay(1);
	lcd_send_cmd (0x01);
	HAL_Delay(1);
	HAL_Delay(1);
	lcd_send_cmd (0x06);
	HAL_Delay(1);
	lcd_send_cmd (0x0c);
}

void lcd_send_string (char *str)
{
	while (*str) lcd_send_data (*str++);
}

  • LCD1602.h文件
#ifndef INC__LCD1602_H_
#define INC__LCD1602_H_ 
 

void lcd_init(void);  //initialize lcd

void lcd_send_cmd(char cmd);  //send command to the lcd

void lcd_send_data(char data);  //send data to the lcd

void lcd_send_string(char *str);  //send string to the lcd

void lcd_put_cur(int row, int col);  //put cursor at the entered position row (0 or 1), col (0-15)

void lcd_clear(void);

 
#endif /*INC_LCD1602_H_*/

main.c中编写简单的用户代码

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
int row=0;
int col=0;
/* USER CODE END PFP */

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim1);

  lcd_init ();
  lcd_put_cur(0, 0);
  lcd_send_string("HELLO ");
  lcd_send_string("STM32 ");
  lcd_send_string("CUBE");

  lcd_put_cur(1,0);
  lcd_send_string("hello ");
  lcd_send_string("world");
  HAL_Delay(3000);
  lcd_clear();
  /* USER CODE END 2 */
  1. 编译并下载;
  2. 实验现象;
    • LCD1602第一行显示HELLO STM32 CUBE.
    • LCD1602第二行显示hello world.

以上就是全部内容,希望对同是STM32Cube小白的人有所帮助!!!

### 回答1: CubeMX是一款专业的软件工具,它用于配置和生成嵌入式系统的初始化代码。在使用CubeMX来配置LCD1602液晶显示屏的时候,你需要按照以下步骤进行操作。 首先,在CubeMX中创建一个新项目,并选择适用于你的微控制器的型号。 然后,打开"Configuration"选项卡,找到"Peripherals"选项卡下的"I2C"和"GPIO"设置。在I2C设置中,启用I2C外设,并选择适当的时钟频率和I2C地址。在GPIO设置中,启用相应的GPIO引脚并将其配置为"Alternate function"模式。 接下来,转到"Project Manager"选项卡并选择你喜欢的工程命名和保存路径。 完成上述配置后,点击生成代码按钮,CubeMX将为你自动生成初始化代码。 在生成的代码中,你需要编写显示数据和命令的函数。可以使用I2C通信协议来与液晶显示屏进行通信。在发送数据或命令之前,你需要初始化I2C总线和GPIO引脚。然后,通过I2C总线发送数据或命令到液晶显示屏。 在发送数据或命令时,你需要按照LCD1602的通信协议来进行操作。这包括设置控制字节和数据字节。通过设置RS位和RW位来区分发送的是指令还是数据。 最后,记得在生成的代码中添加延时函数,以确保LCD1602有足够的时间来处理接收到的数据或命令。 总之,使用CubeMX配置LCD1602液晶显示屏需要进行一系列的步骤,包括选择适当的微控制器型号、配置I2C和GPIO设置、生成代码、编写显示数据和命令的函数,并按照液晶显示屏的通信协议进行操作。这样,你就可以成功使用CubeMX配置LCD1602液晶显示屏了。 ### 回答2: Cubemx是一款非常强大的嵌入式开发工具,可以帮助开发者快速配置和生成代码,实现基于STM32微控制器的LCD1602液晶屏的功能。 首先,用户需要安装STM32CubeMX软件,并选择适合自己的STM32微控制器型号。然后,用户可以在软件中选择需要使用的外设功能,例如GPIO、I2C、SPI等。对于LCD1602液晶屏,用户需要选择对应的GPIO接口来连接控制线(例如RS、RW、E)以及数据线(D0-D7)。 在配置完所需的外设后,用户可以生成相应的初始化代码。Cubemx将自动生成基于HAL的初始化和驱动代码,供用户在项目中使用。同时,Cubemx还提供了简洁易用的图形用户界面,可以让用户轻松配置各种参数,例如显示模式(4位或8位)、光标控制、字符显示等。 在生成的代码中,用户可以根据自己的需求进行修改和扩展。例如,可以在主函数中编写逻辑代码,通过调用HAL提供的接口来控制LCD1602液晶屏显示不同的内容。用户还可以通过GPIO接口与其他外设进行通信,实现更复杂的功能。 总之,使用Cubemx可以极大地简化基于STM32LCD1602液晶屏的开发过程。它提供了简单易用的配置界面和基础代码生成功能,让开发者能够更专注于应用开发,而无需过多关注底层细节。 ### 回答3: Cubemx是ST公司推出的一款用于快速生成STM32微控制器代码的软件工具。而LCD1602是一种经典的字符型液晶显示器,它能够以16列2行的形式显示字符信息。 使用Cubemx开发环境进行LCD1602驱动编程可以简化开发过程,以下是具体步骤: 1. 打开Cubemx软件,选择STM32型号并创建一个新的工程。 2. 在引脚配置页面上,将I/O引脚与LCD1602的对应引脚连接起来。通常,LCD1602的VCC接3.3V电源,GND接地,RS引脚连接到STM32的GPIO引脚,R/W接地,E引脚连接到另一个GPIO引脚,D4-D7引脚连接到四个GPIO引脚。 3. 在Cube Configuration页面上,找到LCD组件,并启用它。然后选择对应的控制器类型(如回路),以及其他特性(如显示列数和行数)。 4. 点击生成代码按钮,生成对应的文件和初始化代码。 5. 在主函数中,通过调用函数进行初始化和配置。例如,使用HAL的GPIO配置函数设置引脚为输出模式,并使用LCD函数初始化液晶显示器。 6. 编写其他功能代码。例如,可以使用函数或自定义函数来实现在LCD上显示文字、清屏、移动光标等功能。通过调用相应的函数来控制LCD1602显示特定的字符或字符串。 以上就是使用Cubemx来驱动LCD1602的基本步骤。通过这种方式,可以方便地进行LCD1602的编程,并将其与STM32微控制器进行集成,实现各种显示需求。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值