蓝桥杯嵌入式】四、各种外设驱动(四)LCD驱动

 温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录。

【蓝桥杯嵌入式】附录-CSDN博客

目录

内容提炼:

一、准备工作

1、CubeMX配置

2、MDK配置

二、熟悉驱动

三、程序编写

结语


内容提炼:

在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个驱动函数就行。

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值