打印
[技术讨论]

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

[复制链接]
449|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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[3];
    cmd[0] = 0xA3;
    cmd[1] = start_row&0x3F;
    cmd[2] = 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[10];
    uint8_t cmdlen = 0;
    if(option == YUYY_OLED_SSD1315_SCROLL_STOP)
    {
        cmd[0] = 0x2E;
        cmdlen = 1;
    }
    else if(option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_RIGHT || option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT)
    {
        cmd[0] = 0x26;
        if(option == YUYY_OLED_SSD1315_SCROLL_HORIZONTAL_LEFT)
            cmd[0] = 0x27;
        cmd[1] = 0x00;
        cmd[2] = start_page&0x07;
        cmd[3] = interval&0x07;
        cmd[4] = end_page&0x07;
        cmd[5] = start_column&0x7F;
        cmd[6] = end_column&0x7F;
        cmd[7] = 0x2F;
        cmdlen = 8;
    }
    else
    {
        cmd[0] = 0x29;
        if(option == YUYY_OLED_SSD1315_SCROLL_VERTICAL_HORIZONTAL_LEFT)
            cmd[0] = 0x2A;
        cmd[1] = 0x01;
        if(option == YUYY_OLED_SSD1315_SCROLL_VERTICAL)
            cmd[1] = 0x00;
        cmd[2] = start_page&0x07;
        cmd[3] = interval&0x07;
        cmd[4] = end_page&0x07;
        cmd[5] = vertical_offset&0x3F;
        cmd[6] = start_column&0x7F;
        cmd[7] = end_column&0x7F;
        cmd[8] = 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规格书

使用特权

评论回复
5
arima| | 2025-8-2 22:58 | 只看该作者
我也有个这样的oled屏,试试看效果。。。

使用特权

评论回复
6
zzele| | 2025-8-3 08:12 | 只看该作者
挺炫的,很多时候都不知道还能这么玩

使用特权

评论回复
7
lvyunhua| | 2025-8-3 08:51 | 只看该作者
路过学习了

使用特权

评论回复
8
龙猫王子| | 2025-8-3 14:53 | 只看该作者
学习下,虽说自己不做这块的

使用特权

评论回复
9
chineseboyzxy| | 2025-8-4 08:40 | 只看该作者
这么高级吗,用12864的显示屏都是要自己写程序滚动的,非常麻烦。

使用特权

评论回复
10
yuyy1989|  楼主 | 2025-8-4 13:37 | 只看该作者
chineseboyzxy 发表于 2025-8-4 08:40
这么高级吗,用12864的显示屏都是要自己写程序滚动的,非常麻烦。

看控制芯片的手册,有些就没有这些效果

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

160

主题

810

帖子

10

粉丝