OLED的字模提取(保姆级)---基于PCtoLCD2013

做为一个刚刚开始接触编程不久的白菜,最近OLED正在做一个信息显示,商家给我的例程里就是8X8,8X16两种字体的格式,我的屏幕是0.91寸的8X16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪自己学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,自己经验所得,有错请大家指出、勿喷。。

1.OLED屏幕驱动程序-功能

我用的OLED是这种IIC通讯-128X32的屏幕如图:
OLED屏
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图不咋会,别嫌弃,哈哈哈)
2
因为屏幕太小加上拍出来的效果忒差,我用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);

效果图为:

4
通过屏幕行为我们可以看出,一个有趣的现象(其实初始化开始时设置好的,屏幕手册可以查) 当我们设定了OLED_SetPos(初始位置)后、连续进行WriteDat操作时,屏幕就会每WriteDat次后x坐标就后+1、相当于OLED_SetPos(X,Y)X值自动+1一样,但是当你连续输入的次数超过屏幕的固定参数时,它不会自动换行 (我的屏幕是128x32:连续输入超过128次时,它就没有变化了)

清楚OLED屏幕行为后、可以进入正题了,OLED字模的提取!!!
字模的提取我是用的PCtoLCD2013软件进行提取的,佩服这位大佬,手动点1024个赞

3. PCtoLCD2013提取软件功能

1.设置中的配置
5
以我这块屏幕为例,通过上面的讲解和输出行为应该知道怎么选择、取模的走向,和取模的方式了吧、你的数据是怎么放出来显示的就选那种方式,取模方式:行列式的原因就是给了一个OLED_SetPos后,在给一个WriteDat就会显示一列数据下去,如果还不直观,贴心的软件作者做了动画,好好看看就理解了,我就不再多说了,第二个红色框框就是比较关键的取模的地方了,它的设置关系到编码最后生成的数组,下面会详细讲解绿色的是我感觉还不错的数组输出格式,数组生成后直接CV,如果你要用二维数组就另当别论了

2.字模提取界面
6
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]);

通过刚刚上面屏幕程序的了解,不用多说了,肯定看着难看而且特别小,根本认不出来
7

接下来改变一下 显示高度(= 点阵的高度/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
那怎么增加宽度呢
当然可以直接改(设置中是点阵大小为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次
9
PS:以上是我取模的思路,为了方便理解、说的有点死,也有其他方法,并且这个软件也可以提取图片的OLED显示,功能很强大,、可以自行探索

  • 18
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值