cubeIDE开发,结合图片取模工具,stm32程序在LCD显示图片

news2024/11/17 9:28:34

一、图片取模工具(imag2lcd)

        我们前面将汉字显示时说过,嵌入式LCD屏显示就是通过LCD屏幕数据接口给每个屏幕像素给出一个颜色值实现实时渲染显示出来。只不过文字显示时,给出的是一个二进制点阵,然后根据二进制中的“1”或“0”值匹配给出程序设置的前景色或背景色。那么涉及图片显示时,图片本身就是携带了颜色信息的,那么我们就可以直接将颜色信息通过LCD接口推送给屏幕。

        图片取模工具(或叫图片转换工具,imag2lcd),如下图所示,可以将图片格式文件转换为图片点阵代码表,将每个像素的颜色数值给出为16进制数值表示的点阵。

         该工具读者可以在网上搜索image2lcd进行下载,本文也上传了该工具到CSDN供大家按需下载:

LCD图像数据生成工具-嵌入式文档类资源-CSDN下载

二、 工程设计

        【1】本文借用了本博客专栏前面汉字显示博文的基础源码包,在该基础上进行图片显示。 本文采用的STM32L496VGT3-ali开发板,其LCD屏幕支持240*240像素输出。

         只是为了讲述图片在LCD显示实现过程,本人直接在网上下载了一张240*240的图片,并将该图片转换为bmp格式。

        【2】由于是进行240*240图片刷新在整个屏幕,因此采用了SPI-DMA实现刷新屏幕像素,本专栏前面oled点亮博文中,就采用了直接刷新和DMA刷新两种方式设置屏幕背景实现点亮。现在先回顾一下DMA方式需要注意的细节。

        1)开启DMA支持

         2)开启中断支持,然后保存生成输出代码

         3)增加对中断回调的处理

三、图片显示实现过程

        按上面做好了准备工作,可以参考:

cubeIDE开发, stm32的OLED点亮及字符显示设计(基于SPI通信)_py_free的博客-CSDN博客

cubeIDE开发,结合汉字取模工具,在LCD输出各种字体_py_free的博客-CSDN博客 

        先假设已经能点亮lcd屏幕了,现在开始实现图片在lcd屏幕输出显示过程。

       【1】 打来安装好的image2lcd工具,载入需要显示的图片,如下图进行设置。

         【2】完成设置,点击保存按钮,在弹出的对话框,输入想要保存的文件名,注意,如果没输入文件名后缀,将默认为(.c)输出,本文采用(.h)输出,如下图。

         【3】输出图像编码表如下图所示。

         【4】将输出的"pyimg.h"文件拷贝到工程的ICore/ oled目录下,并为了消除编译告警信息,将gImage_pyimg的数据类型调整为"uint8_t"。

         【5】在oled.h文件添加一个“void BSP_LCD_img_DMA();”函数声明,在oled.c文件中包含拷贝过来的头文件“include "pyimg.h"”,并实现“void BSP_LCD_img_DMA()”函数。

extern volatile uint8_t one_frame_done;//已在spi.c中用户自定义
//加载240*240*2的uint8_t格式颜色数组进行LCD屏幕显示
void BSP_LCD_img_DMA()
{
	/*gImage_pyimg 在pyimg.h中,大小WIDTH * HEIGHT *2=115200 */
	//需要分两次写入HAL_SPI_Transmit_DMA写入缓存大小uint16_t(0xfff,65535)
	one_frame_done = 0;
    /* 指定显存操作地址为全屏*/
    LCD_Address_Set(0, 0, WIDTH - 1, HEIGHT/2 - 1);
    Data_Cmd_State(1);/* 指定接下来的数据为数据 */
    /*DMA 写前半屏*/
    HAL_SPI_Transmit_DMA(&hspi1,gImage_pyimg, WIDTH*HEIGHT);
    while(!one_frame_done){/*release cpu and doing something else*/}
	one_frame_done = 0;
    /* 指定显存操作地址为全屏*/
    LCD_Address_Set(0, HEIGHT/2, WIDTH - 1, HEIGHT - 1);
    Data_Cmd_State(1);/* 指定接下来的数据为数据 */
    /*DMA 写后半屏*/
    HAL_SPI_Transmit_DMA(&hspi1,gImage_pyimg+WIDTH*HEIGHT, WIDTH*HEIGHT);
    while(!one_frame_done){/*release cpu and doing something else*/}
}

