如何使用OLED实现滚动效果

以下文章来源于:公_众_号开源电子网
读取更多技术文章,请扫码关注
在这里插入图片描述

如何使用OLED实现滚动效果

前言

这篇文章不过多描述OLED工作原理及驱动过程,仅从实用性出发,如何使用OLED实现滚动效果。这里我们以正点原子战舰板OLED实验例程为基础。
对于OLED屏幕的显示效果,很多小伙伴都会使用滚动方式。实现滚动显示可以通过软件实现和硬件实现。软件上的操作:在MCU上创建一个双缓存,这个对于小内存MCU极其不友好。硬件实现得看模块是否支持,所以我们可以通过查看器件手册获得答案。
很多时候,我们可以从器件手册的FEATURES小节可以知道支不支持硬件滚动。FEATURES小节主要介绍产品的主要特征,如果产品有某些比较优异的功能也会在这里着重介绍。SSD1306器件手册中FEATURES描述,如下图所示。
在这里插入图片描述

scroll? 滚动? 很明显,看到的是支持水平滚动和垂直滚动。那器件手册必定会有滚动相关描述,看一下目录就知道。
在这里插入图片描述

OLED支持水平滚动、垂直并水平滚动两种效果。

接下来的事情就是开干!!!
这里的内容分为两部分:① 实现水平滚动 ② 实现垂直水平滚动

实现水平滚动

在这里插入图片描述

先看手册中对水平滚动设置的描述。

该命令由连续的字节组成,用于设置水平滚动参数和决定滚动的起始页、终止页和滚动速度。并且在使用该命令时,必须先发送2Eh命令停止滚动。否则,GRAM内容有可能被破坏。SSD1306水平滚动设计为128列滚动。
滚动效果如下图,一列一列进行移动。
在这里插入图片描述

还有一个demo,如下图:
在这里插入图片描述

我们按照Sample code进行操作成功实现了滚动效果,但是并不知道具体参数含义,那该怎么做?但是我们是知道用26h/27h命令去实现的,按正常手册并定会有命令说明。
大家可以从手册第9章命名看到COMMAND TABLE。跳转到该页并开始搜寻26h/27h命令。
在这里插入图片描述

看到这个表,我们就可以知道刚才那个Sample code中那些数据的含义了。
第一个字节是26h/27h,26h:向右进行水平滚动;27h:向左进行水平滚动
第二个字节是空字节,建议发送00即可
第三个字节设置水平滚动的起始页地址,页0 ~页7。
第四个字节设置滚动步长时间间隔,帧为单位。
第五个字节设置水平滚动的终止页地址,页0 ~页7(终止页地址必须要比起始页地址要大)
第六个字节是空字节,建议发送00即可
第七个字节是空字节,建议发送FF即可
注意:设置滚动前,必须先发送2Eh命令停止滚动。
知道了这些连续字节的含义,那就可以写水平滚动代码了。

/**
 * @brief   		OLED水平滚动显示
 * @param   		start_page  : PAGE0~PAGE7
 * @param       	end_page  :  PAGE0~PAGE7    (end_page必须大于start_page)
 * @param       	frame  : 0~7
 * @param       	dir  : 0 右滚   1 左滚
 * @retval      	无
 */
void oled_hor_scroll(enum  page_num start_page, enum  page_num end_page, enum roll_frame frame, uint8_t dir)
{
    OLED_WR_Byte(0x2E, OLED_CMD);	/* 停止滚动 调用后,RAM数据需要重新写入 */
    
    OLED_WR_Byte(dir ? 0x26 : 0x27, OLED_CMD);	/* 0,向右滚动 1,向左移动 */
    OLED_WR_Byte(0x00, OLED_CMD);            		/* 发送空字节 设置为0x00即可 */
    OLED_WR_Byte(start_page & 0x07, OLED_CMD);	/* 起始页地址 */
    OLED_WR_Byte(frame & 0x07, OLED_CMD); 		/* 设置滚动步长时间间隔,帧为单位 */
    OLED_WR_Byte(end_page & 0x07, OLED_CMD);	/* 终止页地址 */

    OLED_WR_Byte(0x00, OLED_CMD);   /* 发送空字节 设置为0x00即可 */
    OLED_WR_Byte(0xFF, OLED_CMD);   /* 发送空字节 设置为0xFF即可 */
    OLED_WR_Byte(0x2F, OLED_CMD);   /* 启动滚动 禁止对RAM访问,改变水平滚动配置 */
}
这里的页地址和滚动的时间间隔使用了枚举方式,在oled.h文件中进行定义。
enum roll_frame
{
    FRAME_5,
    FRAME_64,
    FRAME_128,
    FRAME_256,
    FRAME_3,
    FRAME_4,
    FRAME_25,
    FRAME_2,
};

enum page_num
{
    PAGE0,
    PAGE1,
    PAGE2,
    PAGE3,
    PAGE4,
    PAGE5,
    PAGE6,
    PAGE7,
};
在上一篇OLED显示图片的工程中main函数中调用

oled_hor_scroll(PAGE0, PAGE7, FRAME_5, 1);
滚动效果如下:
在这里插入图片描述

大家可以尝试传入不同参数测试一下效果。

实现垂直水平滚动
从前面的目录也知道,使用到的命令是29h/2Ah,有了前面水平滚动的驱动流程,这里我们就可以很轻松的看着垂直滚动命令表,编写函数。
在这里插入图片描述
每一个字节的含义,我们可以通过函数的注释进行查看。

/**
 * @brief       OLED垂直滚动显示
 * @param       start_page  : PAGE0~PAGE7
 * @param       end_page    :  PAGE0~PAGE7    (end_page必须大于start_page)
 * @param       frame  : 0~7
 * @param       scroll_off  : 0~63
 * @param       dir  : 0 垂直且右水平滚动   1 垂直且左水平滚动
 * @retval      无
 */
void oled_ver_scroll(enum  page_num start_page, enum  page_num end_page, enum roll_frame frame, uint8_t scroll_offset, uint8_t dir)
{
    OLED_WR_Byte(0x2E, OLED_CMD);  	/* 停止滚动 调用后,RAM数据需要重新写入 */
    
    OLED_WR_Byte(dir ? 0x29 : 0x2A, OLED_CMD);	/* 0垂直向右滚动 1垂直向左移动 */
    OLED_WR_Byte(0x00, OLED_CMD);            		/* 发送空字节 设置为0x00即可 */
    OLED_WR_Byte(start_page & 0x07, OLED_CMD);	/* 起始页地址 */
    OLED_WR_Byte(frame & 0x07, OLED_CMD);    	/* 设置滚动步长时间间隔,帧为单位 */
    OLED_WR_Byte(end_page & 0x07, OLED_CMD); 	/* 终止页地址 */

    OLED_WR_Byte(scroll_offset, OLED_CMD);   	/* 垂直滚动偏移 */
    OLED_WR_Byte(0x2F, OLED_CMD);	/* 启动滚动 禁止对RAM访问,改变水平滚动配置 */
}

在上一篇OLED显示图片的工程中main函数中调用
oled_ver_scroll(PAGE0, PAGE7, FRAME_5, 1, 1);
滚动效果如下:
在这里插入图片描述

大家可以尝试传入不同参数测试一下效果。

复制链接,打开浏览器下载工程文件。
链接:https://pan.baidu.com/s/1akQjF_gKLmp36XC8Rsvb0A
提取码:1pot

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值