捷瑞电子工坊头像
关注

嵌入式蓝桥杯 LCD 速成:LL 库下记这几个函数就够了

蓝桥杯嵌入式(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);设置文字背景色★★★★★

颜色直接用 BlackWhiteRedGreenBlueYellow 等枚举值,定义在 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_WriteRegLCD_WriteRAM_PrepareLCD_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_WriteRegLCD_WriteRAM_PrepareLCD_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 并口时序和控制器初始化,你只需要:

  1. 用 LL 库生成工程;
  2. 把官方下发的.c和.h文件移植到自己的工程里面;
  3. LCD_Init()LCD_Clear()LCD_SetTextColor()LCD_SetBackColor()
  4. LCD_DisplayStringLine() + sprintf() 显示内容;
  5. 处理 PC0~PC15 和 LED 的冲突。

把这几件事做好,LCD 就不会再是扣分项,需要本文件的可以下载
蓝桥杯嵌入式 - STM32 LL 库 LCD 工程(蓝桥杯模板,新增中文学习注释)

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_82419694/article/details/166093798

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--