找回密码
 立即注册
查看: 231|回复: 3

U8G2移植纪实,让AI8051U不仅能跑OLED12864

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2026-02-22 01:10:35
已绑定手机

7

主题

67

回帖

296

积分

中级会员

积分
296
发表于 2026-1-11 18:49:50 | 显示全部楼层 |阅读模式
相关帖子
在这里感谢上述帖子的版主开疆拓土,在我还没明白如何驱动的情况下率先提供了应用例。

稍微修改了一下源码,实现了STC8051U(AI8051U)驱动SH1108(中景园128×160)液晶屏的效果。以下为预览视频:
(若无法直接预览,可点击原视频链接在新窗口打开: https://v.stcai.com/sv/61c06001-19ba93d3ae8/61c06001-19ba93d3ae8.mp4


简述
由于研究时间相隔太久,1年前还在琢磨的U8G2现在开始使用的时候发现移植方法已经被忘得一干二净,真正用于独自使用的速查手册还不合格,再加上我这次有整活任务要动真格,所以加快了自己的开发速度。
先前凭借着自己的网络偶发能正常访问GitHub的特性,取得了原作者olikraus的新版本U8G2(发帖时原作更新到2025年11月10日版),这为我复制新函数打下基础,手里恰好存在三个模块,分别是SSD1322(Intel   8080接口)、SH1108(SPI接口带D/C)、GP1247AI(VFD,SPI接口不含D/C),都是这次重点攻坚的目标,恰好这三个显示屏模块都在新版本对应的库文件中,所以直接复制文件,再根据报错找办法就行。
移植办法
1.先根据自己的OLED固件信息,在新版本库文件中找到对应型号的OLED驱动函数。以本人成功驱动的SH1108为例,寻找情况如下:
 *在论坛版库函数找到了"u8g2_Setup_sh1108_160x160_f",但经过编程,存在部分内容被裁切的问题。
 *在新版库函数找到了"u8g2_Setup_sh1108_128x160_f",中景园的SH1108就是仅显示128×160的版本。
/* issue #1998, 128x160 OLED */

2.根据关键词,在工程将驱动文件放置在μVision工程中。
 我把“u8x8_d_sh1108.c”放进去了。
3.在u8g2_d_setup.c中寻找有没有对应的初始化函数,比如“void u8g2_Setup_sh1108_128x160_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)”,如果找到了,将后缀为1/2/f三个关键字的函数(可按需只拿一个)解除上下文的“#if 0",使其解除忽略。如果没有对应的初始化函数,从新文件复制。
  1. /* "u8g2_d_setup.c" */
  2. //上面有一个#if 0
  3. void u8g2_Setup_sh1107_i2c_seeed_128x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
  4. {……}
  5. #endif //将 if 0 导致的屏蔽从此处截断
  6. /* sh1108 160x160 Generic*/
  7. /* sh1108 1 */
  8. void u8g2_Setup_sh1108_160x160_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
  9. {……}
  10. /* sh1108  128x160 Generic*/
  11. /* sh1108 f */
  12. /* sh1108 128x160 I2C_Exclude_DorC*/
  13. /* sh1108 f */void u8g2_Setup_sh1108_i2c_128x160_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
  14. {
  15.   uint8_t tile_buf_height;
  16.   uint8_t *buf;
  17.   u8g2_SetupDisplay(u8g2, u8x8_d_sh1108_128x160, u8x8_cad_ssd13xx_i2c, byte_cb, gpio_and_delay_cb);
  18.   buf = u8g2_m_16_20_f(&tile_buf_height);
  19.   u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
  20. }
  21. #if 0 //补上被截断的if 0使得下面部分恢复屏蔽
复制代码
4.找到函数定义中名为“buf=”的关键词,检查等式后面的参数是否能在文件中找到,比如“u8g2_d_memory.c”中的“u8g2_m_16_20_1(&tile_buf_height)”,如果找到了,同样解除上下文的“ #if 0 ”,否则直接导入,导入后的函数原型可能是“uint8_t *u8g2_m_16_20_f(uint8_t *page_cnt);”
/* "u8g2_d_setup.c" */
buf = u8g2_m_16_20_f(&tile_buf_height);
  1. /* "u8g2_d_memory.c" */
  2. /* issue #1998, 128x160 OLED */
  3. uint8_t *u8g2_m_16_20_1(uint8_t *page_cnt)
  4. {……}
  5. uint8_t *u8g2_m_16_20_2(uint8_t *page_cnt)
  6. {……}
  7. uint8_t *u8g2_m_16_20_f(uint8_t *page_cnt)
  8. {
  9.   #ifdef U8G2_USE_DYNAMIC_ALLOC
  10.   *page_cnt = 20;
  11.   return 0;
  12.   #else
  13.   static uint8_t buf[2560];
  14.   *page_cnt = 20;
  15.   return buf;
  16.   #endif
  17. }
复制代码
5.提交修改后的工程文件进行全编译(Rebuild All Targets),如果存在L107错误(L107 Address Space Overflow),选择内存模型为Large或者换成后缀为“1/2”的分页模式。
Program Size: data=8.1 edata+hdata=256 xdata=8303 const=1003 code=25044

U8G2的GitHub页面写了将GRAM分配到外部指定空间的办法,可参考:“Using dynamically allocated page buffers


以下为我做好的工程文件: 2-STC32_U8G2_SPI_DMA_OLED-20260111.zip (22.08 MB, 下载次数: 0) (修改过第二次因为传错文件)
U8G2的2025年11月10号版官方库: u8g2-master-20251110.zip (84 MB, 下载次数: 5)








以凡夫俗子之躯,行弑神诛仙之举。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2026-03-14 22:35:44
已绑定手机

49

主题

2638

回帖

2856

积分

荣誉版主

积分
2856
发表于 2026-1-12 02:31:40 | 显示全部楼层
通过微信“文件传输助手”发送的视频文件无法在本论坛正常播放,怀疑是被压缩加工成不支持的格式了,建议使用QQ的文件传输或者微信中“发送原图”传输视频
~~~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:805
  • 最近打卡:2026-03-14 08:41:24
已绑定手机

25

主题

629

回帖

3941

积分

论坛元老

积分
3941
发表于 2026-1-12 08:26:54 | 显示全部楼层
厉害,整了个大活
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2026-02-22 01:10:35
已绑定手机

7

主题

67

回帖

296

积分

中级会员

积分
296
发表于 2026-1-12 22:07:37 | 显示全部楼层
晓*** 发表于 2026-1-12 02:31
通过微信“文件传输助手”发送的视频文件无法在本论坛正常播放,怀疑是被压缩加工成不支持的格式了,建议使 ...

Hmmm……我是通过安卓MTP传的视频,可能是没二压导致本地无法播放
以凡夫俗子之躯,行弑神诛仙之举。
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-14 22:43 , Processed in 0.577470 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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