OLED显示图片,文字

显示图片 

1.这是随便一张的图片,自己可以随便截图一张

 2.单击图片,右边选择编辑

3.如下操作

 4.然后,这个水平和垂直的值的设置要根据你所使用的屏幕有多少个像素点,我当前使用的是0.96寸OLED屏幕,也就是12864,像素点是128*64。根据我的设置,图片最后显示到屏幕上的大小是22*32

5.接下来进行图片的保存,保存的格式是单色位图

 

6.分辨率是22*32,是按照我设置的,没问题

 7.使用取模软件PCtoLCD,模式选择图形模式

然后选择之前保存的bmp图片

 菜单中选项这边进行设置

取模

8.复制到程序中

 

/*** 函    数:OLED显示图像(**Adam修改, Y轴可以是负数**)* 参    数:X 指定图像左上角的横坐标,范围:0~127* 参    数:Y 指定图像左上角的纵坐标,范围:int_8* 参    数:Width 指定图像的宽度,范围:0~128* 参    数:Height 指定图像的高度,范围:0~64* 参    数:Image 指定要显示的图像* 返 回 值:无* 说    明:调用此函数后,要想真正地呈现在屏幕上,还需调用更新函数*/
void OLED_ShowImage(uint8_t X, uint8_t Y0, uint8_t Width, uint8_t Height, const uint8_t *Image)
{int8_t Y = (int8_t)Y0; // XY值为负数时,只要图片还有部分在屏幕内显示,就还是有意义的;uint8_t i, j;/*参数检查,保证指定图像不会超出屏幕范围*/if (X > 127){return;} // 如果X大于127则打印无意义,故无需打印uint8_t k = 0, l = 0, temp_Height; //(创建Y为负数相关变量)if (Y < 0)						   // 如果Y小于0, 则需打印图片位于屏幕内的部分;{temp_Height = Height; // 记录图片高度Height += Y;		  // 图片的高 减去Y轴绝对值k = (-Y - 1) / 8 + 1; // 图片的Byte行的下标偏移量;l = (-Y - 1) % 8 + 1; // Byte位移基	//(8 + Y % 8)%8;//		OLED_ShowNum(0, 56, l, 3, 6);Y = 0;				  // 图片仍然从屏幕Y0开始打印if ((int8_t)Height < 1){return;} // 需打印的图片高小于1时,说明不需要打印;}else if (Y > 63){return;} // 如果Y大于63则打印无意义,故无需打印/*将图像所在区域清空*/OLED_ClearArea(X, Y, Width, Height);/*遍历指定图像涉及的相关页*//*(Height - 1) / 8 + 1的目的是Height / 8并向上取整*/uint8_t Height_ceil = (Height - 1) / 8 + 1;for (j = 0; j < Height_ceil; j++) // 以OLED_DisplayBuf行下标遍历,(图像涉及的相关页){/*遍历指定图像涉及的相关列*/for (i = 0; i < Width; i++){/*超出边界,则跳过显示*/if (X + i > 127){break;}if (Y / 8 + j > 7){return;}if (k) // 以一行OLED_DisplayBuf行下标为基础, 取两行图像Byte, 根据位移基放置;{/*显示上一Byte图像在当前页的内容*/OLED_DisplayBuf[Y / 8 + j][X + i] |= Image[(j + k - 1) * Width + i] >> ((l));/*超出边界,则跳过显示*//*使用continue的目的是,当前Byte超出图片时,上一Byte的后续内容还需要继续显示*/if ((j + k) * 8 >= temp_Height){continue;} // 如果当前行Byte已经不属于图像,则不放置;/*显示当前Byte图像在当前页的内容*/OLED_DisplayBuf[Y / 8 + j][X + i] |= Image[(j + k) * Width + i] << (8 - (l));}else // 以一行图像Byte为基础, 放于两行OLED_DisplayBuf行之间;{/*显示图像在当前页的内容*/OLED_DisplayBuf[Y / 8 + j][X + i] |= Image[(j)*Width + i] << ((Y) % 8);/*超出边界,则跳过显示*//*使用continue的目的是,下一页超出边界时,上一页的后续内容还需要继续显示*/if (Y / 8 + j + 1 > 7){continue;}/*显示图像在下一页的内容*/OLED_DisplayBuf[Y / 8 + j + 1][X + i] |= Image[(j)*Width + i] >> (8 - (Y) % 8);}}}
}

