【STM32标准库】【自制库】0.96寸OLED显示屏(SSD1306)(2)全屏动画显示

21 篇文章 10 订阅
8 篇文章 2 订阅


文章基于适用于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 binary

for 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=0
    txt="\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]=1
            elif tst[i][j]==0:
                tst[i][j]=0
    t=0
    for i in range(0,h,8):
        for j in range(l):
            js=0
            for z in range(0,8):
                js=js*2+tst[i+7-z][j]
            txt+=str(hex(js))+","
            t+=1
            if t==16:
                txt+="\n"
                t=0
    txt=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

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STm32F1是意法半导体公司推出的一款32位ARM微控制器系列,它具有出色的性能和各种丰富的外设接口。对于使用0.96OLED显示屏STM32F1代码,我可以给您提供以下参考。 首先,您需要根据具体的OLED显示屏规格,确保其兼容性。如果您已经找到了适用于该显示屏文件和示例代码,您可以将其导入到您的STM32F1工程中。 在代码的开始部分,您需要包含所需的头文件。例如,如下所示: #include "stm32f1xx.h" #include "stdio.h" #include "OLED.h" // OLED显示屏相关的头文件 接下来,在主函数中,您可以调用相应的初始化函数,以初始化您的OLED显示屏。例如,如下所示: int main(void) { // 初始化OLED显示屏 OLED_Init(); // 其他代码 } 在初始化完成后,您可以使用OLED的相关函数来进行绘制和显示内容。例如,您可以使用以下代码显示一些文本信息: OLED_ShowString(0, 0, "Hello World", 12); // 在坐标(0, 0)处显示"Hello World",字体大小为12 如果您需要显示更复杂的图形,例如绘制直线或矩形,您可以利用OLED提供的函数进行绘制。例如,如下所示: OLED_DrawLine(0, 0, 63, 63); // 绘制一条从坐标(0, 0)到(63, 63)的直线 OLED_DrawRect(10, 10, 50, 30); // 绘制一个起点坐标为(10, 10),宽度为50,高度为30的矩形 总结来说,您需要导入适用于0.96OLED显示屏文件和示例代码,然后根据具体需求调用相应的函数实现初始化和显示内容。请注意,以上仅是基本示例,您可以根据您的需求选择合适的显示函数并调整参数。希望这能给您提供一些启示,祝您顺利开发! ### 回答2: 0.96OLED显示屏是一种小型的有机发光二极管显示屏,它具有高亮度、高对比度和快速响应的特点,适用于许多嵌入式系统中。STM32F1是意法半导体公司(STMicroelectronics)生产的一系列32位单片机,具有强大的处理能力和丰富的外设接口。下面是一个简单的STM32F1控制0.96OLED显示屏的示例代码。 首先,我们需要在STM32F1的开发环境中导入相关的文件,包括i2c.h、gpio.h等。然后,我们需要定义OLED的I2C地址和屏幕的宽度和高度。 在主函数中,我们首先初始化I2C总线,并设置STM32F1的GPIO引脚为I2C功能。接着,我们初始化OLED屏幕,包括软件复位和初始化显示参数。 在主循环中,我们可以使用一些OLED函数来显示内容。例如,我们可以使用`OLED_DrawString()`函数在OLED屏幕上显示字符串。我们也可以使用`OLED_Clear()`函数清除屏幕上的内容。 此外,我们还可以使用其他一些函数来显示图像、绘制图形等。例如,我们可以使用`OLED_DrawBMP()`函数来显示位图图像。我们还可以使用`OLED_DrawLine()`函数来绘制直线,`OLED_DrawRect()`函数来绘制矩形等。 总之,通过使用适当的函数,我们可以在STM32F1单片机上控制0.96OLED显示屏,实现各种显示功能。这只是一个简单的例子,你可以根据自己的需求进一步开发代码,并根据具体的OLED显示屏STM32F1单片机型号进行适当的调整。希望这个回答能对你有所帮助! ### 回答3: 以下是一段300字的中文回答,关于0.96OLED显示屏STM32F1代码的使用。 0.96OLED显示屏是一种小尺的有机发光二极管(OLED显示屏,非常适合在嵌入式系统中使用。STM32F1是一款由ST公司推出的低功耗微控制器,能够与各种外设进行通信,包括OLED显示屏。 要在STM32F1上使用0.96OLED显示屏,首先需要连接OLEDSTM32F1的引脚。常见的连接方案包括使用I2C接口或SPI接口。其中,I2C接口通常只需要两个引脚(SCL和SDA),而SPI接口则需要更多的引脚(如SCK、MISO、MOSI等)。 接下来,需要编写STM32F1的代码来控制OLED显示屏。这段代码通常包括与OLED通信的函数、初始化OLED的函数以及显示内容的函数。对于使用I2C接口的情况,可以使用STM32F1内置的I2C函数来进行通信。对于使用SPI接口的情况,可以使用STM32F1的SPI函数来实现通信。 在代码中,需要对OLED的命令进行编码,并将其发送给OLED显示屏。例如,可以通过发送特定的命令来初始化OLED,并设置显示模式和亮度等参数。之后,可以通过发送指定的数据来在OLED显示内容,如文字、图标等。 除了显示内容的函数外,还可以通过代码控制OLED的其他特性,如清除屏幕、翻转屏幕等。这些功能可以通过发送相应的命令和数据来实现。 总结而言,要在STM32F1上使用0.96OLED显示屏,需要连接合适的引脚,并编写相应的代码来控制OLED的功能和显示内容。使用适当的接口和函数,可以很容易地实现与OLED的通信。享受在STM32F1上使用0.96OLED显示屏带来的嵌入式系统开发乐趣吧!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值