在Abrobot ESP32C3 OLED上编译运行Zephyr CFB (Character Frame Buffer),解析字体显示原理

上一篇大概介绍了一下如何使用shield使用Abrobot ESP32C3的OLED屏幕。

在Abrobot ESP32C3 OLED上编译运行Zephyr RTOS,并使用OLED显示图像-优快云博客

这一篇文章大概介绍一下zephyr的CFB(Character Frame Buffer)以及讲解一下zephyr上CFB的sample。 

在讲CFB之前,首先讲一下OLED的显示原理

这里我们用Abrobot的SSD1106的主控为例。SSD1106的主控datasheet在这里下载。https://cdn.velleman.eu/downloads/29/infosheets/sh1106_datasheet.pdf

1106定义了一块Display Data RAM,用户通过command给1106发送数据修改display ram的内容来修改屏幕上的显示。具体display ram的定义如下。

Abrobot的OLED分辨率是72x40。72是宽度,也就是下图的column。40是高度,也就是下图的COM。每8个COM是一个page。

高度40,所以一共是page 0 到page 4。

宽度72,实际OLED从column30开始显示,所以是col 30到col 101。

所以在显示之前,需要告诉1106主控写入数据的page号和col号,然后写入相应的数据,最后刷新一下,然后1106就会把数据显示到OLED屏幕。

讲完OLED的display ram结构,再看一下CFB的字体原理

Zephyr的CFB默认支持三种字体,定义在“cfb_fonts.c”中。第一个分辨率最低,10x16,也就是宽度10,高度16. 每种字体包含一组ASCII吗,从CFB_FONTS_FIRST_CHAR (32)到CFB_FONTS_LAST_CHAR(126),也就是所有可打印字符。

比如“#”的显示数据如下,bit == 1代表像素点亮,bit == 0 代表像素黑。每个byte代表一个column的一个page。 因为“#”宽度是10,高度是16。假设首先发送写入地址是column 30,page 0,然后依次写入第一列数据0x00, 0x00, 0x40, 0xe0...0x40,0x00 10个byte到page0,column30到39。然后写入地质column 30, page 1,写入第二列数据。

这样,一个完整的CFB字符就写入了display ram。

编译CFB sample

使用“west build -p auto -b esp32c3_042_oled --shield abrobot_sh1106_72x40 samples/subsys/display/cfb”编译default CFB

main函数主要做了下面几件事

        cfb_framebuffer_init  // 得到oled的width and hieght, 分配72x5 byte的display buffer

        cfb_framebuffer_clear  // 将oled的display ram全部清0,屏幕就变成了全黑

        cfb_framebuffer_set_font  // 使用10x16的CFB字体

        while (1) {  // 每次把x和y左边增加1,也就是从左上角往右下角移动

                for (int i = 0; i < MIN(x_res, y_res); i++) {

                        cfb_framebuffer_clear  // 清除当前oled的display ram

                        cfb_print(dev,  "0123456789", i, i)  // 更新display buffer, 在i,i的位置显示字符串

                        cfb_framebuffer_finalize  // 讲display buffer写入对应的display ram中,刷新oled

                }

        }

因为abrobot的oled分辨率有限,只能显示到4,后面的字符就换了一行。能看到字符串在慢慢的移动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值