社区导航

 
查看: 696|回复: 2

[原创] OLED学习小结

[复制链接]

847

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-10-21 10:01:13 | 显示全部楼层 |阅读模式
本帖最后由 懒猫爱飞 于 2018-10-21 10:10 编辑

这两天从朋友那搞到一块OLED显示屏,是0.96寸,128*64像素,顺便玩了一下,做一下小结

1)  关于OLED 用的是0.96’的,驱动IC是SSD1306
2)  取模软件用的是“字模提取 V2.1 CopyLeft By Horse2000”,如下所示:

001.png

图1 软件界面

       001.png
      
2
取模方式,用的是
C51
取模
      关于这个取模方式,简单的说一下,以方便编写驱动程序
    下面结合示例进行说明:
      001.png
图316*16图像纵向取模方式
Ø 每8行为1页,P1,P2分别代表不同的Page
Ø 取模方式是纵向取模,字节倒序,所以先从P1页的第0列,从下到上取模,值为0x01
Ø 当P1页全部取完后,再从P2页的第0列开始取模,一直到P2页的第15列
Ø 如果字节没有倒序,则是从上到下取模,那么P1页第0列的值就变成了0x80
Ø 如果是横向取模,则是一行一行,从左到右取模,这里暂时先不举例
整个图像取完模的数据如下所示:
/*--  调入了一幅图像:这是您新建的图像  --*/
/*--  宽度x高度=16x16  --*/
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
1)      关于描点的一些设想
Ø 假设MCU的RAM足够大,那么我们可以开辟一个1K的缓存,用以存储填写的OLED的数据,然后一块刷新到OLED中,例如:tBye oledGram[8][128];

我们设屏左上角为原点,如下图所示:
001.png
图4 屏显示布局示意图
Ø 假设A点的坐标为(X1,Y1),那么如果想点亮A点该如何做?
Ø 因为缓存数据已定义为128列,而我们前提是纵向取模,所以主要是找到Y点的位置,并点亮它
Ø 首先,找到Y点处于哪一页 --> yPage = Y / 8,因为每8行为一页,而纵向取模是按页来完成的。
其次找到Y点在该页的位置,就要用到求余运算yBit = Y%8
例如: Y = 25
yPage = 25 /8 = 3,即该点处于第4页(底层驱动是从0开始计数的),
yBit = 25 % 8= 1, 即该点处于第4页第2行(底层驱动是从0开始计数的)
Ø 找到了Y点的具体位置,那么我们就可以对该点进行操作,
例如:定义数据缓存为tByeoledGram[8][128];
      #define  BV(N)      (1<<(N))     // 位移操作
oledGram[yPage][X] |= BV(yBit); // 显示该位
如果要反显,则将该bit位清除:
oledGram[yPage][X] &= ~BV(yBit); // 清除该位
Ø 至此我们可以把描点的函数写出来,如下所示:
#define  OLED_XPIXEL_MAX             (128)
#define OLED_YPIXEL_MAX             (64)
#defineOLED_YPAGE_MAX            (OLED_YPIXEL_MAX/8)

typedef tByte unsigned char;
typedeftWorldunsigned short;

typedefenumdisModeDef_t{
REVERSE_DISPLAY= 0, // 反显
                NORMAL_DISPLAY,   // 正常显示
} disModeDef_T;

      // 绘制单个像素点,不改变其它位置数据
voidoled_draw_point(tByte xPixel, tByte yPixel,disModeDef_Tmode)
{
tByte yPage = 0,
tByte yBit = 0;
// 如果超出范围,则直接返回,也可以带返回类型,可以返回错误代码
  If((xPixel>=  OLED_XPIXEL_MAX  )||(yPixel>= OLED_YPIXEL_MAX))
                              return;

yPage = yPixel / 8;
    yBit = yPixel % 8;
if(NORMAL_DISPLAY== mode)
                oledGram[yPage][xPixel]|= BV(yBit);  //显示该位
else
oledGram[yPage][xPixel] &=~BV(yBit);  //清除该位

   oled_update_gram();  // 更新OLED数据
}
注意:上面的函数是在word打出来的,还未经实践验证,本文档只讨论理论实现方法。

关于画线

  点动成线,线动成面。关于画线的方法,在计算机图形学中已给出了几个方法,今天先不在此总结,回头有空再总结。
  下面先附上画线的相关理论知识   1) 几款取模软件
          image2lcd32.zip (732.7 KB, 下载次数: 0)
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: 422240210


回复

使用道具 举报

3287

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-10-22 10:37:51 | 显示全部楼层
本帖最后由 ljj3166 于 2018-10-22 12:06 编辑

老板,您学的是SSD1306 GRAM
不是OLED

点评

是的,驱动IC是SSD1306  详情 回复 发表于 2018-10-23 08:18
So what......


回复

使用道具 举报

847

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-10-23 08:18:13 | 显示全部楼层
ljj3166 发表于 2018-10-22 10:37
老板,您学的是SSD1306 GRAM
不是OLED

是的,驱动IC是SSD1306
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: 422240210


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-11-18 16:06 , Processed in 0.121868 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表