系列文章目录
文章目录
目录
前言
本文主要是介绍蓝桥杯官方提供的LCD驱动及相关函数的使用,以及如何解决LED与LCD显示冲突的问题
一、工程创建
LCD的相关引脚定义已经在官方给的驱动里面定义好了,我们只需要把官方给的.c和.h以及字库文件添加到工程目录下,CubeMX中不需要配置LCD相关引脚,只需要配置时钟树和debug等配置,具体步骤可在LED一文查看
二、代码编写
1.如何解决LED与LCD显示冲突的问题
因为LED与LCD有比较多的共用引脚,所以在操作LED时,会对LCD的显示造成影响,方案之一是对LED操作时,对8个LED整体操作,而不对单个LED操作,这样会比较繁琐,还有一种方案是修改官方提供的驱动,造成干扰的原因是由于对应引脚输出寄存器(ODR)的值在LCD的相关操作中会被修改,如果此时锁存器被拉高,那么对应的LED可能会改变输出状态,造成显示错误,如:LCD的操作使得LED3的电平变为了高,而此时LED3的显示状态是亮(低电平),但你只操作LED1,此时锁存器拉高,则造成了LED3的显示错误,针对这个问题,我们可以修改LCD相关函数,在LCD操作ODR寄存器之前,先将ODR的值保存下来,在函数最后再复原ODR的值
我们先来找到这几个相关函数
在Functions这一栏我们能很便捷的找到LCD的相关函数
就是这几个write的函数,而且很好记忆,当你打开这几个函数,我们需要修改的就是这三个明显是操作了寄存器的函数,也就是LCD_WriteRAM、LCD_WriteRAM_Prepare、LCD_WriteReg
然后我们要做修改,在开头保存寄存器ODR的值,在结尾复原
以LCD_WriteRAM为例
其余两个函数也是同样的操作,这样便解决的冲突显示的问题
2.LCD的初始化以及LCD的显示
LCD的初始化,设置背景为黑色,字体为白色,也是蓝桥杯的一般要求
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LCD的显示函数,实现将KEY1按下次数显示在LCD上,并有LED的翻转显示,有一届国赛考过
sprintf(temp,"KEY1:%d",KEY1_num);
LCD_DisplayStringLine(Line1,(uint8_t *)temp);
key_scan();
//改变状态则清屏一次
if(old_turn != turn)
{
LCD_Clear(Black);
old_turn = turn;
}
if(key_up == 1)
{
KEY1_num++;
}
else if(key_up == 2)
{
//反向显示
LCD_WriteReg(R1 , 0x0100); //从下往上
LCD_WriteReg(R96 , 0xA700); //从右往左
turn = 1;
}
else if(key_up == 3)
{
//正向显示
LCD_WriteReg(R1 , 0x0000); //从上往下
LCD_WriteReg(R96 , 0x2700); //从左往右
turn = 0;
}
翻转显示参考大佬黑心萝卜三条杠的文章
一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示
记得翻转后清屏一次,不然会出现上下一起刷新的情况
现象
LCD
总结
本文介绍了蓝桥杯官方提供的LCD函数的使用以及如何解决LED与LCD显示冲突和翻转显示的问题