OLED效果设计笔记1:显示横向滚动字幕

 本文使用芯片:STM32 F103 C8T6 最小系统板

从这个笔记开始,学习一下OLED的一些显示动画效果的实现,尝试自己能够做出一些接近实际产品的界面切换,动画效果设计~

文章提供源码,测试效果图,原理介绍,测试工程下载。

 

目录

OLED 基础知识学习:

滚动显示硬件支持:

初步设计思路:

构想与瑕疵:

下载测试:

横向滚动字幕程序设计:

滚动控制的OLED命令:

下载测试与注意点:

 引脚接线:

测试工程下载:


OLED 基础知识学习:

对于OLED的显示基础以及基础代码,本文不讲,不了解的可以看以下文章:

STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符_NULL指向我的博客-CSDN博客

STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片_NULL指向我的博客-CSDN博客

有时OLED屏幕大小有限制,我们需要显示的句子长度可能超过了屏幕的长度,此时就需要滚动显示来解决,这样我们的句子显示长度在一定程度上会增长,但滚动显示字幕又有几个设计方案,不同的方案对应不同的使用场景,我们将会逐个学习。

滚动显示硬件支持:

我们可以从器件手册的FEATURES小节可以知道支不支持硬件滚动。SSD1306器件手册中FEATURES描述说明了它是支持滚动显示的,现在市面上许多0.96寸等OLED显示屏都是使用SSD1306驱动,支持滚动显示的。

初步设计思路:

构想与瑕疵:

我们先初步构想实现一下字幕滚动,本质是打印起点X或者Y坐标的增加,通过这个方式可以使打印起点不断变化,结合SSD1306支持的滚动显示以及合适时长的延时,从而实现滚动字幕,但实际是否如我们构想的那样呢,现在实践测试一下:

首先编写适当的字符串打印代码,如下:

//显示一个字符号串
void OLED_ShowString_2(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')                    //循环打印直到字符串结尾
	{		
			OLED_ShowChar(x,y,chr[j],Char_Size);//打印一个字符
			x+=8;j++;        										//下标下移,打印下个字符
			if(x>120){x=0;}											//X不能超过120,否则会印在下一行
	}
}

然后在主函数写上对应打印逻辑:


char  buf[20];   //用于暂存oled数据
uint16_t choice,x,y;

int main(void)
{	
	init_ALL();     //初始化所有函数
  while(1)
	{
			sprintf(buf,"Hello World");
			OLED_ShowString_2(x,2,(u8 *)buf,16);
			delay_ms(55);     //延时55ms
			x++;              //X坐标增加
			if(x>=128) {x=0;} //x坐标不超过128
	}
}

下载测试:

下载测试发现基本的效果实现了,但文字刷新有拖尾现象,这是因为之前刷新过的区域没有被清除显示的原因。

其次我们将其改为长字符串,会发现显示更不正常了,因为长字符串本身显示占用就长于屏幕总长了,(此处将Hello World 改为 Welcome to my world),而我们选择滚动显示的原因就是想要在有限的长度显示更多的信息,这样编程显然达不到我们的需求~

横向滚动字幕程序设计:

滚动控制的OLED命令

其实SSD1306中有关于滚动控制的OLED命令如下:

它的一个重要配置是需要我们配置0~7页,哪些页需要滚动,这个只要设置起始与终止页即可,这样这俩页之间打印的内容就会滚动播放了,(注意:有些字符字母只占一页,但大部分汉字占俩页,一定要界定好!)

另一个配置就是设置滚动速度,这个填的越长,时间间隔就越大。

				OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
				OLED_WR_Byte(0x26,OLED_CMD); //向右滚动,27则向左
				OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节 发送空字节 设置为0x00即可
				OLED_WR_Byte(0x02,OLED_CMD); //起始页 这里为2
				OLED_WR_Byte(0x07,OLED_CMD); //滚动速度 设置滚动步长的时间间隔, 帧为单位 
				OLED_WR_Byte(0x04,OLED_CMD); //终止页 这里为4(表示从页这开始不用滚动)
				OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
				OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
				OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

我们将其添加入程序:

这个滚动显示就是命令,一般只要设置好就行

char  buf[20];   //用于暂存oled数据
uint16_t choice,x,y;

int main(void)
{	
	init_ALL();     //初始化所有函数
	
	sprintf(buf,"Hello World ");
	OLED_ShowString(0,2,(u8 *)buf,16);
	
	delay_ms(5);                 //延时等显示稳定

	OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
	OLED_WR_Byte(0x26,OLED_CMD); //向右滚动,27则向左
	OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节 发送空字节 设置为0x00即可
	OLED_WR_Byte(0x02,OLED_CMD); //起始页 这里为2
	OLED_WR_Byte(0x07,OLED_CMD); //滚动速度 设置滚动步长的时间间隔, 帧为单位 
	OLED_WR_Byte(0x04,OLED_CMD); //终止页 这里为4(表示从页这开始不用滚动)
	OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
	OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
	
  while(1)
	{
		
	}
}

下载测试与注意点:

现在的效果正是我们需要的,并且不需要MCU一直刷新了,配置一次即可自动滚动,但经过我的测试,这种滚动显示,有以下注意点:

1.还是不能显示过长的字符串

2.起点横向的X坐标只能是0,过大会有显示错误

3.配置滚动之前,建议延时5ms先等显示稳定

因此这个SSD1306命令式的写法虽然方便好用,但也有限制,它的横向滚动设置,只能是0~~128这 个区间,不能设置成别的区间,比如我只想他在屏幕一半区域滚动~

 引脚接线:

