做为一个刚刚开始接触编程不久的白菜,最近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相关推荐

  1. Arduino+OLED基础保姆级教程(1)

    第一篇:先打好基础(基础篇->1) (一)先说两句 这个教程从0到1让你入门OLED:教程是系列课程包括:OLED上显示第一行字,显示数字,显示汉字到写个简单的OLED显示界面再到最后写个炫酷的 ...

  2. 【ESP32】15.OLED显示实验(SPI / 字模提取)

    上一篇: [ESP32]14.DHT11湿度传感器实验(DHT操作库) 前言: 先放电路连接图: OLED(有机发光二极管(Organic Light Emitting Diode)) 字模提取软件使 ...

  3. 保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

    前言 大家好,我是 @小曾同学,小伙伴们也可以叫我小曾- 如果你想实现一对一音视频通话和屏幕共享功能,不妨来看看这篇文章,保姆级教程,不需要从零实现,直接集成声网 SDK 即可轻松上手. 本文也分享了 ...

  4. 【保姆级教程】基于WordPress在阿里云服务器上搭建个人博客网站

    写之前先回答几个问题: 1,网上类似的教程非常多,为什么写这篇教程? 答:博客网站我搭建过好几次,但是每次搭建都需要再去网上搜教程:然而网上的教程坑很多,甚至有些是错误的,不能完美解决自己的问题,有时 ...

  5. arpspoof安装和5分钟基于linux-kali的arp攻击防御示例(保姆级图文)【网络工程】

    目录 温馨提示 安装arpspoof工具 进行arp攻击 arp防御简单测试 总结 欢迎关注 『网络工程专业』 系列,持续更新中 欢迎关注 『网络工程专业』 系列,持续更新中 温馨提示:对虚拟机做任何 ...

  6. 天才少年稚晖君 | 【保姆级教程】个人深度学习工作站配置指南

    天才少年稚晖君 | [保姆级教程]个人深度学习工作站配置指南 来源:https://zhuanlan.zhihu.com/p/336429888 0. 前言 工作原因一直想配置一台自己的深度学习工作站 ...

  7. 【Midjourney实操】逼真到颤抖!保姆级教程教生成效果炸裂的图片

    最近,许多由Midjourney V5创作的画作在网络上引起了热议,许多人惊呼:人类画师, 插画师, 设计师统统活不下去了! 比如下面这张中国情侣的画作: 因为前段时间这个很火, 我跟着同样的prom ...

  8. 万字长文保姆级教你制作自己的多功能QQ机器人

    转载请注明出处:小锋学长生活大爆炸(https://xfxuezhang.blog.csdn.net/) 若发现存在部分图片缺失,可以访问原文:万字长文保姆级教你制作自己的多功能QQ机器人 - 小锋学 ...

  9. 【强化学习实战-04】DQN和Double DQN保姆级教程(2):以MountainCar-v0

    [强化学习实战-04]DQN和Double DQN保姆级教程(2):以MountainCar-v0 实战:用Double DQN求解MountainCar问题 MountainCar问题详解 Moun ...

  10. Unified Functional Testing(UFT)15.0.2入门保姆级教程(一),图文详解。QTP

    UFT入门之侦测器(ObjectSpy)及录制第一个脚本 实验说明 1.Quick Test Pro(QTP)11.5后更名为Unified Functional Testing(UFT) 2. 实验 ...

最新文章

  1. 史上最全数据结构算法之递归系列学习,建议收藏!
  2. jeasyui控件事件和方法的使用方法
  3. TSVD截断奇异值分解
  4. 最新出炉|也许你该看看这份的模型数据
  5. ebook site
  6. ActiveMQ发布订阅模式
  7. 百度编辑器 ueditor .net开发
  8. Linux设备驱动——驱动模型
  9. 【面试招聘】我的秋招记录——(自然语言处理-面经+感悟)
  10. Mbps和MB/s之间的换算
  11. 2023杭州电子科技大学计算机考研信息汇总
  12. javaweb问题集锦: HikariPool-1 - Connection is not available, request timed out after 60001ms.
  13. 作文组装计算机,组装电脑作文200字
  14. ACM 木材加工问题
  15. Cocos2dx和Unity3D对比
  16. Python爬虫 | 爬虫基础入门看这一篇就够了
  17. 永远闪亮,网的眼睛 (转)
  18. Linux: meld 对比工具的安装和使用
  19. database/sql
  20. 与 vmx86 驱动程序的版本不匹配解决方法

热门文章

  1. 用户使用计算机首要考虑因素,工业设计心理学试题(新整理有答案参考)
  2. java uml建模工具 apk,UML建模工具(Astah Professional)
  3. Winlogon、LSASS、Userinit
  4. 在Win10 系统中安装VS 2008
  5. m115b linux 驱动下载,富士施乐m115b打印机驱动
  6. Openstack 虚拟机通讯
  7. python bin文件转换成txt文件
  8. 安装软件时“应用程序无法启动,因为应用程序的并行配置不正确......”
  9. Ubuntu15安装RabbitVCS(SVN)客户端
  10. chm 打不开 解决办法