STM32 LCD 简单显示彩色图片

2023-12-07 11:52

本文主要是介绍STM32 LCD 简单显示彩色图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32 LCD 数组方式简单显示彩色图片


文章目录

  • STM32 LCD 数组方式简单显示彩色图片
  • 前言
  • 1、图片处理
    • 1.1 准备图片
    • 1.2 查看和调整图片大小
  • 2、Picture2Hex软件使用
  • 3、函数代码实现
  • 3、图片显示效果
  • 4、显示图片太大会报错
  • 总结


前言

在使用LCD填充的时候发现正点原子提供了一个很好用的填充函数,就是LCD_Color_Fill();该函数是用来填充颜色块的,也可以直接用来显示图片,因为图片也是由颜色块组成的。所以需要使用stm32从内部flash的方法来显示图片时就不要独立写显示图片的函数了,非常实用。


1、图片处理

1.1 准备图片

第一步:准备一张需要显示的图片。
注意:该图片的分辨率大小需要在使用的LCD屏支持的分辨率范围内,如果图片分辨率超出LCD屏幕的分辨率是无法正常显示或者出现异常的情况。

接下来就以下面这个表情图片为例进行显示:

在这里插入图片描述

该图片为.jpg格式的图片,分辨率是200x200。使用的LCD分辨率是240x320的。

1.2 查看和调整图片大小

第二步:查看图片分辨率方法:
方法1:在图片属性里面查看

在这里插入图片描述

方法2:用画图软件方式查看

鼠标右键图片以画图方式打开图片,如下图:
点击重新调整大小。

在这里插入图片描述

在这里插入图片描述

这里有一个小技巧,如果发现这个分辨率太大,也可以在这里输入小分辨率的数值即可进行调整,注意勾选下面的保持纵横比选项,才能保证图片的原始比例。

2、Picture2Hex软件使用

该软件在浏览器输入软件名字搜索下载即可。

第一步:双击Picture2Hex.exe文件,即可打开该软件,界面如下:

在这里插入图片描述

根据图片信息进行设置参数。

在这里插入图片描述

导入图片:

在这里插入图片描述

导入后就可以在软件的目录下看到这个work文件夹,打开后可以看到一个bmp的图片和.c的文件,转换生成的大数组就在这个.c里面了,拷贝到MDK工程即可。

在这里插入图片描述

添加后的效果如下,需要在名字前面添加const关键字进行修饰,不然会提示内存不够的。
这个LOGO_W和LOGO_H是图片对应的分辨率,为了方便看大小的,可以不用管该代码。

在这里插入图片描述

3、函数代码实现

函数原型如下:

//在指定区域内填充指定颜色块
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
//color:要填充的颜色
void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color)
{u16 height, width;u16 i, j;width = ex - sx + 1;            //得到填充的宽度height = ey - sy + 1;           //高度for (i = 0; i < height; i++){LCD_SetCursor(sx, sy + i);  //设置光标位置LCD_WriteRAM_Prepare();     //开始写入GRAMfor (j = 0; j < width; j++){LCD->LCD_RAM=color[i * width + j];  //写入数据}}
}这里有一点是需要特别注意的,就是这个函数是对显示区域加1操作了,所以在调用该函数时,区域大小也需要对应减去1才能正常显示,不然显示的图片会显示异常等错位效果。

在main.c文件下的mian函数内调用该函数。

在while里面调用函数:LCD_Color_Fill(0, 0, 199, 199, (u16*)gImage);
编译下载代码后发现能正常显示图片,能达到实验效果目的。

但是发现调用函数这样写区域坐标有点别扭,和图片分辨率大小不太符合。那么,可以适当改一下原函数进行显示,修改如下:

//在指定区域内填充指定颜色块
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx)*(ey-sy)
//color:要填充的颜色
void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color)
{u16 height, width;u16 i, j;width = ex - sx;               //得到填充的宽度height = ey - sy;              //高度for (i = 0; i < height; i++){LCD_SetCursor(sx, sy + i);  //设置光标位置LCD_WriteRAM_Prepare();     //开始写入GRAMfor (j = 0; j < width; j++){LCD->LCD_RAM=color[i * width + j];  //写入数据}}
}把获取宽度和高度的坐标+1删除即可。

调用如下:LCD_Color_Fill(0, 0, 200, 200, (u16*)gImage);
这样写就很方便看出图片的分辨率大小和显示位置了。

编译下载代码后发现效果是一样的,这样看起来就比较直观图片大小了。

3、图片显示效果

在这里插入图片描述

4、显示图片太大会报错

这种读取大数组的方式不建议用来显示大图片的,因为是芯片内存有限,显示小图片还是可以的。要是需要显示图片的还是建议读取SD卡的方式,这样就不会占用太大的内存了,节省一些空间。

添加大图片数组后下载会有错位提示,如下图:

在这里插入图片描述

在这里插入图片描述

总结

用这个方法来显示小分辨率的图片还是很不错的,颜色效果很逼真,和图片原图是一样的效果,就是有点费内存,不过小型项目或者学习还是可以的。

用这个LCD_Color_Fill函数后,发现使用其它的图片转换工具转换出来的数据显示会异常的,大概率和LCD显示格式存在差异导致的,刚好LCD是用565的颜色模式,而这个软件也刚好是的,所以就对应可以使用了。

通过该例子就能很好地学习了一下LCD_Color_Fill函数的实现,以及传参过程。

这篇关于STM32 LCD 简单显示彩色图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465777

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2