文章目录

  • 链接
  • 需求分析
  • 取模
    • pr操作
      • 修改大小
      • python操作
  • 显示动画
    • 前期准备
    • 动画帧发送
    • 动画实现
  • 成品

文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。
本文章基于此系列和开发板展开讨论。

本系列以SSD1306为主控芯片的I2C接口的0.96寸OLED屏幕为例介绍
内容较多,分节进行

链接

基础命令和寻址方法
IIC(I2C)协议

  1. OLED初始化,软件I2C实现,基础数据发送
  2. 满屏图像显示
  3. 全屏动画显示
  4. 显示字母和数字,汉字
  5. 画指定的点
  6. 指定两点画线段
  7. 指定圆心和半径画圆
  8. 指定圆心半径角度画圆弧

需求分析

在这一节中我们制作一个动画

动画的本质是一张张的图片间隔指定的时间投放到屏幕上,利用视觉暂留效应即可看到流畅的动画了

  1. 取模
  2. 显示图片
  3. 定时刷新

取模

因为网上没有找到可以批量取模的软件(一个几秒的动画就有几十上百张图片),因此我使用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)全屏动画显示相关推荐

  1. 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32

    ** 0.96寸OLED显示屏标准库移植HAL库,使用模拟IIC ** 由于项目的需要使用OLED屏显示,并且现有的项目程序是基于HAL库编写的,而手头能找到的程序是标准库的驱动程序,大概看了一下代码 ...

  2. STM32F103C8T6 0.96寸 OLED显示屏 IIC(CubeMx生成 HAL库)

    STM32F103C8T6 0.96寸 OLED显示屏 IIC(CubeMx生成 HAL库 文章目录 STM32F103C8T6 0.96寸 OLED显示屏 IIC(CubeMx生成 HAL库 一.O ...

  3. 基于STM32的0.96寸OLED显示屏显示数据和滚动显示

    文章目录 一.SPI 二.OLED显示屏显示数据 2.1 代码实现 2.2 结果展示 三.0.96寸OLED滚动显示数据 3.1 滚动方式 3.2 对显示文字进行取模 3.3 代码实现 3.4 结果展 ...

  4. 关于基于stm32的0.96寸oled显示屏的学习理解心得。

    关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...

  5. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

  6. 【手把手带你用pid算法控制电机】——(1)编码器电机和0.96寸OLED显示屏的使用

    目录 前言 一.需要用到的器材 二.接线说明 三.cubmx配置 3.1 时钟树 3.2 输出PWM(TIM4) 3.3 编码器模式(TIM3) 3.4 中断定时器配置(TIM1) 3.5 配置IIC ...

  7. 【室内温度+树莓派性能监控】树莓派+DS18B20温度传感器+0.96寸OLED显示屏使用及安装经验分享

    以下内容为本人原创 原文链接:https://blog.csdn.net/Yhen1/article/details/113760948 作者:@Yhen 发布网站:CSDN 未经本人同意禁止转载,如 ...

  8. 基于STM32F103C8T6的0.96寸OLED显示屏显示数据

    一.了解SPI(串行外设接口) SPI全称是Serial Perripheral Interface,也就是串行外围设备接口.SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工 ...

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

    0.96寸OLED(SSD1306)屏幕显示 (一)基础功能介绍 (二)超长文字水平滚动 (三)屏幕垂直水平滚动 文章目录 一.垂直水平滚动方法 1)SSD1306驱动芯片 2)SSD1315驱动芯片 ...

  10. 3.2 0.96寸OLED显示屏的使用

    0.96寸OLED显示屏:4线的串行SPI接口方式.IIC 接口方式,128*64像素. OLED每次控制8个点阵,垂直方向扫描控制,所以垂直方向坐标可选为0~7:水平方向可选坐标0~127 接线图: ...

最新文章

  1. Linux系统与性能监控
  2. idea GsonFormat插件使用报错 StringIndexOutOfBoundsException: begin 0, end -1, length 9
  3. 项目管理工具篇(一、Maven)
  4. datatype未定义是什么意思_vue.js一直提示未定义
  5. android实现计算器功能吗,安卓实现一个计算器的功能
  6. 1996.游戏中的弱角色的数量
  7. Java —— 正则表达式
  8. Windows Azure HandBook (8) Azure性能测试(1)
  9. 西北工业大学电工学mooc第六章测试题及解析
  10. 你有必要不沾计算机一段时间英语,八年级上册英语第一单元背默(人教版)
  11. word2020 复制的文字有背景颜色怎么去掉呢
  12. 51单片机按键控制数码管0~9_LED数码管精选电路方案合辑
  13. com.mysql.jdbc.driver jar下载_com.mysql.jdbc.Driver
  14. 公有云和私有云的主要区别在哪里,公有云会不会带来隐私泄露的问题?
  15. 【Codeforces 924C】Riverside Curio
  16. 【代码阅读】PointNet++中ball query的CUDA实现
  17. Android Permission中英对照
  18. 第3章 使用SQL*Plus
  19. 对onreadystatechange属性的理解
  20. 解锁新姿势,揭秘如何通过公众号迁移方式给自己的爱号开通留言板功能

热门文章

  1. java计算星座_给定公历日期计算12星座(Java代码实现)
  2. 利用HRTF实现听音辨位
  3. java计算机毕业设计景区在线购票系统源码+mysql数据库+系统+lw文档+部署
  4. 一篇男人必看的创业文章。(人活着不能没有钱,但是活着却不能只为了钱)
  5. 【android免root脚本制作】总览Auto.js开发小结——基础篇
  6. 审批中心移动APP审批API
  7. kali linux 安装搜狗输入法
  8. 新期刊《Journal of Machine Learning》上线!
  9. JS放在head和放在body中的区别
  10. 51 汇编编程:8×8 点阵驱动