SCL    接   PB6

SDA    接   PB7

//-----------------OLED IIC端口定义----------------  					   

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_6)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_6)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_7)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_7)

测试工程下载:

https://download.csdn.net/download/qq_64257614/88251719?spm=1001.2014.3001.5503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/90755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM+vue框架的校园代购服务订单管理系统源码和论文

基于SSMvue框架的校园代购服务订单管理系统源码和论文070 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 在新发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地&am…

Ribbon:使用Ribbon实现负载均衡

Ribbon实现的是实线走的 建立三个数据库 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.7.25-log : Database - db01 ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_UNIQ…

app.js和页面.js 实现全局传参

实现全局传参的几个步骤:1. 在页面.js文件中 输入 const appgetApp() 2.便可以在页面中引用app.js中的globalData中的数据。 注意点:app.js中是使用的是this.globalData (调用自身的数据) 页面.js中使用的是app.globalData(引用ap…

学习ts(九)混入

对象混入 使用Object.assign()进行对象混入,最后的people会被识别为三种类型的联合类型 类混入 使用implement并非extnds实现混入。 属性在混入类里面定义,分别在类中占位,方法分别在类中定义,在混合类中占位。这告诉编译器这…

DataFrame.set_index()方法--Pandas

1.函数功能 为DataFrame重新设置索引(行标签) 2. 函数语法 DataFrame.set_index(keys, *, dropTrue, appendFalse, inplaceFalse, verify_integrityFalse)3. 函数参数 参数含义keys作为行标签的列名,可以DataFrame中的是单个列或者多列组…

【线程池】ThreadPoolExecutor的使用示例

文章目录 通过ThreadPoolExecutor创建线程池。线程的处理结果如何获取? 通过ThreadPoolExecutor创建线程池。 ThreadPoolExecutor构造方法参数: int corePoolSize //核心线程数量int maximumPoolSize//最大线程数long keepAliveTime//当线程数大于核心…

drools8尝试(加单元测试)

drools8的maven模板项目里没有单元测试, 相比而言drools7有个非常好的test senorios 那就自己弄一个 文件是.http后缀的,写了个简单的例子如下 //测试交通违章 POST http://localhost:8080/Traffic Violation accept: application/json Content-Type: application/json{&q…

STM32--SPI通信与W25Q64(1)

文章目录 前言SPI通信硬件电路移位过程 SPI时序起始与终止条件交换一个字节 W25Q64硬件电路框图 FLASH操作注意事项软件SPI读写W25Q64 前言 USART串口链接入口 I2C通信链接入口 SPI通信 SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的串…

Java中HashMap的基本介绍和详细讲解,HashMap的遍历以及HashMap的底层源码的分析

HashMap 基本介绍 HashMap 是 Java 中的一个集合类,实现了 Map 接口,用于存储键值对(key-value)数据。它基于哈希表的数据结构实现,可以实现高效的查找、插入和删除操作。 HashMap 细节讨论 无序性: Has…

Python高光谱遥感数据处理与高光谱遥感机器学习方法应用

本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…

【C++】list

list 1. 简单了解list2. list的常见接口3. 简单实现list4. vector和list比较 1. 简单了解list list的底层是带头双向循环列表。因此list支持任意位置的插入和删除,且效率较高。但其缺陷也很明显,由于各节点在物理空间是不连续的,所以不支持对…

thinkphp安装workman

需要加版本,版本太高了不行 composer require topthink/think-worker1.0.*

Github的使用指南

首次创建仓库 1.官网创建仓库 打开giuhub官网,右上角点击你的头像,随后点击your repositories 点击New开始创建仓库 如下图为创建仓库的选项解释 出现如下界面就可以进行后续的git指令操作了 2.git上传项目 进入需上传项目的所在目录,打开…

keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群

一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名主机地址软件node-01192.168.157.133rabbitmq、erlang、haproxy、keepalivednode-02192.168.157.134rabbitmq、erlang、haproxy、keepalivednode-03192.168.157.135rabbitmq、erlang 2. 关闭三台机器的防火墙 # 关闭…

自动控制原理笔记-采样控制系统

目录 采样控制系统的基本概念: 采样过程及采样定理: 一、采样过程 二、采样定理(香农采样定理、奈奎斯特采样定律) 三、信号复现 四、零阶保持器 z变换与z反变换: z变换的定义 z变换基本定理 z反变换 采样系…

gorm中正确的使用json数据类型

一、说明 1、JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。现实中也很多人不会采用json的存储方式,直接定义一个字符类型,让前端转换传递进来,返回给…

HTTPS协议加密原理

目录 一、什么是HTTPS 二、什么是加密/解密 三、为什么要加密 四、常见的加密方式 1.对称加密 2. 非对称加密 五、HTTPS加密方式探讨 1.只使用对称加密 2.只使用非对称加密 3.非对称加密对称加密 4.非对称加密对称加密CA认证 六、总结 一、什么是HTTPS HTTP 协议&a…

vue3+element下拉多选框组件

<!-- 下拉多选 --> <template><div class"select-checked"><el-select v-model"selected" :class"{ all: optionsAll, hidden: selectedOptions.data.length < 2 }" multipleplaceholder"请选择" :popper-app…

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…

ms-tpm-20-ref 在linux下编译

1、代码地址&#xff0c; GitHub - microsoft/ms-tpm-20-ref: Reference implementation of the TCG Trusted Platform Module 2.0 specification.Reference implementation of the TCG Trusted Platform Module 2.0 specification. - GitHub - microsoft/ms-tpm-20-ref: Refe…