蓝桥杯STM32 G431 hal库开发速成——LCD

一、 LCD移植

1.添加官方给的三个文件分别到Inc和Src文件夹中
在这里插入图片描述
在这里插入图片描述
2.将lcd.c文件添加到项目中,与之前的做法一致
在这里插入图片描述

3.在主函数中添加头文件
在这里插入图片描述
4.LCD的初始化 注:这个初始化一定要放到其他初始化的后面,不然前面会覆盖后面的!!!
在这里插入图片描述

二、 常用的LCD函数

在这里插入图片描述
void LCD_Init(void);
这个函数用于初始化LCD。它可能会设置LCD的各种参数,如时序控制、接口配置、显示参数等,以确保LCD能够正确工作。通常,这个函数在系统启动时调用一次。
void LCD_SetTextColor(vu16 Color);
这个函数用于设置LCD显示的文本颜色。调用这个函数后,所有的文本输出都将使用这个颜色,直到再次改变颜色。
void LCD_SetBackColor(vu16 Color);
这个函数用于设置LCD的背景颜色。与 LCD_SetTextColor 类似。这个背景颜色将用于下一个字符或字符串的背景或LCD屏幕的空白部分。
void LCD_Clear(u16 Color);
这个函数用于清除LCD屏幕,并用指定的颜色填充整个屏幕。这通常用于屏幕内容的初始化或者在屏幕更新前清除旧的显示内容。
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
在LCD屏幕的指定行上显示一个字符串。这个字符串从ptr指向的内存地址开始,直到遇到空字符结束。

三、 LCD基础功能使用

本实验的实验现象:用按键控制页面的切换,刚上电,页面为白色,按下按钮1切换页面1,按下按钮2切换页面2

1.在key.c中将写功能增加几行代码,用于按键控制页面切换!

在这里插入图片描述
2.在lcd.c文件中写入页面代码

char str[50];
extern int gui;
void lcd()
{

   if(gui==0) //界面0
	 {
		LCD_SetBackColor(Blue);//设置背景颜色
		LCD_SetTextColor(White);//设置字体颜色
		LCD_DisplayStringLine(Line0, (uint8_t *)"                    ");//写界面内容
		LCD_DisplayStringLine(Line1, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line2, (uint8_t *)"      LD MODE       ");
		LCD_DisplayStringLine(Line3, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line4, (uint8_t *)"                    ");
	
		LCD_SetBackColor(White);
		LCD_SetTextColor(Blue);
		LCD_DisplayStringLine(Line5, (uint8_t *)"                    ");
    	LCD_DisplayStringLine(Line6, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line7, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line8, (uint8_t *)"      LD1:On         ");
		LCD_DisplayStringLine(Line9, (uint8_t *)"                    ");
	 }
 if(gui==1)
	 {
		LCD_SetBackColor(Blue);
		LCD_SetTextColor(White);
		LCD_DisplayStringLine(Line0, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line1, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line2, (uint8_t *)"      TIM MODE      ");
		LCD_DisplayStringLine(Line3, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line4, (uint8_t *)"                    ");

		LCD_SetBackColor(White);
		LCD_SetTextColor(Blue);
		LCD_DisplayStringLine(Line5, (uint8_t *)"                    ");
		LCD_DisplayStringLine(Line6, (uint8_t *)"  Stopwatch timing      ");
		LCD_DisplayStringLine(Line7, (uint8_t *)"                    ");
    		sprintf(str,"           c            ");//在屏幕上显示计数值
		LCD_DisplayStringLine(Line8, (uint8_t *)str);
		LCD_DisplayStringLine(Line9, (uint8_t *)"                    ");
	 }
}

3.在main.c函数中进行初试化,清屏和调用
在这里插入图片描述

四、LCD 高亮显示某一行

在LCD 屏幕中高亮显示某一行
在lcd.c中加入如下代码

