蓝桥杯STM32G431RBT6学习——LCD
前言
作为在开发板上最显眼的LCD屏幕,自然而然也是每年的必考考点。国信长天开发板使用的是一块2.4寸(240*320)的TFT-LCD液晶屏,其引脚占用如下:
其中,CS为片选信号引脚,RS为数据/命令选择引脚,WR为写入控制引脚,RD为读取控制引脚,RST为复位控制引脚,D0~D15为数据线。
STM32CubeMX配置
通过观察底层驱动(比赛提供)可以发现,其实单论LCD驱动来说这一步是并不需要的,因为在官方给的驱动文件就已经实现了对LCD的GPIO配置,如下所示:
其中配置引脚为PA8,PB5、8、9,PC0~PC15,所有引脚均配置为推挽输出模式,因此CubeMX配置可以省略。
Keil代码编写
LCD驱动相关API如下:
LCD初始化
函数内部实现了GPIO的对应初始化及液晶寄存器配置
void LCD_Init(void);
设置显示颜色
文本默认颜色为黑色
背景默认颜色为黑色
void LCD_SetTextColor(vu16 Color); //设置文本颜色
void LCD_SetBackColor(vu16 Color); //设置背景颜色
参数:颜色,其宏定义如下:
颜色 | 地址值 |
---|---|
White | 0xFFFF |
Black | 0x0000 |
Grey | 0xF7DE |
Blue | 0x001F |
Blue2 | 0x051F |
Red | 0xF800 |
Magenta | 0xF81F |
Green | 0x07E0 |
Cyan | 0x7FFF |
Yellow | 0xFFE0 |
清除显示
void LCD_ClearLine(u8 Line); //清除一行显示
void LCD_Clear(u16 Color); //清除全屏显示
LCD_ClearLine参数:清除行号
LCD_Clear参数:清除后的背景色
绘制类函数
void LCD_SetCursor(u8 Xpos, u16 Ypos); //设置绘制起始坐标
void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c); //绘制字符(未使用字库)
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii); //绘制字符
void LCD_DisplayStringLine(u8 Line, u8 *ptr); //显示一行字符串
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width); //设置一个显示窗口,后面的绘制以该窗口为坐标系
void LCD_WindowModeDisable(void); //禁用窗口模式,重新以全屏为坐标系
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction); //绘制线段
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width); //绘制矩形
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius); //绘制圆形
void LCD_DrawMonoPict(uc32 *Pict); //显示单色图
void LCD_WriteBMP(u32 BmpAddress); //从Flash中读取图片显示
void LCD_DrawBMP(u32 BmpAddress); //未实现
void LCD_DrawPicture(const u8* picture); //显示16色图片
绘制类函数参数列表:
Xpos:X坐标,取值为0~240;
Ypos:Y坐标,取值为0~320;
c :字符数据,注意此处为字模数组;
Line :行,取值Line0~Line9;
Column:同Ypos;
Ascii:ASCII字符,取值 0x20~0x7E;
ptr :字符串;
Height:窗口高度;
Width:窗口宽度;
Length:线段长度;
Direction:线段方向,取值Horizontal(水平)或其他(竖直);
Radius:圆形半径;
Pict:图片取模数组数据
字符流函数
int sprintf( char *buffer, const char *format [, argument,…] );
参数1:写入的字符串数组;
参数2:字符串及格式符;
参数3:格式符中对应的变量数据
基本使用
API还算得上丰富(主要题目使用难度不大),通俗易懂,直接使用即可。
显示两行数据并清除:
LCD_Init();
LCD_Clear(White);
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int num = 1;
char text[30];
sprintf(text,"%d Hello World!",num);
LCD_DisplayStringLine(Line4, (u8*)text);
LCD_DisplayStringLine(Line5, (u8*)text);
HAL_Delay(1000);
LCD_ClearLine(Line4);
HAL_Delay(1000);
LCD_Clear(White);
HAL_Delay(1000);
}