stm32怎样设置lcd_command函数用于向LCD控制器发送命令,参考代码
时间: 2024-03-17 18:40:08 浏览: 16
下面是一个使用STM32的GPIO控制LCD的例子,其中包含了设置LCD命令的函数:
```c
#include "stm32f10x.h"
#define LCD_RS_Pin GPIO_Pin_0
#define LCD_RS_Port GPIOB
#define LCD_RW_Pin GPIO_Pin_1
#define LCD_RW_Port GPIOB
#define LCD_E_Pin GPIO_Pin_2
#define LCD_E_Port GPIOB
#define LCD_D4_Pin GPIO_Pin_4
#define LCD_D4_Port GPIOB
#define LCD_D5_Pin GPIO_Pin_5
#define LCD_D5_Port GPIOB
#define LCD_D6_Pin GPIO_Pin_6
#define LCD_D6_Port GPIOB
#define LCD_D7_Pin GPIO_Pin_7
#define LCD_D7_Port GPIOB
void LCD_Init(void);
void LCD_Command(unsigned char command);
void LCD_Data(unsigned char data);
int main(void)
{
LCD_Init();
// 发送清屏命令
LCD_Command(0x01);
while(1)
{
// 循环发送数据
}
}
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置GPIO为推挽输出
GPIO_InitStructure.GPIO_Pin = LCD_RS_Pin | LCD_RW_Pin | LCD_E_Pin | LCD_D4_Pin | LCD_D5_Pin | LCD_D6_Pin | LCD_D7_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化LCD
LCD_Command(0x28); // 4位总线,2行显示,5x8点阵
LCD_Command(0x0C); // 开启显示,不显示光标,不闪烁
LCD_Command(0x06); // 光标右移,字符不移动
LCD_Command(0x01); // 清屏
}
void LCD_Command(unsigned char command)
{
GPIO_ResetBits(LCD_RS_Port, LCD_RS_Pin); // RS=0,选择命令
GPIO_ResetBits(LCD_RW_Port, LCD_RW_Pin); // RW=0,写入数据
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (command & 0x10) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (command & 0x20) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (command & 0x40) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (command & 0x80) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (command & 0x01) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (command & 0x02) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (command & 0x04) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (command & 0x08) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
}
void LCD_Data(unsigned char data)
{
GPIO_SetBits(LCD_RS_Port, LCD_RS_Pin); // RS=1,选择数据
GPIO_ResetBits(LCD_RW_Port, LCD_RW_Pin); // RW=0,写入数据
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (data & 0x10) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (data & 0x20) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (data & 0x40) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (data & 0x80) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (data & 0x01) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (data & 0x02) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (data & 0x04) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (data & 0x08) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
}
```
在上面的代码中,`LCD_Command`函数用于向LCD控制器发送命令,`LCD_Data`函数用于向LCD控制器发送数据。其中,`LCD_RS_Pin`、`LCD_RW_Pin`和`LCD_E_Pin`分别是LCD的RS、RW和E引脚,而`LCD_D4_Pin`~`LCD_D7_Pin`则是LCD的数据引脚。在函数中,我们通过设置GPIO的输出电平来模拟LCD的通讯协议,从而向LCD控制器发送命令或数据。