四、编译及下载

        【1】在main.c主函数中,加入按键1时调用“BSP_LCD_img_DMA”函数,实现图片在LCD屏幕显示。

         【2】点击编译及点击运行按钮,加载程序到开发板上

         【3】在开发板上点击按键1,观察显示效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java文件输入输出(简单易懂版)

文章目录写在前面文件输入文件输出写在前面 在Java中不论文件输入还是输出都会用到File类,参考这篇文章Java File类(文件操作类)详解这里会涉及到绝对路径、相对路径、路径中的斜杠“/”和反斜杠“\”,有些小伙伴可能不熟悉&…

数据结构—B树、B+树

文章目录B树B树的特点为什么要有B树:红黑树和B树比较B树B树的特点B树构建过程查询时数据提供数据磁盘向cpu推送数据B树的优点总结为什么要有B树:B树用途:为什么要有B树:B树用途:———————————————————…

WorkTool企微机器人APP分享自定义小程序

移动端应用怎么分享自定义小程序到企业微信 前言 什么是自定义小程序,就是我们可以通过业务逻辑或代码来动态修改每次发出的小程序所附带的路径(path)和参数(params),以此来控制每次发出的小程序都是有不同含义的,但企业微信并不让我们这样…

[附源码]Python计算机毕业设计Django体育器材及场地管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【Spring】事务管理

目录项目目录spring-dao.xml测试项目目录 UserMapper.xml写sql语句UserMapperImpl继承sqlSessionDaoSupport然后在里面做一个addUser和一个delete我们delete语句故意写错 但是我们想把add和delete当成一个事务delete错了,add也不应该成功所以我们需要进行事务管理配…

FLStudio2023水果中文版本使用操作心得与技巧

FL Studio2023是一款强大的音乐创作编辑软件,因软件LOGO为水果标志,故我们国人都习惯称之为水果。它让你的计算机就像是全功能的录音室,漂亮的大混音盘,先进的创作工具,让你的音乐突破想象力的限制。因此它又有"水…

手撕ThreadLocal源码

首先&#xff0c;创建MyThreadLocal类&#xff0c;区分开java.lang.ThreadLocal package com.huhu.threadlocal;import java.util.HashMap; import java.util.Map;public class MyThreadLocal<T> {/*** 所有需要和当前线程绑定的数据要放到这个容器当中*/private Map<…

WIFI的传输距离介绍

WIFI的传输距离介绍 WiFi模块在智能家居&#xff0c;智能驾舱等各行业各领域应用极广&#xff0c; 但有多少人了解他的传输距离是多少呢&#xff1f;是受什么影响呢&#xff1f; 一&#xff1a;WiFi模块的传输距离 WiFi模块的传输距离普遍在100-200米之间&#xff0c;其中也有支…

乐观锁思想在JAVA中的实现——CAS

前言 生活中我们看待一个事物总有不同的态度&#xff0c;比如半瓶水&#xff0c;悲观的人会觉得只有半瓶水了&#xff0c;而乐观的人则会认为还有半瓶水呢。很多技术思想往往源于生活&#xff0c;因此在多个线程并发访问数据的时候&#xff0c;有了悲观锁和乐观锁。 悲观锁认…

React+ts学习文档

1.项目中遇到的困难解决以及方案 1.顶部的查询按钮 点击查询如果在该组件去进行axios请求&#xff0c;这样再该组件下获得返回的列表还需要传回父组件&#xff0c;父组件再把列表发给下面的table组件&#xff0c;不太方便。 解决方案&#xff1a;将用户的选择项传给顶级组件i…

