蓝桥杯嵌入式(STM32G431)的 LCD 模块,官方资源包已经把 ILI9341/ILI932X 的驱动写好了。你要做的不是从零写时序,而是会用官方函数 + 避开 PC 口冲突。用 LL 库生成工程时,记得在 CubeMX 的 Project Manager → Advanced Settings 里把 GPIO、RCC 改成 LL,否则底层 LL_GPIO_... 和 HAL 会打架。
LCD 底层走的是 8080 并口时序:CS、RS、WR、RD 加 16 位数据线,写数据靠 WR 上升沿锁存。这些官方驱动都封装好了,我们不用管。
一、必须掌握的重要函数
1. 初始化与清屏
| 函数 | 作用 | 常用度 |
|---|---|---|
void LCD_Init(void); | 初始化 LCD,配置 GPIO 和控制器寄存器 | ★★★★★ |
void LCD_Clear(u16 Color); | 全屏填充指定颜色 | ★★★★★ |
void LCD_ClearLine(u8 Line); | 清空某一行 | ★★★★ |
LCD_Init() 放在 while(1) 之前,只执行一次。LCD_Clear() 不要频繁调,会闪屏。
2. 颜色设置
| 函数 | 作用 | 常用度 |
|---|---|---|
void LCD_SetTextColor(vu16 Color); | 设置文字颜色 | ★★★★★ |
void LCD_SetBackColor(vu16 Color); | 设置文字背景色 | ★★★★★ |
颜色直接用 Black、White、Red、Green、Blue、Yellow 等枚举值,定义在 lcd.h 里。设置一次后一直有效。
3. 字符显示(最核心)
| 函数 | 作用 | 常用度 |
|---|---|---|
void LCD_DisplayStringLine(u8 Line, u8 *ptr); | 在指定行显示字符串 | ★★★★★ |
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii); | 在指定行、列显示一个字符 | ★★★ |
LCD_DisplayStringLine 支持 Line0 ~ Line9 共 10 行,每行最多 20 个字符。比赛里 90% 的显示都靠它。
配合 sprintf 显示动态数值:
char text[30];
sprintf(text, "ADC: %d mV", adc_val);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
4. 图形绘制(题目要求画图时用)
| 函数 | 作用 | 常用度 |
|---|---|---|
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width); | 画矩形 | ★★★ |
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction); | 画线 | ★★ |
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius); | 画圆 | ★★ |
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width); | 设置局部刷新窗口 | ★★★ |
void LCD_WindowModeDisable(void); | 关闭窗口模式 | ★★★ |
LCD_SetDisplayWindow 可以只刷新屏幕某一块区域,做波形显示时很有用,能避免全屏清屏闪烁。
5. 图片显示(了解即可)
void LCD_DrawBMP(u32 BmpAddress);
void LCD_DrawPicture(const u8 *picture);
除非题目要求显示 Logo 或图标,否则不用管。
6. 中层、底层函数(不用直接调)
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
void LCD_CtrlLinesConfig(void);
void LCD_BusIn(void);
void LCD_BusOut(void);
这些是驱动内部用的,初始化时自动调用。只有解决 LED 冲突时,才需要动 LCD_WriteReg、LCD_WriteRAM_Prepare、LCD_WriteRAM 这三个函数。
二、最小可用模板
#include "lcd.h"
#include "stdio.h"
int main(void)
{
// 其他初始化...
LCD_Init();
LCD_Clear(Black);
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
LCD_DisplayStringLine(Line0, (uint8_t *)"Blue Bridge Cup");
LCD_DisplayStringLine(Line2, (uint8_t *)"LCD Ready");
while (1)
{
char buf[30];
sprintf(buf, "Count: %d ", count++);
LCD_DisplayStringLine(Line4, (uint8_t *)buf);
LL_mDelay(500);
}
}
记住:初始化一次,颜色设一次,剩下就是 LCD_DisplayStringLine 打天下。
三、避坑指南
1. PC 端口冲突(最致命)
LCD 数据线是 PC0~PC15,而板载 LED 的 LD1~LD4 在 PC8~PC11。操作 LCD 时会顺带改变 LED 状态。
解决办法:在 LCD_WriteReg、LCD_WriteRAM_Prepare、LCD_WriteRAM 三个函数里保存和恢复 GPIOC->ODR:
u16 temp = GPIOC->ODR;
// ... 原有 LCD 操作 ...
GPIOC->ODR = temp;
如果暂时不用 LED,也可以先把 PD2 置低,关闭 573 锁存器。
2. 不要频繁清屏
LCD_Clear() 全屏刷新会闪。只清需要更新的行,或者用等长字符串覆盖旧内容:
sprintf(buf, "%-20s", "New Text");
LCD_DisplayStringLine(Line3, (uint8_t *)buf);
3. 行号别越界
Line0 ~ Line9,共 10 行。每行最多 20 个字符,超了不会显示。
4. LL 库配置
CubeMX 里切 LL 后,不需要手动配置 PC0~PC15,LCD_Init() 会自己配。如果你在 CubeMX 里也配了这些引脚,反而可能冲突。
四、总结
蓝桥杯 LCD 是白给的。官方驱动已经封装好 8080 并口时序和控制器初始化,你只需要:
- 用 LL 库生成工程;
- 把官方下发的.c和.h文件移植到自己的工程里面;
- 调
LCD_Init()、LCD_Clear()、LCD_SetTextColor()、LCD_SetBackColor(); - 用
LCD_DisplayStringLine()+sprintf()显示内容; - 处理 PC0~PC15 和 LED 的冲突。
把这几件事做好,LCD 就不会再是扣分项,需要本文件的可以下载
蓝桥杯嵌入式 - STM32 LL 库 LCD 工程(蓝桥杯模板,新增中文学习注释)。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2401_82419694/article/details/166093798



