搜索
bottom↓
回复: 0

如何使用OLED实现滚动效果

[复制链接]

出0入234汤圆

发表于 2021-11-6 10:10:06 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2022-1-7 17:40 编辑

以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注

讨论发帖图.png



如何使用OLED实现滚动效果


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


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


          如何使用OLED实现滚动效果381.png


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


        接下来的事情就是开干!!!
        这里的内容分为两部分:① 实现水平滚动 ② 实现垂直水平滚动
        实现水平滚动
        先看手册中对水平滚动设置的描述。



          如何使用OLED实现滚动效果482.png


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



          如何使用OLED实现滚动效果608.png


       还有一个demo,如下图:



          如何使用OLED实现滚动效果625.png


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



          如何使用OLED实现滚动效果763.png


        看到这个表,我们就可以知道刚才那个Sample code中那些数据的含义了。
        第一个字节是26h/27h,26h:向右进行水平滚动;27h:向左进行水平滚动
        第二个字节是空字节,建议发送00即可
        第三个字节设置水平滚动的起始页地址,页0        ~页7。
        第四个字节设置滚动步长时间间隔,帧为单位。
        第五个字节设置水平滚动的终止页地址,页0        ~页7(终止页地址必须要比起始页地址要大)
        第六个字节是空字节,建议发送00即可
        第七个字节是空字节,建议发送FF即可
        注意:设置滚动前,必须先发送2Eh命令停止滚动。
        知道了这些连续字节的含义,那就可以写水平滚动代码了。
  1. <font size="4">/**</font>
  2. <font size="4"> * @brief                   OLED水平滚动显示</font>
  3. <font size="4"> * @param                   start_page  : PAGE0~PAGE7</font>
  4. <font size="4"> * @param               end_page  :  PAGE0~PAGE7    (end_page必须大于start_page)</font>
  5. <font size="4"> * @param               frame  : 0~7</font>
  6. <font size="4"> * @param               dir  : 0 右滚   1 左滚</font>
  7. <font size="4"> * @retval              无</font>
  8. <font size="4"> */</font>
  9. <font size="4">void oled_hor_scroll(enum  page_num start_page, enum  page_num end_page, enum roll_frame frame, uint8_t dir)</font>
  10. <font size="4">{</font>
  11. <font size="4">    OLED_WR_Byte(0x2E, OLED_CMD);        /* 停止滚动 调用后,RAM数据需要重新写入 */</font>
  12. <font size="4">    </font>
  13. <font size="4">    OLED_WR_Byte(dir ? 0x26 : 0x27, OLED_CMD);        /* 0,向右滚动 1,向左移动 */</font>
  14. <font size="4">    OLED_WR_Byte(0x00, OLED_CMD);                            /* 发送空字节 设置为0x00即可 */</font>
  15. <font size="4">    OLED_WR_Byte(start_page & 0x07, OLED_CMD);        /* 起始页地址 */</font>
  16. <font size="4">    OLED_WR_Byte(frame & 0x07, OLED_CMD);                 /* 设置滚动步长时间间隔,帧为单位 */</font>
  17. <font size="4">    OLED_WR_Byte(end_page & 0x07, OLED_CMD);        /* 终止页地址 */</font>

  18. <font size="4">    OLED_WR_Byte(0x00, OLED_CMD);   /* 发送空字节 设置为0x00即可 */</font>
  19. <font size="4">    OLED_WR_Byte(0xFF, OLED_CMD);   /* 发送空字节 设置为0xFF即可 */</font>
  20. <font size="4">    OLED_WR_Byte(0x2F, OLED_CMD);   /* 启动滚动 禁止对RAM访问,改变水平滚动配置 */</font>
  21. <font size="4">}</font>
