在上一章的基础上我们构建LCD程序的模板。
1、用官方程序进行移植
官方资源包:
通过百度网盘分享的文件:2-新版竞赛平台.zip
链接:https://pan.baidu.com/s/1Z8mD4NrywlqbpUEDKSHAtw?pwd=1234
提取码:1234
官方为我们提供了LCD的资源包,我们仅需要移植即可使用,我们在上节代码的基础上继续进行。
①首先,我们在液晶驱动参考程序里面找到HAL库文件,Inc文件夹存放.h文件,Src文件夹存放.c文件。
我们将Inc文件夹中的lcd.h和fonts.h文件复制到自己的工程下面,将Src文件夹中的lcd.c文件也复制到自己工程下面。
我们自己的工程Src与Inc文件均在Core文件夹下面。
②将lcd文件添加到工程下
这里有两种方法:
方法一:
双击文件夹,再找到lcd.c文件所在位置,添加即可。
方法二:
点击上方的”品“,
然后选择对应的文件夹,点击Add Files添加lcd.c文件。添加完成后,编译一下,确保不会处错误。
2、代码编写
代码编写我们可以打开官方的程序,进行cv工程。
首先我们在和之间引入lcd.h文件。
然后我们将官方的初始化代码进行cv工程,讲初始化代码放在begin和end之间。
此时,如果下载就会发现我们的LCD屏幕变蓝了,说明已移植成功。
根据上面的函数与具体现象我们不难发现,上面程序就是对LCD进行初始化,设置LCD屏幕的背景色和前景色。
2.1创建LCD程序
根据之前LED一样的操作,我们创建一个LCD程序,LCD刷新时间可按题目要求设置,这里我们设置成100ms刷新一次。具体怎么构建,这里不再赘述,可根据前面章节,或根据后续视频进行学习。
这里我们再使用c语言中的sprintf()函数,进行显示。使用前我们先引入string和stdio文件。
然后我们创建一个数组,一定要大于屏幕长度20,这里我们选择30。
ps:若我们的字符串大于22,而我们的数组长度不足20,就会出现程序卡死现象。
sprintf函数就是将后面的字符串打印到我们创建的lcd_str数组里面,然后LCD_DisplayStringLine函数将lcd_str打印到屏幕上。
void LCD_Proc(void)
{
if(uwTick-uwtick_lcd_point<100) return;
uwtick_lcd_point=uwTick;
uint8_t lcd_str[30];
sprintf((char *)lcd_str,"uart_test");
LCD_DisplayStringLine(Line4 ,(unsigned char *)lcd_str);
}
具体效果如下图。
2.2 屏幕翻转
有一年的题目中出现了屏幕翻转的题目,那我们该如何操作呢。
首先我们双击LCD_Init函数,进入函数内部。
再进入下面函数内部
我们可以看到有两个函数内部后面注释有两个数字 ,我们将这两行代码复制到LCD初始化后面,并将参数设置为后面的注释值,试一下效果,顺便改一下前景色,背景色颜色。
具体代码和效果如下:
我们可以发现屏幕发生了翻转。
/* USER CODE BEGIN 2 */
//lcd初始化代码
LCD_Init();
LCD_WriteReg(R1 , 0x0100); // set SS and SM bit //0x0100
LCD_WriteReg(R96 , 0xA700); // Gate Scan Line 0xA700
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
/* USER CODE END 2 */
2.3具体案例
下面我们让我们的屏幕显示如下内容,这里为了方便,我直接将各个值分别设置为2 4 2。
这里我们可以看出,lcd的显示函数只有具体的行参数,那如何修改列呢,比如Data是从第2行第8列开始的,这时候我们可以想到空格。那我们试一下。
因为行是从Line0开始,所以第2行应该为Line1,我们先将翻转程序注释掉。
void LCD_Proc(void)
{
if(uwTick-uwtick_lcd_point<100) return;
uwtick_lcd_point=uwTick;
uint8_t lcd_str[30];
sprintf((char *)lcd_str," Data ");
LCD_DisplayStringLine(Line1 ,(unsigned char *)lcd_str);
sprintf((char *)lcd_str," CNBR:2 ");
LCD_DisplayStringLine(Line3 ,(unsigned char *)lcd_str);
sprintf((char *)lcd_str," VNBR:4 ");
LCD_DisplayStringLine(Line5 ,(unsigned char *)lcd_str);
sprintf((char *)lcd_str," IDLE:2 ");
LCD_DisplayStringLine(Line7 ,(unsigned char *)lcd_str);
}
可以看到满足要求,那我们就能完成LCD显示操作了。
2.4高亮显示
那我们如果让某一行高亮显示该怎么做呢?思考一下
............................................................................................................................(1minute later)
我们可以修改颜色(具体看要求是背景还是字体),这里我们将CNBR行进行高亮显示,我需要在CNBR前修改背景颜色,那我修改完下面是不是也变了,所以我需要在VNBR行前将背景色变回去,即可达到CNBR行高亮显示。具体代码和效果如下:
void LCD_Proc(void)
{
if(uwTick-uwtick_lcd_point<100) return;
uwtick_lcd_point=uwTick;
uint8_t lcd_str[30];
sprintf((char *)lcd_str," Data ");
LCD_DisplayStringLine(Line1 ,(unsigned char *)lcd_str);
LCD_SetBackColor(Blue);
sprintf((char *)lcd_str," CNBR:2 ");
LCD_DisplayStringLine(Line3 ,(unsigned char *)lcd_str);
LCD_SetBackColor(Black);
sprintf((char *)lcd_str," VNBR:4 ");
LCD_DisplayStringLine(Line5 ,(unsigned char *)lcd_str);
sprintf((char *)lcd_str," IDLE:2 ");
LCD_DisplayStringLine(Line7 ,(unsigned char *)lcd_str);
}
那再做一下提升,我更改背景色是直接修改了一行,那我如果只想让VNBR对应的数字显示为红色呢。
LCD_SetBackColor(Black);
sprintf((char *)lcd_str," VNBR:4 ");
for(int i=0;i<20;i++)
{
if(i>7) LCD_SetTextColor(Red);
else LCD_SetTextColor(White);
LCD_DisplayChar(Line5,(20-i)*16,lcd_str[i]);
}
LCD_SetTextColor(White);
我们还是将字符串打印到lcd_str中去,从0开始数的话,数字位于第8列,我们就设定i>7(我们可以多次修改,直至出现复合自己预期的结果)时让字体颜色设为红色,其他时候为白色,然后再利用显示单个字符的函数。函数第一个参数为行,第二个参数为开始列,这个函数是从后向前打印,所以应该为(20-i)列,一列占16字节。打印完成后再将字体设置为白色,否则就会出现除了VNBR其他字体全是红色的现象。
具体效果如下:
具体代码及资源包如下:
通过百度网盘分享的文件:蓝桥杯培训
链接:https://pan.baidu.com/s/1N2aFu2QKjKalcznl5sNbAw?pwd=1234
提取码:1234
标签:文件,国奖,函数,lcd,蓝桥,LCD,文件夹,我们 From: https://blog.csdn.net/qq_62549077/article/details/142449527培训视频后续添加到此。
编写不易,点个关注吧,给点动力!!!!!