【STM32标准库】【自制库】0.96寸OLED显示屏(SSD1306)(2)全屏动画显示
文章目录
- 链接
- 需求分析
- 取模
- pr操作
- 修改大小
- python操作
- 显示动画
- 前期准备
- 动画帧发送
- 动画实现
- 成品
文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。
本文章基于此系列和开发板展开讨论。
本系列以SSD1306为主控芯片的I2C接口的0.96寸OLED屏幕为例介绍
内容较多,分节进行
链接
基础命令和寻址方法
IIC(I2C)协议
- OLED初始化,软件I2C实现,基础数据发送
- 满屏图像显示
- 全屏动画显示
- 显示字母和数字,汉字
- 画指定的点
- 指定两点画线段
- 指定圆心和半径画圆
- 指定圆心半径角度画圆弧
需求分析
在这一节中我们制作一个动画
动画的本质是一张张的图片间隔指定的时间投放到屏幕上,利用视觉暂留效应即可看到流畅的动画了
- 取模
- 显示图片
- 定时刷新
取模
因为网上没有找到可以批量取模的软件(一个几秒的动画就有几十上百张图片),因此我使用python写了个程序用于批量取模
没有python基础的可以直接使用
import cv2 as cv
import numpy as np
sl=50#数量
h=64#行数
l=128#列数
yz=140#阈值sl=sl+1
def threshold_image(image,a):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#cv.imshow('origin', gray)ret, binary = cv.threshold(gray, yz, 255, cv.THRESH_BINARY)# 自定义阈值为150,大于150的是白色 小于的是黑色#cv.imwrite("./1/"+str(a)+".bmp",binary)#输出#cv.imshow('origin',binary)#调试用#cv.waitKey(0)return binaryfor a in range(1,sl):src = cv.imread(r"C:\Users\HZ1213825\Desktop\1\ ("+str(a)+").jpg")zj=threshold_image(src,str(a))tst=np.asarray(zj)np.set_printoptions(threshold=np.inf)js=0txt="\nconst uint8_t t"+str(a)+"[128][8]=\n{"# 取反用# for i in range(h):# for j in range(l):# if tst[i][j] == 255:# tst[i][j]=0# elif tst[i][j]==0:# tst[i][j]=1# 不取反用for i in range(h):for j in range(l):if tst[i][j] == 255:tst[i][j]=1elif tst[i][j]==0:tst[i][j]=0t=0for i in range(0,h,8):for j in range(l):js=0for z in range(0,8):js=js*2+tst[i+7-z][j]txt+=str(hex(js))+","t+=1if t==16:txt+="\n"t=0txt=txt.rstrip(",")txt+="};"#print(tst)with open("1.txt","a") as fp:fp.write(txt)print("t"+str(a)+',',end="")
需要做一些前期准备,请使用pr将视频剪裁为128 * 64像素,并导出为JPG格式
pr操作
修改大小
导入媒体,双击或拖入都行
拖入工作区创建序列
进入序列设置
更改视频大小
更改视频位置和缩放
加入黑白效果(在效果的视频效果的图形设置里)(将这个黑白拖到视频上就行了)
导出
设置为导出Jpe序列
python操作
将导出的图片批量重命名(全选,重命名)
然后把名字删除,之后回车即可(别删后缀名)
打开python,将代码复制进去
设置图片序列的地址和名字
修改数量和阈值
可以将这两行代码前的#删除(取消注释),来观察阈值是否正确
这是测试(调阈值)的效果
在控制台将取模的数组名打印了出来,方便后续操作
在程序的同级目录有输出文件(1.txt)
已经将前缀和后缀写入了,直接复制到Keil工程中即可
这是软件链接:
CSDN
链接:百度网盘
提取码:c95i
显示动画
上文说过,动画就是一帧帧的图片间隔一段时间播放做成的
前期准备
为了更方便的将动画刷新,我建立一个结构体
其内部的参数是二维数组指针
头文件(OLED.H)
typedef struct
{uc8 (*TDArray)[128];
} OLED_Animation_Array;
在后面可以申请一个结构体数组
uc8 t1[8][128]={};
uc8 t2[8][128]={};
uc8 t3[8][128]={};
OLED_Animation_Array a[3]={t1,t2,t3};
调用时就可以将其作为数组调用,可以进入循环中使用了,就像这样
for(int i=0;i<3;i++)
a[i].TDArray[2][2]=0;
动画帧发送
发送一张图片的函数只需要稍作修改即可移植过来
C文件(OLED.C)
//动画实现函数 Array:含每帧数据的结构体
void OLED_Animation_Ation(OLED_Animation_Array Array)
{//使用水平寻址模式模式OLED_Write_Ctrl_Start();I2C_SendByte(0x20); //设置寻址模式 (0x00水平/0x01垂直/0x02页)I2C_SendByte(0x00); //水平寻址模式I2C_SendByte(0x21); //设置列地址I2C_SendByte(0x00);I2C_SendByte(0x7f);I2C_SendByte(0x22); //设置页地址I2C_SendByte(0x00);I2C_SendByte(0x07);I2C_End();OLED_Write_Data_Start();for (int i = 0; i < 8; i++) //扫描页{for (int j = 0; j < 128; j++) //扫描列I2C_SendByte(Array.TDArray[i][j]);}I2C_End();
}
动画实现
只需要间隔时间调用上文提到的动画帧发送函数即可,封装为函数
C文件(OLED.C)
//动画刷新函数(有需要修改的值) Time:间隔时间单位ms Num:帧的数量
void OLED_Animation(int Time, int Num)
{//这个需要修改,修改数组大小和内部值 将uc8 [128][8]的名字按顺序放入OLED_Animation_Array ac[50] = {t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31, t32, t33, t34, t35, t36, t37, t38, t39, t40, t41, t42, t43, t44, t45, t46, t47, t48, t49, t50};OLED_Clear();for (int i = 1; i <= Num; i++){OLED_Animation_Ation(ac[i - 1]);Delay_ms(Time);}
}
输入间隔时间和帧数量即可
成品
stm32控制OLED屏幕显示动画演示
CSDN
链接:百度网盘
提取码:ierk
【STM32标准库】【自制库】0.96寸OLED显示屏(SSD1306)(2)全屏动画显示相关推荐
- 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32
** 0.96寸OLED显示屏标准库移植HAL库,使用模拟IIC ** 由于项目的需要使用OLED屏显示,并且现有的项目程序是基于HAL库编写的,而手头能找到的程序是标准库的驱动程序,大概看了一下代码 ...
- STM32F103C8T6 0.96寸 OLED显示屏 IIC(CubeMx生成 HAL库)
STM32F103C8T6 0.96寸 OLED显示屏 IIC(CubeMx生成 HAL库 文章目录 STM32F103C8T6 0.96寸 OLED显示屏 IIC(CubeMx生成 HAL库 一.O ...
- 基于STM32的0.96寸OLED显示屏显示数据和滚动显示
文章目录 一.SPI 二.OLED显示屏显示数据 2.1 代码实现 2.2 结果展示 三.0.96寸OLED滚动显示数据 3.1 滚动方式 3.2 对显示文字进行取模 3.3 代码实现 3.4 结果展 ...
- 关于基于stm32的0.96寸oled显示屏的学习理解心得。
关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...
- 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据
目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...
- 【手把手带你用pid算法控制电机】——(1)编码器电机和0.96寸OLED显示屏的使用
目录 前言 一.需要用到的器材 二.接线说明 三.cubmx配置 3.1 时钟树 3.2 输出PWM(TIM4) 3.3 编码器模式(TIM3) 3.4 中断定时器配置(TIM1) 3.5 配置IIC ...
- 【室内温度+树莓派性能监控】树莓派+DS18B20温度传感器+0.96寸OLED显示屏使用及安装经验分享
以下内容为本人原创 原文链接:https://blog.csdn.net/Yhen1/article/details/113760948 作者:@Yhen 发布网站:CSDN 未经本人同意禁止转载,如 ...
- 基于STM32F103C8T6的0.96寸OLED显示屏显示数据
一.了解SPI(串行外设接口) SPI全称是Serial Perripheral Interface,也就是串行外围设备接口.SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工 ...
- 0.96寸OLED(SSD1306)屏幕显示(三)——屏幕垂直水平滚动
0.96寸OLED(SSD1306)屏幕显示 (一)基础功能介绍 (二)超长文字水平滚动 (三)屏幕垂直水平滚动 文章目录 一.垂直水平滚动方法 1)SSD1306驱动芯片 2)SSD1315驱动芯片 ...
- 3.2 0.96寸OLED显示屏的使用
0.96寸OLED显示屏:4线的串行SPI接口方式.IIC 接口方式,128*64像素. OLED每次控制8个点阵,垂直方向扫描控制,所以垂直方向坐标可选为0~7:水平方向可选坐标0~127 接线图: ...
最新文章
- Linux系统与性能监控
- idea GsonFormat插件使用报错 StringIndexOutOfBoundsException: begin 0, end -1, length 9
- 项目管理工具篇(一、Maven)
- datatype未定义是什么意思_vue.js一直提示未定义
- android实现计算器功能吗,安卓实现一个计算器的功能
- 1996.游戏中的弱角色的数量
- Java —— 正则表达式
- Windows Azure HandBook (8) Azure性能测试(1)
- 西北工业大学电工学mooc第六章测试题及解析
- 你有必要不沾计算机一段时间英语,八年级上册英语第一单元背默(人教版)
- word2020 复制的文字有背景颜色怎么去掉呢
- 51单片机按键控制数码管0~9_LED数码管精选电路方案合辑
- com.mysql.jdbc.driver jar下载_com.mysql.jdbc.Driver
- 公有云和私有云的主要区别在哪里,公有云会不会带来隐私泄露的问题?
- 【Codeforces 924C】Riverside Curio
- 【代码阅读】PointNet++中ball query的CUDA实现
- Android Permission中英对照
- 第3章 使用SQL*Plus
- 对onreadystatechange属性的理解
- 解锁新姿势,揭秘如何通过公众号迁移方式给自己的爱号开通留言板功能