上一篇大概介绍了一下如何使用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,后面的字符就换了一行。能看到字符串在慢慢的移动。