温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录。
目录
内容提炼:
在main函数中初始化HAL库之后,就初始化LCD、设置颜色、用背景色清屏。因为中断会干扰LCD初始化。
/* USER CODE BEGIN Init */
LCD_Init();
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_Clear(Blue);
/* USER CODE END Init */
最常用的就是写字符串函数:
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
清除一行也会用到:
void LCD_ClearLine(u8 Line);
void LCD_Clear(u16 Color);
一、准备工作
1、CubeMX配置
在基础配置完成后(见【蓝桥杯嵌入式】三、省赛套路一条龙(一)工具配置)
根据原理图:
可以发现,这里LCD与LED的引脚复用了,这就是为什么要使用锁存器的原因,LCD芯片上也有锁存器,所以可以分时复用同一个引脚。根据CubeMX的处理机制,为引脚命名后,其默认名称依旧可以使用,所以使用LED时可以设置用户名,它们之间不会相互影响。
这里不用配置引脚,因为LCD驱动程序里面已经有了配置引脚的代码。
然后点击生成代码。
2、MDK配置
打开刚刚生成MDK项目。
导入比赛时提供的驱动文件。
(1)找到提供的LCD驱动文件
(2)
- 复制文件"lcd.h"和"fonts.h"到"\object\LightLED\Core\Inc"
- 复制文件"lcd.c"到"\object\LightLED\Core\Src"
(3)回到MDK软件,在左边的栏子里打开如下图所示路径
右击"Applicatioin/User/Core",选择下图中 黄色 指示的选项。
在查找范围里找到Src
选中"lcd.c",点击"Add"。
在"main.c"的如下代码段引入"lcd.c"。
所有关于LCD的配置完成。
二、熟悉驱动
建议抽空读一下驱动程序,主要是lcd.h 中定义的宏和关于函数定义的部分,根据名称就可以知道其作用。
重要的宏如下:
/* LCD color */
#define White 0xFFFF
#define Black 0x0000
#define Grey 0xF7DE
#define Blue 0x001F
#define Blue2 0x051F
#define Red 0xF800
#define Magenta 0xF81F
#define Green 0x07E0
#define Cyan 0x7FFF
#define Yellow 0xFFE0
#define Line0 0
#define Line1 24
#define Line2 48
#define Line3 72
#define Line4 96
#define Line5 120
#define Line6 144
#define Line7 168
#define Line8 192
#define Line9 216
所有的用户操作函数如下:
void LCD_Init(void);
void LCD_SetTextColor(vu16 Color);
void LCD_SetBackColor(vu16 Color);
void LCD_ClearLine(u8 Line);
void LCD_Clear(u16 Color);
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);
void LCD_DrawBMP(u32 BmpAddress);
void LCD_DrawPicture(const u8* picture);
最常用的就是写字符串:
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
在LCD上显示数字需要用到<stdio.h>库中的 sprintf 函数:
sprintf(字符数组指针,...);//...部分和printf函数相同
然后用以下方式显示:
LCD_DisplayStringLine(Line, 字符串指针);
很多题目中会先让你设置字体颜色、背景色就是它们两个:
void LCD_SetTextColor(vu16 Color);
void LCD_SetBackColor(vu16 Color);
清除一行和清屏也会用到:
void LCD_ClearLine(u8 Line);
void LCD_Clear(u16 Color);
通过阅读驱动中的代码,可以知道,一般都是横屏显示,字体大小固定,如果以一个字符为一格做表格,那么一共有10行20列。
其他的函数一般用不到,这个LCD驱动还是比较方便的,毕竟也考不了太复杂的显示。
三、程序编写
先在main函数里初始化LCD:
在为写文章做准备时,我发现这个驱动程序必须每一行都要写字符,才可以正常显示,否则会出现奇怪情况。如果只写一行字符,
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line2, (uint8_t *)" LCD Test ");
结果就会像这样:
必须10行都写字符(空格也算字符),或者先用背景色清屏才可以正常显示,你看自己喜欢那种就使用哪种。
方法一:10行都写字符,写一句然后复制粘贴,改一下行就可以了。
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, (uint8_t *)"12345678901234567890");
LCD_DisplayStringLine(Line1, (uint8_t *)" ");
LCD_DisplayStringLine(Line2, (uint8_t *)" LCD Test ");
LCD_DisplayStringLine(Line3, (uint8_t *)" ");
LCD_DisplayStringLine(Line4, (uint8_t *)" TianLang IoT ");
LCD_DisplayStringLine(Line5, (uint8_t *)" Sirius IoT ");
LCD_DisplayStringLine(Line6, (uint8_t *)" ");
LCD_DisplayStringLine(Line7, (uint8_t *)" ");
LCD_DisplayStringLine(Line8, (uint8_t *)" ");
LCD_DisplayStringLine(Line9, (uint8_t *)" ");
方法二:先用背景色清屏 ,但是还是要在空白处加空格,因为官方驱动程序只给了行选择。
注意:LCD_Clear(); 不要在死循环中使用,如果必须使用,也要加条件语句,不然可能会出现闪屏的现象。
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_Clear(Blue);
LCD_DisplayStringLine(Line0, (uint8_t *)"12345678901234567890");
LCD_DisplayStringLine(Line2, (uint8_t *)" LCD Test ");
LCD_DisplayStringLine(Line4, (uint8_t *)" TianLang IoT ");
LCD_DisplayStringLine(Line5, (uint8_t *)" Sirius IoT ");
结果如图:
而比赛时大多数情况下都是让你做类似于上图的显示,所以这一套代码也是必须要写的,
规律是双引号之间必须要有20个字符(空格也算字符)。
更改显示时可以清屏或清行,然后重写即可。
结语
LCD在比赛时起到了输出详细复杂信息的作用,所以几乎所有的比赛都会让你写LCD显示的部分,但是LCD本身并不复杂,只要记住如何配置然后记住那5个驱动函数就行。