0.96寸OLED(SSD1306)屏幕显示(三)——屏幕垂直水平滚动

news/2025/2/9 18:11:44/

0.96寸OLED(SSD1306)屏幕显示

(一)基础功能介绍

(二)超长文字水平滚动

(三)屏幕垂直水平滚动


文章目录

一、垂直水平滚动方法

1)SSD1306驱动芯片

2)SSD1315驱动芯片

二、垂直滚动方法

1)SSD1306驱动芯片

2)SSD1315驱动芯片

三、局部区域垂直水平滚动方法

1)SSD1306驱动芯片

2)SSD1315驱动芯片

四、详细部分代码

总结


前言

最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!当年做这些项目的时候可走了很多弯路,所以想着可以将它们上传到网络上,并通过我的讲解文章可以帮助你们少走一些弯路!

今天,我要分享的是一个0.96寸OLED(SSD1306)屏幕显示的学习笔记,因为我想要讲的详细一点,所以打算做成一个系列,手把手地教你学习和认识屏幕显示。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!


一、垂直水平滚动方法

1)SSD1306驱动芯片

对于垂直滚动方法,SSD1306数据手册也有详细的介绍,接下来我带大家一起来看看,如下图所示:

图 1 垂直水平滚动命令表
图 2 官方手册垂直水平滚动例子

 (SSD1306代码讲解部分)

OLED_Write_Cmd(0x2E);       // 先必须关闭滚动


OLED_Write_Cmd(0x29);        // 0x29是垂直水平向右滚动,0x2A是垂直水平向左滚动
OLED_Write_Cmd(0x00);        // 虚拟字节
    
OLED_Write_Cmd(0x00);        // 起始页 0
OLED_Write_Cmd(0x07);        // 滚动时间间隔
OLED_Write_Cmd(0x07);        // 终止页 7    
OLED_Write_Cmd(0x01);        // 垂直滚动偏移量

OLED_Write_Cmd(0x2F);        //开启滚动

 (程序效果图 )

 

2)SSD1315驱动芯片

但是有些小伙伴,可能用上面的代码无法让自己手中的显示屏滚动起来,这个问题曾经也困扰我很久,找寻了很多博客也没有对这个问题进行解释。于是,通过我查阅大量资料发现,淘宝上很多便宜的0.96寸OLED显示屏采用的都是SSD1315驱动芯片,并不是SSD1306驱动芯片,这是因为SSD1315驱动芯片更加便宜,虽然这两者大部分的驱动命令相同,但有些许命令是有差别的!

网络上关于SSD1315驱动芯片的描述不是很多,这也萌生了我这篇博客,接下来,让我们来瞧瞧SSD1315驱动芯片关于垂直水平滚动的描述:

 (SSD1315代码讲解部分)

 OLED_Write_Cmd(0x2E);       // 先必须关闭滚动

OLED_Write_Cmd(0x29);        // 0x29是垂直水平向右滚动,0x2A是垂直水平向左滚动
OLED_Write_Cmd(0x01);        // 0x00 水平滚动关闭,0x01 水平滚动开启

OLED_Write_Cmd(0x00);       // 起始页 0
OLED_Write_Cmd(0x07);        // 滚动时间间隔
OLED_Write_Cmd(0x07);        // 终止页 7    
OLED_Write_Cmd(0x01);        // 垂直滚动偏移量


OLED_Write_Cmd(0x00);        // 暂不进行说明(后面会说明)
OLED_Write_Cmd(0x7F);        // 暂不进行说明(后面会说明)

OLED_Write_Cmd(0x2F);        // 开启滚动

(程序效果图 )

TIPS:文中图片中白色文字的是SSD1306驱动芯片,蓝黄文字的是SSD1315驱动芯片,大家注意区分! 


二、垂直滚动方法

1)SSD1306驱动芯片

而关于垂直滚动方法,用户手册没有进行详细的说明,但是还是被我找到了方法!!!大家仔细看我下面的代码注释,就会明白了!!!

OLED_Write_Cmd(0x2E);       // 先必须关闭滚动


OLED_Write_Cmd(0x29);        // 0x29是垂直水平向右滚动,0x2A是垂直水平向左滚动
OLED_Write_Cmd(0x00);        // 虚拟字节
 

