蓝桥杯:STM32 LCD显示及数据格式化

文章代码使用 HAL 库。

文章目录

  • 前言
  • 一、LCD 原理图:
  • 二、LCD 基本函数:
  • 1.LCD 清屏函数:LCD_Clear ( u16 Color );
  • 2. 显示一行字符串:LCD_DisplayStringLine(u8 Line, u8 *ptr);
  • 3.设置字符背景色:LCD_SetBackColor(vu16 Color);
  • 4.设置字体颜色:LCD_SetTextColor(vu16 Color);
  • 三,sprintf 函数:
  • 四,处理LCD数据显示问题:(格式化输出)
  • " %5d " , " % -5d " , " % 05d " , " % 5.3f "
  • " %x " , " %o "
  • 显示 百分号:
  • 总结
  • 下一节讲解 EEPROM。
  • 前言


    一、LCD 原理图:

    比赛提供了 HAL_LCD 的例程,相关的 IO 已经帮我们初始化完成,所以我们不需要再去配置引脚。
    示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
    蓝桥杯比赛板子的 LCD 屏幕 的分辨率是 320 * 240

    比赛 默认 在 LCD 上显示一个字符大小是固定的,是16 * 24 的点阵

    一行最多显示 20 个字符,可以显示 10 行。也就是说一个字符 x 方向占据 16 (320 / 20 = 16), y 方向占据 24 。(240 / 10 = 24)


    二、LCD 基本函数:

    1.LCD 清屏函数:LCD_Clear ( u16 Color );

    LCD_Clear 准确的来说是 清屏 + 填充颜色。
    可以将 LCD 屏幕 清屏,并显示不同的颜色(根据 参数 Color )。

    下面是 Color 的颜色定义。

    /* 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_Clear(Green);  //填充为绿色
    

    2. 显示一行字符串:LCD_DisplayStringLine(u8 Line, u8 *ptr);

    LCD_DisplayStringLine 用于在 某一行显示字符串

    Line : 表示要在 哪一行 显示。
    ptr :表示要显示的 字符串。

    Line 的定义(一共有 10 行)

    #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
    

    例如:在第 1 行显示 ABC ,在 2 行显示 123。
    (由于我们没有设置字体背景颜色,所以显示成白色,下一步我们就显示字符背景颜色; 字体颜色 也没有设置则显示黑色,第 4 步会讲)

    	LCD_DisplayStringLine(Line0, (uint8_t *)"       ABC          ");
    	LCD_DisplayStringLine(Line1, (uint8_t *)"       123          ");
    

    3.设置字符背景色:LCD_SetBackColor(vu16 Color);

    LCD_SetBackColor 用于设置 背景颜色
    此函数没有清屏功能。

    例如: 将字符背景设置为黄色。

    	LCD_Clear(Green);  //清除屏幕,并填充绿色
    	LCD_SetBackColor(Yellow); //将字符背景设置为黄色
    
    	 //在第一行,显示字符ABC
    	LCD_DisplayStringLine(Line0, (uint8_t *)"       ABC          "); 
    	//在第二行,显示字符123 
    	LCD_DisplayStringLine(Line1, (uint8_t *)"       123          "); 
    

    4.设置字体颜色:LCD_SetTextColor(vu16 Color);

    LCD_SetTextColor 用于设置在 LCD 上显示的字体的颜色

    颜色通过参数 Color 改变。(颜色定义和上面的一样)

    例如;将字体颜色设置为 白 色。

    	LCD_SetTextColor(White);
    

    三,sprintf 函数:

    头文件 : #include < stdio.h >
    sprintf ( char *str, const char *format, … ) 发送格式化输出到 str 所指向的字符串

    str : 这是指向一个字符数组的指针,该数组存储了 C 字符串.
    format : 这是字符串

    例如:(将 val 放入 buf 数组 buf )

    	void fun(unsigned char val)
    	{
    		unsigned char buf[20];
    		sprintf(buf , the value is "%d", val);
    	}
    

    四,处理LCD数据显示问题:(格式化输出)

    问题:
    如果在屏幕某行 先显示一串长数据,后面对 该行 重新输入一共较短的数据时,可能会造成数据的覆盖,导致长数据对短数据覆盖问题。

    例如:我首先在第一行显示 2222,后面再次输入 11,则屏幕 会显示 1122。 这就是先前的长数据对端数据进行了覆盖。

    	u8 display_buf[20];
    	sprintf((char *)display_buf, "%d",2222);    
    	LCD_DisplayStringLine(Line0, display_buf);  //第一行显示 2222
    	
    	sprintf((char *)display_buf, "%d",11);
    	LCD_DisplayStringLine(Line0, display_buf);  //再次显示 11
    

    解决方法

    方法一:在第二次输入短数据后 输入空格

    	sprintf((char *)display_buf, "%d",2222);
    	LCD_DisplayStringLine(Line0, display_buf);
    	
    	sprintf((char *)display_buf,  "%d  ",11);  //在%d 后面加两个空格。
    	LCD_DisplayStringLine(Line0, display_buf);
    

    方法二:格式化输出。

    	sprintf((char *)display_buf, "%d",2222);
    	LCD_DisplayStringLine(Line0, display_buf);
    	
    	sprintf((char *)display_buf, "%5d",11);  // %5d 代表输出数据长度是 5 位。(不足5位补空格)
    	LCD_DisplayStringLine(Line0, display_buf);
    

    " %5d " , " % -5d " , " % 05d " , " % 5.3f "

    " % 5d " : 输出 数据为 5 位, 不足补 0 .(右对齐)

    " % -5d " : 输出 数据为 5 位, 不足补 0 .(左对齐)

    " % 05d " : 输出 数据为 5 位, 前面补 0 .(右对齐)

    " % 5.3f " : 显示小数,总长为 5 为,小数点后有 3 位。(小数点算一位)

    例如:显示 1.123123,保留三位小数。

    sprintf((char *)display_buf, "%5.3f",1.123123);
    

    " %x " , " %o "

    " %x " : 显示 16 进制。
    " %o " : 显示 8 进制。

    显示 百分号:

    " %d %% ": 使用 2 个百分号可以显示出一个百分号。

    总结

    下一节讲解 EEPROM。

    大家可以自己尝试一下,有不懂的可以留言讨论。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 蓝桥杯:STM32 LCD显示及数据格式化

    发表评论