9.实验结果

10.重复上述操作,再次取模得到一个分辨率一致数字,这样方便写入同一个数组进行调用。这个二维数组的一行就是对应一张图片的数据,一个文字的数据...

这个二维数组的每一行代表的是一个数字,或者文字,图片。程序上面看着一张图片对应好多行数据,但是你把一张图片对应的数据想象全放在一行。二维数组的列必须固定,分辨率确定了就知道有多少列。

int a[3][4];
a;//代表数组首行地址,一般用a[0][0]的地址表示
&a;//代表整个数组的地址,一般用a[0][0]地址表示
a[i];代表了第i行起始元素的地址(网上说是代表了第i行的地址,但我觉得不是,在讲数组与指针的关系时我会验证给大家看)
&a[i];代表了第i行的地址,一般用a[i][0]的地址表示
a[i]+j;//代表了第i行第j个元素地址,a[i]就是j==0的情况
a[i][j];//代表了第i行第j个元素
&a[i][j];//代表了第i行第j个元素的地址

二维数组讲解 

二维数组与指针(详解)_二维数组指针-CSDN博客

 

实验结果

显示文字

1.取模软件的设置还是和刚刚一样

2.模式选择字符模式,分辨率还是设置跟刚刚的一样,22*32,放入同一数组,方便管理,然后输入文字“你好”,进行取模

 

3.放入数组

const uint8_t number[][88] = {
0x00,0x00,0x80,0x60,0xD0,0xE8,0xF8,0x74,0xB4,0xDC,0xDC,0xDC,0xB4,0x74,0xE8,0xD8,
0xB0,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x7F,0xFF,0xE0,0xDF,0xBF,0xE3,
0x41,0xC0,0xA1,0x77,0xED,0xFF,0xFF,0xFC,0x03,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
0xC1,0xE6,0x45,0x8D,0x8D,0x8D,0x9D,0x4F,0xEE,0xDF,0xE1,0xFF,0x7F,0xCF,0xF8,0xFF,
0x3F,0x00,0x00,0x00,0x02,0x07,0x0C,0x1B,0x1B,0x3F,0x36,0x36,0x36,0x37,0x3B,0x3B,
0x3D,0x1E,0x0F,0x0F,0x03,0x01,0x00,0x00,/*"D:\Desktop\图片\数字bmp\test_bmp\9.bmp",0*/
0x00,0x00,0x00,0xC0,0x70,0xE8,0xF4,0x3A,0xDA,0xEA,0xEE,0xEA,0xDA,0xBA,0xF4,0xEC,
0x18,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1C,0xAF,0xDF,0xB8,0xF7,0xEF,
0xF8,0xD0,0xF8,0xFF,0x5C,0x6F,0xF8,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0xFE,
0xFB,0xFE,0x83,0x7D,0xFF,0x0F,0x06,0x05,0x8D,0xFB,0xAF,0xFE,0xFD,0x02,0xFC,0xF8,
0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x1B,0x17,0x37,0x76,0x75,0x7D,0x75,0x77,0x77,
0x77,0x3B,0x3D,0x1E,0x0F,0x07,0x00,0x00,/*"D:\Desktop\图片\数字bmp\test_bmp\8.bmp",0*/
0x00,0x00,0x00,0x00,0x00,0xC0,0x7C,0x18,0x08,0x00,0x80,0xFC,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x70,0x0E,0xFB,0x00,0x00,0x60,0x1C,
0x87,0x02,0x02,0xFA,0xF2,0x02,0x02,0x12,0x0F,0x07,0x02,0x00,0x00,0x02,0x01,0x00,
0x00,0xFF,0x00,0x00,0xC0,0x38,0x0F,0x01,0x00,0xFF,0xFF,0x00,0x01,0x06,0x38,0xF0,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x02,0x01,0x00,0x00,0x10,0x30,0x3F,
0x1F,0x00,0x00,0x00,0x00,0x01,0x01,0x00,/*"你",0*/
0x00,0x00,0x00,0x00,0x00,0xFC,0x08,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0xE0,0x70,0x00,0x00,0x00,0x00,0x02,0x02,0x82,0xFF,0x03,0x02,0x82,0xFE,0x00,
0x00,0x00,0x00,0x00,0xFC,0xFC,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x20,0x3F,
0x40,0x40,0xE0,0xBF,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,
0x01,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x03,0x0E,0x00,0x10,0x10,0x70,
0x7F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,/*"好",1*/
};