// 选择要作用的页(0~7)【除去这个范围的页,其余全都是垂直移动--若开启】
OLED_Write_Cmd(0x00);        // 起始页 0
OLED_Write_Cmd(0x07);        // 滚动时间间隔
OLED_Write_Cmd(0x07);        // 终止页 7    
OLED_Write_Cmd(0x01);        // 垂直滚动偏移量

OLED_Write_Cmd(0x2F);        //开启滚动

注意上文红色标注,只要将起始页和终止页都设为0x00,则除去(0~0)PAGE范围外都是垂直移动,则整个屏幕文字就会垂直移动,但目前没有办法使屏幕向下垂直运动!


2)SSD1315驱动芯片

同上所理,但不同的是SSD1315驱动芯片方法中,在开启滚动命令前的两个字节正好是对滚动列进行设置的,而SSD1315的垂直滚动比SSD1306控制更为细节,大家仔细看我的代码注释!!!

 OLED_Write_Cmd(0x2E);       // 先必须关闭滚动

OLED_Write_Cmd(0x29);        // 0x29是垂直水平向右滚动,0x2A是垂直水平向左滚动
OLED_Write_Cmd(0x01);        // 0x00 水平滚动关闭,0x01 水平滚动开启

OLED_Write_Cmd(0x00);       // 起始页 0
OLED_Write_Cmd(0x07);        // 滚动时间间隔
OLED_Write_Cmd(0x07);        // 终止页 7    
OLED_Write_Cmd(0x01);        // 垂直滚动偏移量


// 选择要作用的列【除去这个范围的列,其余全都是垂直移动--若开启】
OLED_Write_Cmd(0x00);        // 第0列开始
OLED_Write_Cmd(0x7F);        // 第127列结束

OLED_Write_Cmd(0x2F);        // 开启滚动

注意上文红色标注,只要将文中标紫的部分都换成发送0x00,则除去(0~0)列范围外都是垂直移动,则整个屏幕文字就会垂直移动,但目前没有办法使屏幕向下垂直运动!


三、局部区域垂直水平滚动方法

1)SSD1306驱动芯片

有了前面的铺垫,咱们要实现局部区域垂直水平滚动就很简单了,我们瞧瞧一下官方手册里的A3命令,这可以实现部分区域进行垂直水平滚动,并结合代码我们来详细看看:

图 3 选择垂直滚动区域命令

 OLED_Write_Cmd(0x2E);       // 先必须关闭滚动


OLED_Write_Cmd(0x29);        // 0x29是垂直水平向右滚动,0x2A是垂直水平向左滚动
OLED_Write_Cmd(0x00);        // 虚拟字节

// 水平滚动的区域将会发生在被选用的区域①
OLED_Write_Cmd(0x00);        // 起始页 0
OLED_Write_Cmd(0x07);        // 滚动时间间隔
OLED_Write_Cmd(0x05);        // 终止页 5    
OLED_Write_Cmd(0x01);        // 垂直滚动偏移量

// 选择要作用的行(0~15)【除去这个范围的行,其余全都是水平移动--若开启】

// 垂直滚动的区域将会发生在被选用的区域②
OLED_Write_Cmd(0xA3);        //选择行区域命令
OLED_Write_Cmd(0x00);        //第0行开始
OLED_Write_Cmd(0x0F);        //第15行结束

OLED_Write_Cmd(0x2F);        //开启滚动

从上述代码可以看到,区域①中控制是水平滚动,区域②控制的是垂直滚动,所以两个区域重叠的部分就是垂直水平滚动,而其余部分不会发生任何滚动变化,为了便于理解,结合上述代码,我手绘一张图进行讲解:

图 4 区域滚动手绘示意图

2)SSD1315驱动芯片

相比于SSD1306驱动芯片而言,SSD1306驱动芯片对区域性的垂直滚动可以控制得更加灵活,也可以控制得更加精准,增加了对屏幕列区域的滚动控制,同样,我们来瞧瞧官方手册里的A3命令,并结合详细代码来详细看看:

图 5 选择垂直滚动区域命令

 OLED_Write_Cmd(0x2E);       // 先必须关闭滚动

// 选择要作用的行(0~63)【除去这个范围的行,其余全都是水平移动--若开启】
// 垂直滚动的区域将会发生在被选用的区域②