复制代码

        这里的页地址和滚动的时间间隔使用了枚举方式,在oled.h文件中进行定义。
  1. <font size="4">enum roll_frame</font>
  2. <font size="4">{</font>
  3. <font size="4">    FRAME_5,</font>
  4. <font size="4">    FRAME_64,</font>
  5. <font size="4">    FRAME_128,</font>
  6. <font size="4">    FRAME_256,</font>
  7. <font size="4">    FRAME_3,</font>
  8. <font size="4">    FRAME_4,</font>
  9. <font size="4">    FRAME_25,</font>
  10. <font size="4">    FRAME_2,</font>
  11. <font size="4">};</font>

  12. <font size="4">enum page_num</font>
  13. <font size="4">{</font>
  14. <font size="4">    PAGE0,</font>
  15. <font size="4">    PAGE1,</font>
  16. <font size="4">    PAGE2,</font>
  17. <font size="4">    PAGE3,</font>
  18. <font size="4">    PAGE4,</font>
  19. <font size="4">    PAGE5,</font>
  20. <font size="4">    PAGE6,</font>
  21. <font size="4">    PAGE7,</font>
  22. <font size="4">};</font>
复制代码

        在上一篇OLED显示图片的工程中main函数中调用
  1. oled_hor_scroll(PAGE0, PAGE7, FRAME_5, 1);
复制代码

        滚动效果如下:



          如何使用OLED实现滚动效果2318.png


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

        实现垂直水平滚动
        从前面的目录也知道,使用到的命令是29h/2Ah,有了前面水平滚动的驱动流程,这里我们就可以很轻松的看着垂直滚动命令表,编写函数。



          如何使用OLED实现滚动效果2419.png


        每一个字节的含义,我们可以通过函数的注释进行查看。


  1. <font size="4">/**</font>
  2. <font size="4"> * @brief       OLED垂直滚动显示</font>
  3. <font size="4"> * @param       start_page  : PAGE0~PAGE7</font>
  4. <font size="4"> * @param       end_page    :  PAGE0~PAGE7    (end_page必须大于start_page)</font>
  5. <font size="4"> * @param       frame  : 0~7</font>
  6. <font size="4"> * @param       scroll_off  : 0~63</font>
  7. <font size="4"> * @param       dir  : 0 垂直且右水平滚动   1 垂直且左水平滚动</font>
  8. <font size="4"> * @retval      无</font>
  9. <font size="4"> */</font>
  10. <font size="4">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)</font>
  11. <font size="4">{</font>
  12. <font size="4">    OLED_WR_Byte(0x2E, OLED_CMD);          /* 停止滚动 调用后,RAM数据需要重新写入 */</font>
  13. <font size="4">    </font>
  14. <font size="4">    OLED_WR_Byte(dir ? 0x29 : 0x2A, OLED_CMD);        /* 0垂直向右滚动 1垂直向左移动 */</font>
  15. <font size="4">    OLED_WR_Byte(0x00, OLED_CMD);                            /* 发送空字节 设置为0x00即可 */</font>
  16. <font size="4">    OLED_WR_Byte(start_page & 0x07, OLED_CMD);        /* 起始页地址 */</font>
  17. <font size="4">    OLED_WR_Byte(frame & 0x07, OLED_CMD);            /* 设置滚动步长时间间隔,帧为单位 */</font>
  18. <font size="4">    OLED_WR_Byte(end_page & 0x07, OLED_CMD);         /* 终止页地址 */</font>

  19. <font size="4">    OLED_WR_Byte(scroll_offset, OLED_CMD);           /* 垂直滚动偏移 */</font>
  20. <font size="4">    OLED_WR_Byte(0x2F, OLED_CMD);        /* 启动滚动 禁止对RAM访问,改变水平滚动配置 */</font>
  21. <font size="4">}</font>
复制代码

        在上一篇OLED显示图片的工程中main函数中调用
  1. oled_ver_scroll(PAGE0, PAGE7, FRAME_5, 1, 1);
复制代码

        滚动效果如下:



          如何使用OLED实现滚动效果3461.png


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

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 21:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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