Kubernetes v1.25 搭建一个单节点集群用于Debug K8S源码

参考说明 参考自&#xff1a;v1.25.0-CentOS-binary-install-IPv6-IPv4-Three-Masters-Two-Slaves.md&#xff0c;按照自己的理解修改了下。 搭建好的单节点v1.25.4版本集群 1. 集群环境准备 1.1. 主机规划 IP主机名主机角色操作系统安装组件192.168.11.71k8s-master1maste…

在Python中使用LSTM和PyTorch进行时间序列预测

顾名思义&#xff0c;时间序列数据是一种随时间变化的数据类型。例如&#xff0c;24小时内的温度&#xff0c;一个月内各种产品的价格&#xff0c;一年中特定公司的股票价格。 去年&#xff0c;我们为一位客户进行了短暂的咨询工作&#xff0c;他正在构建一个主要基于时间序列…

【✨十五天搞定电工基础】正弦交流电路的分析

本章要求 1. 理解正弦量的特征及其各种表示方法&#xff1b; 2. 理解电路基本定律的相量形式及阻抗&#xff1b;熟练掌握计算正弦交流电路的相量分析法&#xff0c; 会画相量图&#xff1b; 3. 掌握有功功率和功率因数的计算,了解瞬时功率、无功功率和视在功率的概…

项目管理(如何进行团队管理)

团队构建与管理6步走 各项工作概述: 获取团队成员需要考虑的因素: 可用性。确认资源能否在项目所需时段内为项目所用。 成本。确认增加资源的成本是否在规定的预算内。 能力。确认团队成员是否提供了项目所需的能力。 有些选择标准对团队资源来说是独特的,包括: 经验。…

HTML人物介绍、个人设计web前端大作业、贝聿铭人物介绍(带报告3000字)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Allegro如何使用快捷键快速切换走线线宽操作指导

Allegro如何使用快捷键快速切换走线线宽操作指导 Allegro可以用快捷键快速切换走线线宽,比如在command下方输入数字5,可以切换到5mil的线宽 具体操作如下 打开系统属性,选择环境变量 找到home的环境变量的路径是哪里 找到路径下的pcbenv文件夹 找到env文件 用记事本打…

Android NDK初识

Android NDK是Android软件开发包(SDK)的相关工具集&#xff0c;用来扩展Android SDK的功能&#xff0c;从而使开发人员能够使用机器代码生成的编程语言(如C、C和汇编语言)实现一些对代码性能要求较高的模块&#xff0c;并将这些模块嵌入到Android应用程序中使用。 什么是Andro…

工业物联网案例:智能工厂设备无人值守系统方案

智能工厂又称“黑灯工厂”&#xff0c;具备智能化、自动化、无人化等特点&#xff0c;可以实现全天候高效的生产工作&#xff0c;是制造业的先进典范。通过工厂设备无人值守系统&#xff0c;可以集中采集、传输、处理、显示各类工业设备数据&#xff0c;可以对空压机、变电站、…

Gitee配置静态页面

辛辛苦苦写好了一个静态网页&#xff0c;想让大家都可以通过网络访问看到这个网页。比如&#xff0c;个人简历&#xff0c;个人静态页面作品展示等。 但是不想买服务器&#xff0c;配置域名&#xff0c;备案&#xff0c;什么的。 可以使用 Gitee Pages 服务&#xff0c;将静态…

Qt-FFmpeg开发-打开本地摄像头录制视频(7)

Qt-FFmpeg开发-打开本地摄像头录制视频【软解码 OpenGL显示YUV】 文章目录Qt-FFmpeg开发-打开本地摄像头录制视频【软解码 OpenGL显示YUV】1、概述2、实现效果3、FFmpeg录制视频编码流程4、主要代码5、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&…