yuyy1989 发表于 2025-8-2 09:15

【每周分享】OLED屏幕自带的滚屏效果

本帖最后由 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列
代码实现持续横向滚动和持续竖向横向滚动
typedef enum
{
    YUYY_OLED_SSD1315_SCROLL_STOP = 0,
    YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT,
    YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT,
    YUYY_OLED_SSD1315_SCROLL_VERTICAL,
    YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_RIGHT,
    YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_LEFT,
}YUYY_OLED_SSD1315_ScrollType;

typedef enum
{
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_6FRAMES = 0,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_32FRAMES,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_64FRAMES,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_128FRAMES,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_3FRAMES,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_4FRAMES,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,
    YUYY_OLED_SSD1315_SCROLL_INTERVAL_2FRAMES,
}YUYY_OLED_SSD1315_ScrollInterval_Type;

void YUYY_OLED_SSD1315_SetVerticalScrollRows(YUYY_OLED_SSD1315_DEV_Type *dev,uint8_t start_row,uint8_t rows)
{
    uint8_t cmd;
    cmd = 0xA3;
    cmd = start_row&0x3F;
    cmd = rows&0x7F;
    YUYY_OLED_SSD1315_SendCmds(dev,cmd,3);
}

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)
{
    uint8_t cmd;
    uint8_t cmdlen = 0;
    if(option == YUYY_OLED_SSD1315_SCROLL_STOP)
    {
      cmd = 0x2E;
      cmdlen = 1;
    }
    else if(option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT || option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT)
    {
      cmd = 0x26;
      if(option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT)
            cmd = 0x27;
      cmd = 0x00;
      cmd = start_page&0x07;
      cmd = interval&0x07;
      cmd = end_page&0x07;
      cmd = start_column&0x7F;
      cmd = end_column&0x7F;
      cmd = 0x2F;
      cmdlen = 8;
    }
    else
    {
      cmd = 0x29;
      if(option == YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_LEFT)
            cmd = 0x2A;
      cmd = 0x01;
      if(option == YUYY_OLED_SSD1315_SCROLL_VERTICAL)
            cmd = 0x00;
      cmd = start_page&0x07;
      cmd = interval&0x07;
      cmd = end_page&0x07;
      cmd = vertical_offset&0x3F;
      cmd = start_column&0x7F;
      cmd = end_column&0x7F;
      cmd = 0x2F;
      cmdlen = 9;
    }
    YUYY_OLED_SSD1315_SendCmds(dev,cmd,cmdlen);
}全屏向右滚动
YUYY_OLED_SSD1315_ContinuousScroll(&oled,YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT,0,YUYY_OLED_SSD1315_SCROLL_INTERVAL_5FRAMES,0,7,0,127);

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

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

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

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

部分竖向同时部分向左滚动
YUYY_OLED_SSD1315_SetVerticalScrollRows(&oled,16,32);
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的显示屏都是要自己写程序滚动的,非常麻烦。
页: [1]
查看完整版本: 【每周分享】OLED屏幕自带的滚屏效果