写用stm32驱动lcd1602代码
时间: 2023-09-26 08:14:20 浏览: 117
基于stm32 的LCD1602驱动代码
下面是使用STM32驱动LCD1602的代码,需要注意的是,这里使用的是4位数据线模式,如果使用8位数据线模式,需要修改相应的代码。
首先需要定义一些宏:
```
#define RS_PIN GPIO_PIN_0
#define RS_PORT GPIOA
#define EN_PIN GPIO_PIN_1
#define EN_PORT GPIOA
#define D4_PIN GPIO_PIN_2
#define D4_PORT GPIOA
#define D5_PIN GPIO_PIN_3
#define D5_PORT GPIOA
#define D6_PIN GPIO_PIN_4
#define D6_PORT GPIOA
#define D7_PIN GPIO_PIN_5
#define D7_PORT GPIOA
```
然后定义一些函数:
```
void LCD_Cmd(uint8_t cmd);
void LCD_Data(uint8_t data);
void LCD_Init(void);
void LCD_Clear(void);
void LCD_SetCursor(uint8_t row, uint8_t col);
void LCD_Print(char *str);
```
其中,`LCD_Cmd`函数用来发送命令,`LCD_Data`函数用来发送数据,`LCD_Init`函数用来初始化LCD,`LCD_Clear`函数用来清屏,`LCD_SetCursor`函数用来设置光标位置,`LCD_Print`函数用来输出字符串。
下面是具体的代码实现:
```
#include "stm32f1xx_hal.h"
#define RS_PIN GPIO_PIN_0
#define RS_PORT GPIOA
#define EN_PIN GPIO_PIN_1
#define EN_PORT GPIOA
#define D4_PIN GPIO_PIN_2
#define D4_PORT GPIOA
#define D5_PIN GPIO_PIN_3
#define D5_PORT GPIOA
#define D6_PIN GPIO_PIN_4
#define D6_PORT GPIOA
#define D7_PIN GPIO_PIN_5
#define D7_PORT GPIOA
void LCD_Cmd(uint8_t cmd)
{
HAL_GPIO_WritePin(RS_PORT, RS_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(D4_PORT, D4_PIN, (cmd >> 4) & 0x01);
HAL_GPIO_WritePin(D5_PORT, D5_PIN, (cmd >> 5) & 0x01);
HAL_GPIO_WritePin(D6_PORT, D6_PIN, (cmd >> 6) & 0x01);
HAL_GPIO_WritePin(D7_PORT, D7_PIN, (cmd >> 7) & 0x01);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(D4_PORT, D4_PIN, cmd & 0x01);
HAL_GPIO_WritePin(D5_PORT, D5_PIN, (cmd >> 1) & 0x01);
HAL_GPIO_WritePin(D6_PORT, D6_PIN, (cmd >> 2) & 0x01);
HAL_GPIO_WritePin(D7_PORT, D7_PIN, (cmd >> 3) & 0x01);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
}
void LCD_Data(uint8_t data)
{
HAL_GPIO_WritePin(RS_PORT, RS_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(D4_PORT, D4_PIN, (data >> 4) & 0x01);
HAL_GPIO_WritePin(D5_PORT, D5_PIN, (data >> 5) & 0x01);
HAL_GPIO_WritePin(D6_PORT, D6_PIN, (data >> 6) & 0x01);
HAL_GPIO_WritePin(D7_PORT, D7_PIN, (data >> 7) & 0x01);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(D4_PORT, D4_PIN, data & 0x01);
HAL_GPIO_WritePin(D5_PORT, D5_PIN, (data >> 1) & 0x01);
HAL_GPIO_WritePin(D6_PORT, D6_PIN, (data >> 2) & 0x01);
HAL_GPIO_WritePin(D7_PORT, D7_PIN, (data >> 3) & 0x01);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(EN_PORT, EN_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
}
void LCD_Init(void)
{
HAL_Delay(40);
LCD_Cmd(0x30);
HAL_Delay(5);
LCD_Cmd(0x30);
HAL_Delay(1);
LCD_Cmd(0x30);
HAL_Delay(1);
LCD_Cmd(0x20);
HAL_Delay(1);
LCD_Cmd(0x28);
HAL_Delay(1);
LCD_Cmd(0x08);
HAL_Delay(1);
LCD_Cmd(0x01);
HAL_Delay(1);
LCD_Cmd(0x06);
HAL_Delay(1);
LCD_Cmd(0x0C);
HAL_Delay(1);
}
void LCD_Clear(void)
{
LCD_Cmd(0x01);
HAL_Delay(1);
}
void LCD_SetCursor(uint8_t row, uint8_t col)
{
switch (row)
{
case 0:
LCD_Cmd(0x80 + col);
break;
case 1:
LCD_Cmd(0xC0 + col);
break;
default:
break;
}
}
void LCD_Print(char *str)
{
while (*str)
{
LCD_Data(*str++);
}
}
```
使用时,只需要调用相应的函数即可。例如:
```
LCD_Init();
LCD_Clear();
LCD_SetCursor(0, 0);
LCD_Print("Hello, world!");
```
阅读全文