OLED_Write_Cmd(0xA3);        //选择行区域命令
OLED_Write_Cmd(0x00);        //第0行开始
OLED_Write_Cmd(0x0F);        //第15行结束

OLED_Write_Cmd(0x29);        // 0x29是垂直水平向右滚动,0x2A是垂直水平向左滚动
OLED_Write_Cmd(0x01);        // 0x00 水平滚动关闭,0x01 水平滚动开启

// 水平滚动的区域将会发生在被选用的区域①

OLED_Write_Cmd(0x00);       // 起始页 0
OLED_Write_Cmd(0x07);        // 滚动时间间隔
OLED_Write_Cmd(0x05);        // 终止页 5    
OLED_Write_Cmd(0x01);        // 垂直滚动偏移量


// 选择要作用的列【除去这个范围的列,其余全都是垂直移动--若开启】
// 水平滚动的区域将会发生在被选用的区域①
OLED_Write_Cmd(0x00);        // 第0列开始
OLED_Write_Cmd(0x3F);        // 第63列结束

OLED_Write_Cmd(0x2F);        // 开启滚动

从上述代码可以看到,区域①中控制是水平滚动,区域②控制的是垂直滚动,所以两个区域重叠的部分就是垂直水平滚动,而其余部分不会发生任何滚动变化,相比于SSD1306,SSD1315增加了区域①的列选取,所以相较而言复杂一点,同样,为了便于理解,结合上述代码,我手绘一张图进行讲解:

图 6 区域滚动手绘示意图


四、详细部分代码

// 0.96寸OLED内部驱动芯片是SSD1306(有些SSD1315)--- 在屏幕滚动指令上有区别
#define    DRIVER_CHIP    1306/*** @brief  OLED_Inside_ver_sroll,内部设置垂直水平滚动* @param  start_page,end_page :起始滚动页与终止滚动页(start_page:0~7, end_page:0~7);*			scroll_offset : 垂直偏移量*			frame : 每个滚动步骤之间的时间间隔,以帧为单位,越大越慢(FRAME_2 ~ FRAME_128)*			dir : 1 垂直并向右滚动, 0 垂直并向左滚动* @retval 无*/
void OLED_Inside_Ver_Hor_Sroll(uint8_t start_page,uint8_t end_page,uint8_t scroll_offset,Roll_Frame frame, uint8_t dir)
{#if (DRIVER_CHIP == 1315)// 先必须关闭滚动OLED_Write_Cmd(0x2E);// 选择要作用的行(0~63)【除去这个范围的行,其余全都是水平移动--若开启】// 垂直滚动的区域将会发生在被选用的区域OLED_Write_Cmd(0xA3);        //选择行区域命令OLED_Write_Cmd(0);        	 //第0行开始OLED_Write_Cmd(0x3F);        //第63行结束// 1是垂直水平向右滚动,0是垂直水平向左滚动OLED_Write_Cmd(dir ? 0x29 : 0x2A);//虚拟字节(最低为1,水平滚动开启)OLED_Write_Cmd(0x01);// 水平滚动的区域将会发生在被选用的区域OLED_Write_Cmd(start_page & 0x07);      //起始页 0OLED_Write_Cmd(frame & 0x07);        //滚动时间间隔OLED_Write_Cmd(end_page & 0x07);        //终止页 7	OLED_Write_Cmd(scroll_offset & 0x07);        //垂直滚动偏移量// 选择要作用的列【除去这个范围的列,其余全都是垂直移动--若开启】// 水平滚动的区域将会发生在被选用的区域OLED_Write_Cmd(0x00);        //第0列开始OLED_Write_Cmd(0x7F);        //第127列结束OLED_Write_Cmd(0x2F);        //开启滚动#else// 先必须关闭滚动OLED_Write_Cmd(0x2E);// 1是垂直水平向右滚动,0是垂直水平向左滚动OLED_Write_Cmd(dir ? 0x29 : 0x2A);//虚拟字节OLED_Write_Cmd(0x00);// 选择要作用的页(0~7)【除去这个范围的页,其余全都是垂直移动--若开启】// 水平滚动的区域将会发生在被选用的区域OLED_Write_Cmd(start_page & 0x07);      //起始页 0OLED_Write_Cmd(frame & 0x07);        //滚动时间间隔OLED_Write_Cmd(end_page & 0x07);        //终止页 7	OLED_Write_Cmd(scroll_offset & 0x07);        //垂直滚动偏移量// 选择要作用的行(0~63)【除去这个范围的行,其余全都是水平移动--若开启】// 垂直滚动的区域将会发生在被选用的区域OLED_Write_Cmd(0xA3);        //选择行区域命令OLED_Write_Cmd(0x00);        //第0行开始OLED_Write_Cmd(0x3F);        //第63行开始OLED_Write_Cmd(0x2F);        //开启滚动#endif
}