4.实验结果

实验结果

 代码链接:

通过网盘分享的文件:2024_1_21_多级菜单_v1.8_STM32C8T6_标准库.zip
链接: https://pan.baidu.com/s/1309T7Osy5y5L-8e9PlvLYg?pwd=h4sx 提取码: h4sx 
--来自百度网盘超级会员v7的分享

代码视频:

单片机多级菜单v1.2_哔哩哔哩_bilibili

注意:OLED_ShowImage这个函数在OLED_Patch_byAdam.c下

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

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

相关文章

猿辅导持续布局AI赋能教育领域,助推教育行业数字化转型

近日&#xff0c;由人民网主办的“AI之夜”活动在北京隆重举行。“AI之夜”活动旨在展示中国在人工智能领域的最新成果和创新应用&#xff0c;推动行业的交流与合作。活动现场&#xff0c;来自不同领域的专家们通过主题演讲、圆桌讨论和案例分享等形式&#xff0c;全面呈现了中…

Zotero版本兼容问题,无法安装插件“%s”

1.问题&#xff1a;zotero-better-notes与zotero版本不兼容 安装插件zotero-better-notes时&#xff0c;出现插件安装失败提示&#xff1a;无法安装插件“%S"。他可能无法与该版本的Zotero兼容 zotero-better-notes&#xff1a;是一款论文阅读笔记插件&#xff0c;之前一…

Profinet IO从站数据 转 opc ua项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 使用PRONETA软件获取PROFINET IO从站的配置信息 5 设置网关采集PROFINETIO从站设备数据 6 启动OPC UA协议转发采集的数据 7 选择槽号和数据地址 8 选择子槽号 9 案例总结 1 案例说明 设置网关采集ProfinetIO从站设…

android studio 读写文件操作(应用场景二)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;readtextviewIDsaveandread 本例程是个过渡例程&#xff0c;如果单是实现下图的目的有更简单的方法&#xff0c;但这个方法是下一步工作的基础&#xff0c;所以一定要做。 例程功能&#xff1a;将两个textvi…

基于SSM框架企业人事管理系统的设计与实现

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

百度智能云 CHPC: 使用 BtuneAK对基因测序软件进行加速

背景 本文主要介绍在 CHPC 平台使用 BtuneAK 自动化加速组件&#xff0c;可以直接对BWA、FastQC、Picard、Trimmomatic等业务端到端时长加速。 Btune 简单介绍 BtunePK介绍 BtunePK 是百度自研的一款性能分析和调优工具&#xff0c;兼容Intel、AMD、ARM三个CPU平台&#xff0…

Power BI - 批量导入数据

