写在前面——
《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.4 LCD显示实验,实现在不同要求下进行LCD显示字符。
官方例程下载:https://pan.baidu.com/s/1QC5BnDgY1m1me6-ihQ_OUQ?pwd=nqb1
提取码:nqb1

4.4 LCD显示实验

4.4.1. 实验任务

  1. 字符显示:参看官方例程HAL_06_LCD, LCD初始化配置,实现字符显示。
  2. 拓展功能:改变背景、字体颜色、格式(sprintf)等。

4.4.2. 硬件连接

在这里插入图片描述
LCD的使用,官方提供例程,直接使用即可,无需配置;需要注意的是,他的接口和LED有重叠 。

4.4.3. 初始化配置(STM32CubeMX)

  对于LCD,直接使用官方提供的初始化驱动程序,只需要移植过来就行了。
  根据当前任务需求,若需要配置LED、按键等GPIO,请按照前述各实验操作进行。
  这里,按照前述方法,选择目标器件stm32G431RBT6,配置RCC、SYS,设置时钟为80MHz,填写工程名称(如lcd)、路径,即可完成工程初始化配置。
  通常,不用在STM32CubeMX中配置LCD。
在这里插入图片描述

4.4.4. 应用程序设计(KEIL5)

1. 在项目工程中配置LCD

1)复制初始化例程到工程文件夹中
  将官方提供的资源包中的fonts.h和lcd.h文件复制到自己所建的工程文件夹对应的Inc文件夹下,将资源包中的lcd.c文件复制到自己所建的工程文件夹对应的Src文件夹下,随后打开工程文件。(在例程6(HAL_06_LCD)中Inc和Src文件夹中也有这些文件)在这里插入图片描述
2)将led.c文件添加进项目工程当中
在这里插入图片描述
  头文件fonts.h和lcd.h在Inc文件夹下,已在库文件搜索路径中,无需再操作了。若放在其他文件夹下,则自行添加其路径。
在这里插入图片描述
3)LCD初始化
  main.c中添加相关语句,并初始化LCD
首先引用lcd.h,不需要引用font.h(已在lcd.c中引用了,重复引用会报错)
在这里插入图片描述
再进行LCD初始化。
在这里插入图片描述

2. 字符显示

  LCD为20x10,一行最多显示20个字符,不要溢出,一共有10行(Line0-Line9)。
在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
在lcd.h中已定义行数相关的常量:
#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
在lcd.c中已定义一系列的函数,部分函数功能介绍:
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_DisplayChar(u8 Line, u16 Column, u8 Ascii); //任意位置显示字符
void LCD_DisplayStringLine(u8 Line, u8 *ptr); //任意行显示字符串

1)字符/字符串显示

//显示单个字符
LCD屏幕的宽度是范围是0~319,一个字符的占到了16,因此将一个字符a显示在第—行第一列需要这么写:

LCD_DisplayChar(Line0, 319-16, 'a');

//显示字符串

LCD_DisplayStringLine(Line1,"Name:Crystal");  //第二行显示Name:Crystal

  可以参考例程6(HAL_06_LCD),在main函数中输入以下语句,进行字符显示:
在这里插入图片描述

2)显示某变量值

LCD显示某变量值,使用以下格式:sprintf语句+LCD_DisplayStringLine语句

  • 首先需要使用sprintf格式化输出语句,如:
uint8_t buf[30] ;
sprintf((char *) buf,"%02d : %02d : %02d" ,hour, min,sec);

  sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。
  该函数包含在stdio.h的头文件中,使用时需要加入:#include <stdio.h>
  sprintf与printf函数的区别:二者 功能相似,但是 sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。 sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。
  字符串格式化方式,请自行百度。( %s,字符串;%d,整型;%f,浮点型,也就是小数类型的,若想保留指定的小数个数,比如保留两位,使用%.2f)。

  • 再进行字符串显示:语句LCD_DisplayStringLine,如
LCD_DisplayStringLine(Line1,buf);

若特殊要求字体颜色、字体背景色,可搭配以下函数使用,如:

sprintf((char *)ucLcd,"%02d:%02d:%02d",ucHour,ucMin,ucSec);
LCD_SetBackColor(Red);//红色
LCD_DisplayChar(Line3,320-4*16,ucLcd[0]);//(行数,字符的位置,要显示的字符)

3)不同情况显示不同字符

要求: 在第6行(Line5),电压大于最大值时显示Status: Upper;电压小于最小值时显示Status: Lower;电压介于最大值和最小值之间时显示Status: Normal。
  在main.c中用户添加代码区添加以下代码:

void LCD_Proc()
{
	if(Volt > Max_Volt)
	   	sprintf((char*)ucLcd,"    Status:Upper    ");
	if(Volt < Min_Volt)
	   	sprintf((char*)ucLcd,"    Status:Lower    ");
	if((Min_Volt <= Volt) & (Volt <= Max_Volt))	
    	sprintf((char*)ucLcd,"    Status:Normal   ");
    	
	LCD_DisplayStringLine(Line5,ucLcd);
}

4)同一行内容不同字体颜色或背景色

要求: 在Line3,显示时分秒,例如15:20:32,要求小时数15的背景色为红色,分钟数20背景色为黑色
  在main.c中用户添加代码区添加以下代码:

void LCD_Proc()
{
	sprintf((char *)ucLcd,"%02d:%02d:%02d",ucHour,ucMin,ucSec);
	LCD_SetBackColor(Red);//红色
	LCD_DisplayChar(Line3,320-4*16,ucLcd[0]);//(行数,字符的位置,要显示的字符)
	LCD_DisplayChar(Line3,320-5*16,ucLcd[1]);
	LCD_SetBackColor(Black);//黑色
	LCD_DisplayChar(Line3,320-6*16,ucLcd[3]);
	LCD_DisplayChar(Line3,320-7*16,ucLcd[4]);
}

本质上,这还是把文本颜色函数LCD_SetBackColor()穿插于各显示函数LCD_DisplayChar()之间。

4.4.5. 小结

  • LCD配置,无需CubeMX操作,但是在工程项目中手动进行初始化配置LCD_Init()。
  • 关键函数:清屏(LCD_Clear),设置背景颜色(LCD_SetBackColor),设置文本颜色(LCD_SetTextColor),显示字符(LCD_DisplayChar、LCD_DisplayStringLine),格式化输出(sprintf)。
  • 每行有320单位长,有0~9共10行

更多推荐