OLED的字模提取(保姆级)---基于PCtoLCD2013
做为一个刚刚开始接触编程不久的白菜,最近OLED正在做一个信息显示,商家给我的例程里就是8X8,8X16两种字体的格式,我的屏幕是0.91寸的8X16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪自己学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,自己经验所得,有错请大家指出、勿喷。。
1.OLED屏幕驱动程序-功能
我用的OLED是这种IIC通讯-128X32的屏幕如图:
OLED要想提取出合适的字模就要好好理解一下这个驱动函数是怎么用的
1.OLED屏幕驱动的写指令函数:OLED内部有寄存器控制整块屏幕的工作
往屏幕的寄存器写特定代码指令、就能有不同的工作方式,具体的细节可以去查看屏幕附带的技术文档
void WriteCmd(uint8_t command)//写指令
{IIC_Start();IIC_SendByte(0x78);//OLED地址IIC_WaitAck();IIC_SendByte(0x00);//寄存器地址IIC_WaitAck();IIC_SendByte(command);IIC_WaitAck();IIC_Stop();
}
2.OLED屏幕的写数据函数:和指令函数类似,这个函数主要是控制屏幕上输出的数据信号,具体的数据显示方式下面详细说
void WriteDat(uint8_t data)//写数据
{IIC_Start();IIC_SendByte(0x78);//OLED地址IIC_WaitAck();IIC_SendByte(0x40);//寄存器地址IIC_WaitAck();IIC_SendByte(data);IIC_WaitAck();IIC_Stop();
}
3.OLED屏幕设置OLED的点亮位:这个函数的主要功能是设置显示的位置起点坐标(可以看见函数内部就是一些CMD写指令的函数:为啥这么用可以查看屏幕的手册,这里就不具体说了)
void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
{WriteCmd(0xb0 + y);WriteCmd(((x & 0xf0) >> 4) | 0x10);WriteCmd((x & 0x0f) | 0x01);
}
2.OLED屏幕工作行为
了解了这几个函数的大体功能看一下它是如何显示
先烧入这一段代码
OLED_SetPos(0,0);//WriteDat(0xF0);WriteDat(0x0F);
效果图为: (刚刚学的PS,P图不咋会,别嫌弃,哈哈哈)
因为屏幕太小加上拍出来的效果忒差,我用Excel做了一个图示
可以看到当“设定”了起始位置后,用WriteDat(写数据)就可以用一个16进制的数控制8个像素位置状态
如图:WriteDat写入0xF0,其化为2进制就可以写成(1111 0000)B、从屏幕的(0,0)位置开始看、从上到下、2进制的最低到最高位依次填入值(1为点亮、0为灭)
PS:有些屏幕是和我这个是相反的、数据的最低位在屏幕的第8位,(可以实验,或者查屏幕的技术文档)我更倾向于实验,哈哈哈 泥腿子,看着英文的技术文档太痛苦了
PS:有些屏幕做得比较小为了增加屏幕的行数的时候,一个16进制的数所控制的位可能会少于8个,比如:0xf0:(1111 0000)B 就屏幕就会对数据处理(x111 000x)B这些位置有用,就来我这块屏幕说,128X32就是屏幕的每一列从上到下有32个像素位置、如果一个16位数据控制8位的话32/8=4行、如果16位数控制5位的话32/5=6余下2个像素点,在我的屏幕上实验是只要大于5屏幕就会把最后2个像素的宽度填满
这个不用担心,当我们提取字模的时候就当成控制8位来处理,屏幕厂家会做好这个兼容性问题的,值得注意的是用_OLED_SetPos_ 能设置起始行做到第几行、这个参数对取模很重要
清楚了指定位置后输入数据后屏幕的显示行为后,再看下面这段代码
> OLED_SetPos(0,0);//for(int i=0;i<8;i++)WriteDat(0xff);//for(int i=0;i<16;i++)WriteDat(0xff);for(int i=0;i<128;i++)WriteDat(0xff);
效果图为:
通过屏幕行为我们可以看出,一个有趣的现象(其实初始化开始时设置好的,屏幕手册可以查) 当我们设定了OLED_SetPos(初始位置)后、连续进行WriteDat操作时,屏幕就会每WriteDat次后x坐标就后+1、相当于OLED_SetPos(X,Y)X值自动+1一样,但是当你连续输入的次数超过屏幕的固定参数时,它不会自动换行 (我的屏幕是128x32:连续输入超过128次时,它就没有变化了)
清楚OLED屏幕行为后、可以进入正题了,OLED字模的提取!!!
字模的提取我是用的PCtoLCD2013软件进行提取的,佩服这位大佬,手动点1024个赞
3. PCtoLCD2013提取软件功能
1.设置中的配置
以我这块屏幕为例,通过上面的讲解和输出行为应该知道怎么选择、取模的走向,和取模的方式了吧、你的数据是怎么放出来显示的就选那种方式,取模方式:行列式的原因就是给了一个OLED_SetPos后,在给一个WriteDat就会显示一列数据下去,如果还不直观,贴心的软件作者做了动画,好好看看就理解了,我就不再多说了,第二个红色框框就是比较关键的取模的地方了,它的设置关系到编码最后生成的数组,下面会详细讲解绿色的是我感觉还不错的数组输出格式,数组生成后直接CV,如果你要用二维数组就另当别论了
2.字模提取界面
PS:值得注意的一点是、作者也提醒了,设置‘点阵大小’的时候一定要注意:最好是8的倍数、如果是对英文取模的话,宽度设置为16时实际宽度是16/2=8!!!
PS:字宽、字高‘的设置才能影响,屏幕上显示出来的大小
4.PCtoLCD2013提取软件编码方式
这个真的是搞了好久才搞懂这个编码的套路!!!
直接上怎么算的方法:
(设置中的)点阵数 = (主界面)点阵宽度 = for循环的次数 = 显示宽度
(主界面)点阵高度/ 8 = 生成数组行数多少 = 需要换行的次数 = 显示高度
1.PS:显示宽度、显示高度 不等于 显示出的字符宽、高(其取决于字符宽度,高度的设置)
2.PS:这里篇幅限制,搞中文的,英文的宽度要减半
3.PS:用OLED_SetPos测出你屏幕的可以最大行数后,你就可以控制点阵高度在屏幕最大行数内就好了,你就可以随心所欲的控制你的字体显示了
上图理解:
设置中的点阵(占阵)设置为8,中文字 宽度设置为8,高位为8
用上面式子可知道,代码这样写就可以了:
uint8_t strss[]={0x10,0x7C,0x4B,0x3E,0x83,0x7C,0x14,0x20,//你0};OLED_SetPos(0,0);for(int i=0;i<8;i++)WriteDat(strss[i]);
通过刚刚上面屏幕程序的了解,不用多说了,肯定看着难看而且特别小,根本认不出来
接下来改变一下 显示高度(= 点阵的高度/8)
可以看见数组由一行变为俩行了、代码自己都可以想象到了吧
uint8_t strss[]={0x10,0x7C,0x4B,0x3E,0x83,0x7C,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//你0};OLED_SetPos(0,0);for(int i=0;i<8;i++)WriteDat(strss[i]);OLED_SetPos(0,1);for(int i=0;i<8;i++)WriteDat(strss[i+8]);
PS:可以用二维数组来做,看着更舒服一些
那怎么增加宽度呢:
当然可以直接改(设置中是点阵大小为8的倍数最好)
16的点阵—16的点阵宽度—8的点阵高度:代码如下 PS:循环16次
uint8_t strss[]={0x10,0x7C,0x4B,0x3E,0x83,0x7C,0x14,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//你0};OLED_SetPos(0,0);for(int i=0;i<16;i++)WriteDat(strss[i]);
最后附一张成功提取的图片:点阵=48,点阵宽48,点阵高48
可以知道一行需要for循环了48次、需要48/8=6,需要换行6次
PS:以上是我取模的思路,为了方便理解、说的有点死,也有其他方法,并且这个软件也可以提取图片的OLED显示,功能很强大,、可以自行探索
OLED的字模提取(保姆级)---基于PCtoLCD2013相关推荐
- Arduino+OLED基础保姆级教程(1)
第一篇:先打好基础(基础篇->1) (一)先说两句 这个教程从0到1让你入门OLED:教程是系列课程包括:OLED上显示第一行字,显示数字,显示汉字到写个简单的OLED显示界面再到最后写个炫酷的 ...
- 【ESP32】15.OLED显示实验(SPI / 字模提取)
上一篇: [ESP32]14.DHT11湿度传感器实验(DHT操作库) 前言: 先放电路连接图: OLED(有机发光二极管(Organic Light Emitting Diode)) 字模提取软件使 ...
- 保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享
前言 大家好,我是 @小曾同学,小伙伴们也可以叫我小曾- 如果你想实现一对一音视频通话和屏幕共享功能,不妨来看看这篇文章,保姆级教程,不需要从零实现,直接集成声网 SDK 即可轻松上手. 本文也分享了 ...
- 【保姆级教程】基于WordPress在阿里云服务器上搭建个人博客网站
写之前先回答几个问题: 1,网上类似的教程非常多,为什么写这篇教程? 答:博客网站我搭建过好几次,但是每次搭建都需要再去网上搜教程:然而网上的教程坑很多,甚至有些是错误的,不能完美解决自己的问题,有时 ...
- arpspoof安装和5分钟基于linux-kali的arp攻击防御示例(保姆级图文)【网络工程】
目录 温馨提示 安装arpspoof工具 进行arp攻击 arp防御简单测试 总结 欢迎关注 『网络工程专业』 系列,持续更新中 欢迎关注 『网络工程专业』 系列,持续更新中 温馨提示:对虚拟机做任何 ...
- 天才少年稚晖君 | 【保姆级教程】个人深度学习工作站配置指南
天才少年稚晖君 | [保姆级教程]个人深度学习工作站配置指南 来源:https://zhuanlan.zhihu.com/p/336429888 0. 前言 工作原因一直想配置一台自己的深度学习工作站 ...
- 【Midjourney实操】逼真到颤抖!保姆级教程教生成效果炸裂的图片
最近,许多由Midjourney V5创作的画作在网络上引起了热议,许多人惊呼:人类画师, 插画师, 设计师统统活不下去了! 比如下面这张中国情侣的画作: 因为前段时间这个很火, 我跟着同样的prom ...
- 万字长文保姆级教你制作自己的多功能QQ机器人
转载请注明出处:小锋学长生活大爆炸(https://xfxuezhang.blog.csdn.net/) 若发现存在部分图片缺失,可以访问原文:万字长文保姆级教你制作自己的多功能QQ机器人 - 小锋学 ...
- 【强化学习实战-04】DQN和Double DQN保姆级教程(2):以MountainCar-v0
[强化学习实战-04]DQN和Double DQN保姆级教程(2):以MountainCar-v0 实战:用Double DQN求解MountainCar问题 MountainCar问题详解 Moun ...
- Unified Functional Testing(UFT)15.0.2入门保姆级教程(一),图文详解。QTP
UFT入门之侦测器(ObjectSpy)及录制第一个脚本 实验说明 1.Quick Test Pro(QTP)11.5后更名为Unified Functional Testing(UFT) 2. 实验 ...
最新文章
- 史上最全数据结构算法之递归系列学习,建议收藏!
- jeasyui控件事件和方法的使用方法
- TSVD截断奇异值分解
- 最新出炉|也许你该看看这份的模型数据
- ebook site
- ActiveMQ发布订阅模式
- 百度编辑器 ueditor .net开发
- Linux设备驱动——驱动模型
- 【面试招聘】我的秋招记录——(自然语言处理-面经+感悟)
- Mbps和MB/s之间的换算
- 2023杭州电子科技大学计算机考研信息汇总
- javaweb问题集锦: HikariPool-1 - Connection is not available, request timed out after 60001ms.
- 作文组装计算机,组装电脑作文200字
- ACM 木材加工问题
- Cocos2dx和Unity3D对比
- Python爬虫 | 爬虫基础入门看这一篇就够了
- 永远闪亮,网的眼睛 (转)
- Linux: meld 对比工具的安装和使用
- database/sql
- 与 vmx86 驱动程序的版本不匹配解决方法
热门文章
- 用户使用计算机首要考虑因素,工业设计心理学试题(新整理有答案参考)
- java uml建模工具 apk,UML建模工具(Astah Professional)
- Winlogon、LSASS、Userinit
- 在Win10 系统中安装VS 2008
- m115b linux 驱动下载,富士施乐m115b打印机驱动
- Openstack 虚拟机通讯
- python bin文件转换成txt文件
- 安装软件时“应用程序无法启动,因为应用程序的并行配置不正确......”
- Ubuntu15安装RabbitVCS(SVN)客户端
- chm 打不开 解决办法