总结

本系列所用单片机型号为STM32F103VE,后续我会把本节所涉及的工程及相关资料放在评论区,大家自取!请大家多多点赞、多多收藏、感谢支持!!!我会继续输出优质内容的!!!加油!加油!🌸🌸🌸


http://www.ppmy.cn/news/173108.html

相关文章

13 1602液晶显示屏

// IIC转接板的VCC、GND分别连接开发板5V、GND&#xff0c;转接板的SDA、SCL连接开发板A4、A5。 #include <Wire.h> #include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27,16,2); //创建对象&#xff0c;并配置LCD地址及行列void setup() {lcd.init(); …

0.96寸OLED显示屏驱动手册(SSD1306)

MCU IIC接口 IIC通信接口由从地址位SA0,IIC总线数据信号SDA(输出SDAout/D2和输入SDAin /D1)和IIC总线时钟信号SCL&#xff08;D0&#xff09;。不管是数据线还是时钟线都需要连接上拉电阻。RES#是用来初始化设备的。 a. 从地址位&#xff08;SA0&#xff09; SSD1306必须在发送…

一文彻底了解SSD1306驱动0.96寸OLED

微信公众号【物联网思考】 整理东西的时候&#xff0c;翻出了一个OLED&#xff0c;驱动起来玩一玩。先上一张图&#xff0c;显示了字符串、汉字&#xff0c;当然也是我们的公众号&#xff0c;欢迎关注。 在淘宝上找了一些资料&#xff0c;但是要想彻底理解如何驱动&#xff0c;…

2010中13寸MacbookPro光驱位安装SSD记录

装着Lion的旧MBP最近已尽显老态&#xff0c;开机居然需要2分钟。参考网友们的心得&#xff0c;在光驱位加个SSD做系统盘看来可以让MBP重振雄风。 于是淘宝买了Samsung 840系列 120G SSD&#xff0c;光驱位硬盘支架和外接光驱盒就开始动手。 选择120G SSD的原因 选择120G的原…

iPhone 屏幕尺寸(更新 iPhone 13 系列)

手机设备型号屏幕尺寸分辨率点数 (pt) 屏幕显示模式分辨率像素 (px) 屏幕比例 iPhone SE4.0 寸 320x5682x640x113616:9iPhone 6/6s/7/8/SE 24.7 寸 375x6672x750x133416:9iPhone 6p/7p/8p5.5 寸 414x7363x1242x220816:9iPhone XR/116.1 寸 414x8962x828x179219.5:9iPhone X/XS/…

使用ssd1306驱动,来驱动0.96寸中景园oled屏幕

硬件 nucleo-f411RE, 中景园oled屏幕(0.96寸&#xff0c;七线) 驱动文件地址 stm32-ssd1306 驱动文件说明 使用的库&#xff1a; H A L HAL HAL 支持的通信协议&#xff1a; S P I / I I C SPI/IIC SPI/IIC 文件结构&#xff1a; 其中&#xff0c;驱动文件在 s s d 1306 …

linuxOPS基础_用户与组管理

linux用户与组概念 Linux的多用户多任务 ​ Linux 系统是一个多用户多任务的操作系统&#xff0c;所谓多用户多任务&#xff0c;是指支持多个用户在同一时间内登陆&#xff0c;不同用户可以执行不同的任务&#xff0c;并且互不影响。 ​ 例如&#xff1a; ​ 小明所在的运维…

【构造】0602 Koxia and Game

子问题1 题意&#xff1a; 给定三个长度为 n n n 的数组 a , b , c a,b,c a,b,c &#xff0c; 1 ≤ a i , b i , c i ≤ n 1\leq a_i,b_i,c_i\leq n 1≤ai​,bi​,ci​≤n。两个人 A l i c e Alice Alice 和 B o b Bob Bob 分别拿数 n n n 次&#xff0c;第 i i i 次拿…