STM32控制LCD1602,按键控制,HAl库编写
时间: 2023-05-24 10:06:34 浏览: 107
以下是基于HAL库的STM32控制LCD1602,按键控制的代码示例:
```c
#include "main.h"
#include "stm32f1xx_hal_gpio.h"
#define LCD_RS_Pin GPIO_PIN_0
#define LCD_RS_GPIO_Port GPIOB
#define LCD_RW_Pin GPIO_PIN_1
#define LCD_RW_GPIO_Port GPIOB
#define LCD_E_Pin GPIO_PIN_2
#define LCD_E_GPIO_Port GPIOB
#define LCD_D4_Pin GPIO_PIN_4
#define LCD_D4_GPIO_Port GPIOB
#define LCD_D5_Pin GPIO_PIN_5
#define LCD_D5_GPIO_Port GPIOB
#define LCD_D6_Pin GPIO_PIN_6
#define LCD_D6_GPIO_Port GPIOB
#define LCD_D7_Pin GPIO_PIN_7
#define LCD_D7_GPIO_Port GPIOB
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_TIM2_Init(void);
#define LCD_RS_1 HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_SET)
#define LCD_RS_0 HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_RESET)
#define LCD_RW_1 HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_SET)
#define LCD_RW_0 HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_RESET)
#define LCD_E_1 HAL_GPIO_WritePin(LCD_E_GPIO_Port, LCD_E_Pin, GPIO_PIN_SET)
#define LCD_E_0 HAL_GPIO_WritePin(LCD_E_GPIO_Port, LCD_E_Pin, GPIO_PIN_RESET)
#define LCD_Clear 0x01
#define returnHome 0x02
#define EntryModeSet 0x06
#define DisplayOff 0x08
#define DisplayOn 0x0C
#define FunctionSet_4bit 0x28
#define FunctionSet_8bit 0x38
#define SET_BUSY_FLAG 1
#define RESET_BUSY_FLAG 0
void LCD_Write_Data8Bit(unsigned char Data);
void LCD1602_WriteCommand(uint8_t com)
{
LCD_RS_0;
LCD_RW_0;
HAL_Delay(1);
LCD_E_1;
HAL_Delay(1);
LCD_Write_Data8Bit(com);
LCD_E_0;
}
void LCD1602_WriteData(uint8_t data)
{
LCD_RS_1;
LCD_RW_0;
HAL_Delay(1);
LCD_E_1;
HAL_Delay(1);
LCD_Write_Data8Bit(data);
LCD_E_0;
}
void LCD_Write_Data8Bit(unsigned char Data)
{
HAL_GPIO_WritePin(LCD_D4_GPIO_Port, LCD_D4_Pin,(GPIO_PinState)((Data>>0)&0x01));
HAL_GPIO_WritePin(LCD_D5_GPIO_Port, LCD_D5_Pin,(GPIO_PinState)((Data>>1)&0x01));
HAL_GPIO_WritePin(LCD_D6_GPIO_Port, LCD_D6_Pin,(GPIO_PinState)((Data>>2)&0x01));
HAL_GPIO_WritePin(LCD_D7_GPIO_Port, LCD_D7_Pin,(GPIO_PinState)((Data>>3)&0x01));
HAL_Delay(1);
HAL_GPIO_WritePin(LCD_D4_GPIO_Port, LCD_D4_Pin,(GPIO_PinState)((Data>>4)&0x01));
HAL_GPIO_WritePin(LCD_D5_GPIO_Port, LCD_D5_Pin,(GPIO_PinState)((Data>>5)&0x01));
HAL_GPIO_WritePin(LCD_D6_GPIO_Port, LCD_D6_Pin,(GPIO_PinState)((Data>>6)&0x01));
HAL_GPIO_WritePin(LCD_D7_GPIO_Port, LCD_D7_Pin,(GPIO_PinState)((Data>>7)&0x01));
HAL_Delay(1);
}
void LCD_Init(void)
{
HAL_Delay(200);
LCD1602_WriteCommand(FunctionSet_8bit);
HAL_Delay(5);
LCD1602_WriteCommand(FunctionSet_8bit);
HAL_Delay(1);
LCD1602_WriteCommand(FunctionSet_8bit);
HAL_Delay(1);
LCD1602_WriteCommand(FunctionSet_4bit);
HAL_Delay(1);
LCD1602_WriteCommand(DisplayOn);
HAL_Delay(1);
LCD1602_WriteCommand(EntryModeSet);
HAL_Delay(1);
LCD1602_WriteCommand(LCD_Clear);
HAL_Delay(1);
}
void LCD_Show_String(uint8_t row, uint8_t column, char data[])
{
LCD1602_WriteCommand(row * 0x40 + column + 0x80);
uint8_t i = 0;
while(data[i] != '\0')
{
LCD1602_WriteData(data[i]);
i++;
}
}
void LCD_Write_Busy_Flag(DWORD flagstate)
{
HAL_GPIO_WritePin(LCD_D7_GPIO_Port, LCD_D7_Pin,(GPIO_PinState)((flagstate>>7)&0x01));
}
void Check_Busy_Flag()
{
HAL_Delay(5);
LCD_RS_0;
LCD_RW_1;
LCD_E_1;
while(SET_BUSY_FLAG == HAL_GPIO_ReadPin(LCD_D7_GPIO_Port, LCD_D7_Pin))
{
// Wait for the Busy flag to clear
}
LCD_E_0;
HAL_Delay(5);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
LCD_Init();
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
{
LCD_Show_String(0, 0, "Button 1 Pressed");
}
else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET)
{
LCD_Show_String(0, 0, "Button 2 Pressed");
}
else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET)
{
LCD_Show_String(0, 0, "Button 3 Pressed");
}
else
{
LCD_Show_String(0, 0, "No Button Pressed");
}
HAL_Delay(100);
}
}
```
在此代码中,使用了LCD1602的RS、RW、E、D4~D7连接到了STM32的端口B0~B7,使用了PWM控制器的A0、A1、A2作为按键输入。
在main函数中,使用了while循环来判断不同按键的状态,以此来输出不同的字符串内容。当按下按键时,会触发对应的if语句,并通过LCD显示该按键的信息;当没有按下按键时,在LCD显示“No Button Pressed”。
通过这个代码,就可以实现STM32控制LCD1602,并根据按键输入显示不同的信息。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)