void gaoliang(int gaoliang_line,int gaoliang_color,int other_color)//1是高亮显示0--9行,2是高亮颜色,3是其他颜色
{
	LCD_SetBackColor(other_color);
	if(gaoliang_line!=0)
	{LCD_DisplayStringLine(Line0,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=1)	
	{LCD_DisplayStringLine(Line1,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=2)	
	{LCD_DisplayStringLine(Line2,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=3)
	{LCD_DisplayStringLine(Line3,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=4)
	{LCD_DisplayStringLine(Line4,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=5)
	{LCD_DisplayStringLine(Line5,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=6)
	{LCD_DisplayStringLine(Line6,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=7)
	{LCD_DisplayStringLine(Line7,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=8)
	{LCD_DisplayStringLine(Line8,(uint8_t *)"      hello          ");}
	if(gaoliang_line!=9)
	{LCD_DisplayStringLine(Line9,(uint8_t *)"      hello          ");}		
	LCD_SetBackColor(gaoliang_color);
	switch (gaoliang_line)
  {
		case 0:	LCD_DisplayStringLine(Line0,(uint8_t *)"      hello          ");break;
		case 1:	LCD_DisplayStringLine(Line1,(uint8_t *)"      hello          ");break;
		case 2:	LCD_DisplayStringLine(Line2,(uint8_t *)"      hello          ");break;
		case 3:	LCD_DisplayStringLine(Line3,(uint8_t *)"      hello          ");break;
		case 4:	LCD_DisplayStringLine(Line4,(uint8_t *)"      hello          ");break;
		case 5:	LCD_DisplayStringLine(Line5,(uint8_t *)"      hello          ");break;
		case 6:	LCD_DisplayStringLine(Line6,(uint8_t *)"      hello          ");break;
		case 7:	LCD_DisplayStringLine(Line7,(uint8_t *)"      hello          ");break;
		case 8:	LCD_DisplayStringLine(Line8,(uint8_t *)"      hello          ");break;		
		case 9:	LCD_DisplayStringLine(Line9,(uint8_t *)"      hello          ");break;
	}		
	LCD_SetBackColor(other_color);  
}

在main.c中的while(1)中进行函数的调用

	  gaoliang(0,Blue,White);

五、LCD 高亮显示某一个字符

在lcd.c中加入如下代码
注:LCD共319列,从右边开始计算,故采用319-y就表示从左侧起第y列

//高亮变量(两位小数),高亮的颜色,背景颜色,行,列
void gaoliang_char(float value,int color,int Back_color,int line,int y)
{
	  int x_shi,x_ge,x_xiao1,x_xiao2;
		LCD_SetBackColor(Back_color);		
		LCD_SetTextColor(color);
		x_shi=(int)(value*100)/1000;
		x_ge=(int)(value*100)%1000/100;
		x_xiao1=(int)(value*100)%1000%100/10;
		x_xiao2=(int)(value*100)%1000%100%10;		 
		LCD_DisplayChar(line, 319-y, (char)x_shi+'0');
		LCD_DisplayChar(line, 319-(y+15), (char)x_ge+'0');
		LCD_DisplayChar(line, 319-(y+30), '.');
		LCD_DisplayChar(line, 319-(y+45), (char)x_xiao1+'0');
		LCD_DisplayChar(line, 319-(y+60), (char)x_xiao2+'0');
}

在main.c中的while(1)中进行函数的调用

	  gaoliang_char(45.31,Green,White,Line0,110);

六、解决LCD和LED冲突

查阅LCD官方原理图跟LED官方原理图可知,LED的八个GPIO引脚与LCD冲突。
在这里插入图片描述
为了解决这一冲突,在这三个函数的头尾分别加上

u16 pcout = GPIOC->ODR;
GPIOC->ODR = pcout;

GPIOC->ODR 是一个寄存器,ODR 通常代表输出数据寄存器(Output Data Register),用于控制连接到 GPIOC 端口的引脚的高低电平状态。

如果你在LCD和LED之间遇到冲突,这可能是因为它们共享了相同的GPIO端口(在这个例子中是 GPIOC),并且在操作LCD时可能会不小心改变了应该控制LED的引脚状态。为了避免这种情况,你可以在操作LCD之前保存当前GPIOC端口的状态,并在操作完成后恢复它。这样可以确保在LCD操作期间不会影响到LED的状态。

七、易错点

1.这行初始化一定不能忘记,否则无法运行!

  LCD_Init();//lcd初始化

2.注意这个函数,这个函数会额外为设置字体的那一行添加白色背景

	LCD_SetTextColor();

以下这两个案例就很好的说明了。

第一个案例,因为字体颜色是白色,额外添加了白色背景所以显示就覆盖了。
LCD_Clear(Black);
LCD_SetTextColor(White);
在这里插入图片描述

第二个案例,字体颜色是绿色,额外添加了白色背景也不会覆盖其颜色,所以正常显示。
LCD_Clear(Black);
LCD_SetTextColor(Green);

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Comedy_宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值