[技术讨论] 【每周分享】OLED屏幕自带的滚屏效果

[复制链接]
 楼主| yuyy1989 发表于 2025-8-2 09:15 | 显示全部楼层 |阅读模式
本帖最后由 yuyy1989 于 2025-8-2 20:00 编辑

最近在翻OLED控制器的手册时发现,这个控制器还支持滚动功能,这么好玩的功能当然要加入到我的OLED驱动里
关于OLED的驱动过程可以看这篇https://bbs.21ic.com/icview-3338910-1-1.html,这次只介绍滚动效果的实现
我用的OLED的主控是SSD1315,在手册里涉及到滚动的命令有这几个
持续横向滚动

参数说明:
X0:0向右滚动,1,向左滚动
B2B1B0:滚动的起始页(每页8行)
C2C1C0:每次滚动的时间间隔
D2D1D0:滚动的结束页,这页的内容也会滚动
E6-E0:滚动的起始列
F6-F0:滚动的结束列,这列的内容也会滚动

持续竖向横向滚动

参数说明:
X1X0:1向右滚动,2,向左滚动
A0:0横向不滚动,1横向滚动
B2B1B0:滚动的起始页(每页8行)
C2C1C0:每次滚动的时间间隔
D2D1D0:滚动的结束页,这页的内容也会滚动
E5-E0:每次竖向滚动的行数
E6-F0:滚动的起始列
G6-G0:滚动的结束列,这列的内容也会滚动
需要说明的是其中的起始页结束页,起始列结束列只对横向滚动生效,想要限制竖向滚动的范围需要下面这个命令

设置竖向滚动区域

参数说明:
A5-A0:滚动的起始行,0~63
B6-B0:滚动的行数,1~64
上面的滚动参数设置完后需要发送下面的滚动开始或停止命令

还有一个滚动命令

和持续横向滚动的命令类似,只不过是发送一次命令横向滚动1列
代码实现持续横向滚动和持续竖向横向滚动
  1. typedef enum
  2. {
  3.     YUYY_OLED_SSD1315_SCROLL_STOP = 0,
  4.     YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT,
  5.     YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT,
  6.     YUYY_OLED_SSD1315_SCROLL_VERTICAL,
  7.     YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_RIGHT,
  8.     YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_LEFT,
  9. }YUYY_OLED_SSD1315_ScrollType;

  10. typedef enum
  11. {
  12.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_6FRAMES = 0,
  13.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_32FRAMES,
  14.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_64FRAMES,
  15.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_128FRAMES,
  16.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_3FRAMES,
  17.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_4FRAMES,
  18.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,
  19.     YUYY_OLED_SSD1315_SCROLL_INTERVAL_2FRAMES,
  20. }YUYY_OLED_SSD1315_ScrollInterval_Type;

  21. void YUYY_OLED_SSD1315_SetVerticalScrollRows(YUYY_OLED_SSD1315_DEV_Type *dev,uint8_t start_row,uint8_t rows)
  22. {
  23.     uint8_t cmd[3];
  24.     cmd[0] = 0xA3;
  25.     cmd[1] = start_row&0x3F;
  26.     cmd[2] = rows&0x7F;
  27.     YUYY_OLED_SSD1315_SendCmds(dev,cmd,3);
  28. }

  29. void YUYY_OLED_SSD1315_ContinuousScroll(YUYY_OLED_SSD1315_DEV_Type *dev,YUYY_OLED_SSD1315_ScrollType option,uint8_t vertical_offset,YUYY_OLED_SSD1315_ScrollInterval_Type interval,uint8_t start_page,uint8_t end_page,uint8_t start_column,uint8_t end_column)
  30. {
  31.     uint8_t cmd[10];
  32.     uint8_t cmdlen = 0;
  33.     if(option == YUYY_OLED_SSD1315_SCROLL_STOP)
  34.     {
  35.         cmd[0] = 0x2E;
  36.         cmdlen = 1;
  37.     }
  38.     else if(option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT || option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT)
  39.     {
  40.         cmd[0] = 0x26;
  41.         if(option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT)
  42.             cmd[0] = 0x27;
  43.         cmd[1] = 0x00;
  44.         cmd[2] = start_page&0x07;
  45.         cmd[3] = interval&0x07;
  46.         cmd[4] = end_page&0x07;
  47.         cmd[5] = start_column&0x7F;
  48.         cmd[6] = end_column&0x7F;
  49.         cmd[7] = 0x2F;
  50.         cmdlen = 8;
  51.     }
  52.     else
  53.     {
  54.         cmd[0] = 0x29;
  55.         if(option == YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_LEFT)
  56.             cmd[0] = 0x2A;
  57.         cmd[1] = 0x01;
  58.         if(option == YUYY_OLED_SSD1315_SCROLL_VERTICAL)
  59.             cmd[1] = 0x00;
  60.         cmd[2] = start_page&0x07;
  61.         cmd[3] = interval&0x07;
  62.         cmd[4] = end_page&0x07;
  63.         cmd[5] = vertical_offset&0x3F;
  64.         cmd[6] = start_column&0x7F;
  65.         cmd[7] = end_column&0x7F;
  66.         cmd[8] = 0x2F;
  67.         cmdlen = 9;
  68.     }
  69.     YUYY_OLED_SSD1315_SendCmds(dev,cmd,cmdlen);
  70. }
全屏向右滚动
  1. YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT,0,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,0,7,0,127);


部分向左滚动
  1. YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT,0,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,2,5,24,55);


全屏竖向滚动
  1. YUYY_OLED_SSD1315_SetVerticalScrollRows(&oled,0,64);
  2. YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_VERTICAL,1,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,0,7,0,127);


部分竖向滚动
  1. YUYY_OLED_SSD1315_SetVerticalScrollRows(&oled,16,32);
  2. YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_VERTICAL,1,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,0,7,0,127);


全屏竖向同时向右滚动
  1. YUYY_OLED_SSD1315_SetVerticalScrollRows(&oled,0,64);
  2. YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_RIGHT,1,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,0,7,0,127);


部分竖向同时部分向左滚动
  1. YUYY_OLED_SSD1315_SetVerticalScrollRows(&oled,16,32);
  2. YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_LEFT,1,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,2,5,24,55);





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
地瓜patch 发表于 2025-8-2 17:25 来自手机 | 显示全部楼层
牛,酷炫
coody 发表于 2025-8-2 19:27 | 显示全部楼层
牛,看来要多研究手册
trucyw 发表于 2025-8-2 20:22 | 显示全部楼层
看来要多研究IC规格书
arima 发表于 2025-8-2 22:58 | 显示全部楼层
我也有个这样的oled屏,试试看效果。。。
zzele 发表于 2025-8-3 08:12 | 显示全部楼层
挺炫的,很多时候都不知道还能这么玩
lvyunhua 发表于 2025-8-3 08:51 | 显示全部楼层
路过学习了
龙猫王子 发表于 2025-8-3 14:53 | 显示全部楼层
学习下,虽说自己不做这块的
chineseboyzxy 发表于 2025-8-4 08:40 | 显示全部楼层
这么高级吗,用12864的显示屏都是要自己写程序滚动的,非常麻烦。
 楼主| yuyy1989 发表于 2025-8-4 13:37 | 显示全部楼层
chineseboyzxy 发表于 2025-8-4 08:40
这么高级吗,用12864的显示屏都是要自己写程序滚动的,非常麻烦。

看控制芯片的手册,有些就没有这些效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部