社区导航

 

搜索
查看: 419|回复: 12

[原创] OLED显示驱动

[复制链接]

9813

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2020-1-27 19:10 | 显示全部楼层 |阅读模式

将OLED驱动完善了一下,可以支持多种字体显示,目前支持:

  • 6x8
  • 8x16
  • 12x24
  • 16x32

 

image.png

驱动程序:

游客,如果您要查看本帖隐藏内容请回复


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

评分

1

查看全部评分



回复

使用道具 举报

9813

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2020-1-27 19:10 | 显示全部楼层

 Demo

from machine import I2C, Pin
from oled import OLED12864_I2C

i2c = I2C(-1, scl = Pin(27, pull = Pin.PULL_UP), sda = Pin(13, pull = Pin.PULL_UP))

oled = OLED12864_I2C(i2c)
oled.text(0, 0, '0123456789')
oled.Font('Font_8x16')
oled.text(0, 1, '0123456789')
oled.Font('Font_12x24')
oled.text(0, 3, '0123456789')

 



回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-2-2 15:09 | 显示全部楼层

各路大神各显神通



回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-2-4 16:44 | 显示全部楼层

谢谢,特意注册来看看

点评

欢迎一起学习交流  详情 回复 发表于 2020-2-4 18:28


回复

使用道具 举报

9813

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2020-2-4 18:28 | 显示全部楼层
stategrid 发表于 2020-2-4 16:44 谢谢,特意注册来看看

欢迎一起学习交流



回复

使用道具 举报

10

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-2-4 19:02 | 显示全部楼层

好东西就得收藏



回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-2-4 23:49 | 显示全部楼层

OLED显示驱动 [修改]



回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-2-5 01:17 | 显示全部楼层

好东西就得學習收藏



回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-2-8 04:58 | 显示全部楼层

对代码的一些解析,我是菜鸟加外行,请大家指教

首先这个屏幕分辨率是128*64,点阵显示方式从def text_6x8看是从左到右,横坐标扫描到128后就转下一行的起点即x=0,y+1.

x > 120而不是 x > 126,我认为是为了避免超出范围?

然后这些显示屏的显示方式是开辟一个缓冲区,有些是在显示屏的控制器,有些是mcu的内存,还有些是两者都有。缓冲区的大小和屏幕一样128*64,即对应屏幕每个点。

通过改写缓冲区,把改写结果送到硬件接口,就可以显示字符。

接下来就是从font里寻找对应的字符位置,看要改写那些内容。这部分代码看不明白

    def char_6x8(self, x=0, y=0, ch=32, c=1):
        try:
            ind = x + y * 128 + 1
            n = (min(127, max(ord(ch), 32)) -32)*5
            for i in range(5):
                screen[ind+i] = Font_6x8[n+i] if c else Font_6x8[n+i]^0xFF
            screen[ind+5] = 0 if c else 0xFF
            self.set_pos(x, y)
            self.i2c.writeto(self.ADDR, b'\x40' + screen[ind:ind + 6])
        except:
            return

   

def text_6x8(self, x=0, y=0, s='', c=1, wrap=0):
        for i in range(len(s)):
            self.char(x, y, s[i], c)
            x += 6
            if wrap and x > 120:
                x = 0
                y += 1

点评

使用i2c或spi方式时,因为不能读取oled内部缓存数据,所以需要在外部开一个128x64/8=1024字节的缓冲区。   因为字体不大,直接放入ram中,速度比较快。如果显示中文,字库较大,最好就放在flash中,或者  详情 回复 发表于 7 天前


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-2-14 21:39 | 显示全部楼层

看看这个好不好用



回复

使用道具 举报

9813

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2020-2-14 22:03 | 显示全部楼层
stategrid 发表于 2020-2-8 04:58 对代码的一些解析,我是菜鸟加外行,请大家指教 首先这个屏幕分辨率是128*64,点阵显示方式从def text_6 ...

使用i2c或spi方式时,因为不能读取oled内部缓存数据,所以需要在外部开一个128x64/8=1024字节的缓冲区。

 

因为字体不大,直接放入ram中,速度比较快。如果显示中文,字库较大,最好就放在flash中,或者用专用字库芯片。



回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-2-17 13:32 | 显示全部楼层

厉害了。学习一下



回复

使用道具 举报

1085

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2020-2-18 16:06 | 显示全部楼层

谢谢分享



回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2020-2-21 12:01 , Processed in 0.374025 second(s), 17 queries , Gzip On, MemCache On.

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