10873|2

1372

帖子

6

TA的资源

版主

楼主
 

OLED学习小结 [复制链接]

本帖最后由 懒猫爱飞 于 2018-10-21 10:10 编辑

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

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

图1 软件界面

      
      
2
取模方式,用的是
C51
取模
      关于这个取模方式,简单的说一下,以方便编写驱动程序
    下面结合示例进行说明:
     
图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];

我们设屏左上角为原点,如下图所示:
图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, 下载次数: 17)


pctolcd2002.rar (701.59 KB, 下载次数: 14)


字模软件2.rar (256.59 KB, 下载次数: 21)


   2) 计算机图形理论知识
          第3章_点阵图形的基本算法.pdf (8.26 MB, 下载次数: 28)

此内容由EEWORLD论坛网友懒猫爱飞原创,如需转载或用于商业用途需征得作者同意并注明出处





此帖出自单片机论坛

最新回复

本帖最后由 ljj3166 于 2018-10-22 12:06 编辑 老板,您学的是SSD1306 GRAM 不是OLED  详情 回复 发表于 2018-10-22 10:37
点赞 关注(1)
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
本帖最后由 ljj3166 于 2018-10-22 12:06 编辑

老板,您学的是SSD1306 GRAM
不是OLED
此帖出自单片机论坛

点评

是的,驱动IC是SSD1306  详情 回复 发表于 2018-10-23 08:18
 
个人签名

So TM what......?

 


回复

1372

帖子

6

TA的资源

版主

板凳
 
ljj3166 发表于 2018-10-22 10:37
老板,您学的是SSD1306 GRAM
不是OLED

是的,驱动IC是SSD1306
此帖出自单片机论坛
 
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表