1.简单介绍 假定已经使用Power Automate Desktop(微软的RPA产品&#xff0c;是Power Platform平台的其中一个产品)从福布斯中文网获取了各地区的2024年的财富数据如下&#xff0c; 现在想批量导入数据到Power BI中&#xff0c;分析一下各地区的产业以及财富情况 2.具体说明 …

实现跨平台 SSH 连接:从 macOS 到 Windows WSL 的完整解决方案20241203

&#x1f310; 实现跨平台 SSH 连接&#xff1a;从 macOS 到 Windows WSL 的完整解决方案 ✨ 引言 随着跨平台开发的普及&#xff0c;开发者经常需要在多系统环境中切换和协作。尤其是在 macOS 和 Windows 混合使用的开发环境中&#xff0c;通过 SSH 远程访问和管理 Windows …

【css】基础(二)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;css专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &a…

2024通信工程师-中级-互联网技术备考经验

考试简介 全国通信专业技术人员职业水平考试&#xff0c;是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试。根据原人事部、信息产业部文件&#xff08;国人部发[2006]10号&#xff09;&#xff0c;通信专业技术人员职业水平评价&#xff0c;纳入全国专业技术人…

智能文档解析综述:结构化信息提取的技术、挑战与前景

综述论文&#xff1a;https://arxiv.org/abs/2410.21169 摘要 文档解析对于将非结构化和半结构化文档&#xff08;如合同、学术论文和发票&#xff09;转换为结构化、机器可读的数据至关重要。通过从非结构化输入中提取可靠的结构化数据&#xff0c;文档解析为众多应用提供了极…

【Web】AlpacaHack Round 7 (Web) 题解

Treasure Hunt flag在md5值拼接flagtxt的文件里&#xff0c;如 d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t 访问已经存在的目录状态码是301 访问不存在的目录状态码是404 基于此差异可以写爆破脚本 这段waf可以用url编码绕过 做个lab …

操作系统——文件系统

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构&#xff08;如目录和索引表等&#xff09;的集合。从系统角度来看&#xff0c;文件系统是…

java面向对象实验——扫雷+24点

扫雷 窗口绘制&#xff1a; GameWin package com.sxt;import javax.swing.*;public class GameWin extends JFrame {void launch(){this.setVisible(true);this.setSize(500, 500);this.setLocationRelativeTo(null);this.setTitle("SWE23070扫雷游戏");this.setD…

GPU 调度策略架构与CUDA运行机制(二)

市面上有很多GPU厂家&#xff0c;他们产品的软硬件架构各不相同&#xff0c;但是核心往往差不多&#xff0c;整明白了一个基本上就可以触类旁通了。针对当前gpu底层的一些架构以及硬件层一些调度策略的话估计大部分人就很难说的上熟悉了&#xff0c;这个不是大家的错&#xff0…

ddos攻击防御的方法有哪些

DDoS攻击&#xff0c;即分布式拒绝服务攻击(Distributed Denial of Service)&#xff0c;是一种恶意的网络攻击方式&#xff0c;旨在通过发送大量流量或请求到目标服务器、服务或网络&#xff0c;使其资源耗尽&#xff0c;无法处理合法用户的请求&#xff0c;从而导致服务中断或…

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

集成 Applitools 进行视觉回归测试(快速入门) 简介Applitools 的核心特点Applitools 的应用场景1. 准备工作2. 获取示例项目2.1 下载示例代码2.2 安装依赖2.3 选择测试运行方式3. 代码解析3.1 测试用例示例4. 运行测试4.1 设置 Applitools API 变量4.2 设置 Applitools Eyes …

RuoYi中数据分页功能实现的步骤(nvliz)

目录 前言 数据分页的作用 RuoYi中的实现步骤 前端的显示界面(实例介绍) 源码分析&#xff08;前端&#xff09; Pagination&#xff08;分页组件&#xff09;介绍 前端&#xff1a;getList()(方法源码分析) 源码分析&#xff08;后端&#xff09; 后端&#xff1a;List()…

HarmonyOS 5.0应用开发——全局广播的使用

【高心星出品】 文章目录 全局广播的使用公共事件接受系统公共事件原理 发布与订阅自定义公共事件订阅系统事件 全局广播的使用 全局广播可以用来做应用间通信&#xff0c;进程间通信&#xff0c;包含订阅、发布等功能。 公共事件 CES&#xff08;Common Event Service&…

ceph存储池

1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区&#xff0c;专门用来存储对象的 特点 将文件切片成对象&#xff0c;通过hash算法&#xff0c;找到存储池中的pg&#xff0c;池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响&#xff0c;过多和过少…