STM32+OLED播放鸡你太美

本人是1坤年的小黑子,趁放假做一个哥哥的跳舞视频,以下是记录学习的过程,但做的效果不是特别好。

一、准备工作

1、硬件准备:STM32开发板、0.96寸OLED

2、硬件连接:IIC通信引脚连接、DAP-LINK连接

3、程序准备:IIC通信、OLED驱动(文字、字符串、图片)

二、操作过程

1:下载gif

2:调整gif的大小和帧数;工具:GIF Movie Gear

GIF Movie Gear: Home

3:彩色图片二值化;工具:阈值图像(用黑色或白色像素替换每个像素)- 免费在线工具

结果如下:

4:动图拆分成图片;工具:Gifsplitter

GifSplitter下载-GifSplitter中文版下载[GIF分离工具]-pc下载网

结果如下(以5张图为例):

5:取模;工具PCtoLCD

https://github.com/caowent/PCtoLCD2018/blob/main/README.md

结果如下(需要手动处理了一下背景):

6:编写main.c程序(以取了9张图为例)

 int main(void)
  {	
		delay_init();	    	 
		NVIC_Configuration(); 	
        LED_Init();		
		OLED_Init();			
		OLED_Clear()  	; 
	


	while(1) 
	{			OLED_DrawBMP(0,0,128,8,BMP1);  
		delay_ms(80);
		
		OLED_DrawBMP(0,0,128,8,BMP2);  
		delay_ms(90);
	
		OLED_DrawBMP(0,0,128,8,BMP3); 
		delay_ms(80);
		
		OLED_DrawBMP(0,0,128,8,BMP4);  
		delay_ms(80);
		
		OLED_DrawBMP(0,0,128,8,BMP5);  
		delay_ms(80);
				
		OLED_DrawBMP(0,0,128,8,BMP6);  
		delay_ms(80);
				
		OLED_DrawBMP(0,0,128,8,BMP7);  
		delay_ms(80);
		
		OLED_DrawBMP(0,0,128,8,BMP8);  
		delay_ms(80);
		
		OLED_DrawBMP(0,0,128,8,BMP9);  
		delay_ms(80);
	
	}
	}

三、看运行结果

### STM32实现蔡徐坤跳舞程序的方法 通过使用STM32微控制器配合OLED显示屏,可以展示动态图像效果。具体到蔡徐坤跳舞的动画实现,其核心在于将GIF图片分解成逐帧形式并存储于单片机内部闪存中,随后利用定时器中断控制每帧显示的时间间隔来完成动态播放的效果。 #### 图像处理阶段 在实际操作前,需准备一张完整的GIF动图作为素材源文件[^1]。此GIF应经过优化以适应嵌入式设备资源限制条件下的运行环境需求——即减少不必要的冗余数据量以及缩短整体持续时长以免超出目标硬件所能承载的最大容量范围。接着运用专门工具如IrfanView中的Batch Conversion/BMP-JPEG功能模块对原始GIF执行分割动作,从而获得一系列独立位图文件用于后续编程加载环节之中。 #### 单片机端开发流程概述 对于基于ARM Cortex-M3架构设计而成的STM32系列芯片而言,在固件库框架下编写应用程序代码是一种常见做法: - **初始化外设配置**:开启对应GPIO口及相关功能单元(比如SPI/IIC接口),以便连接外部组件例如SSD1306驱动型OLED屏。 - **定义全局变量数组结构体**:用来保存各张静态画面像素点分布情况的数据表;这些数值通常由PC端转换脚本预先计算好后再移植至MCU项目工程目录里。 - **创建循环刷新机制**:借助SysTick或其他类型的计数器触发事件信号,按照既定顺序逐一调用不同索引位置上的图形对象直至形成连贯视觉体验为止。 以下是简化版伪代码示例说明上述逻辑关系: ```c #include "stm32f1xx_hal.h" // 假设有N帧组成整个舞蹈序列,则声明如下二维字节数组表示每一幅子画作的具体构成细节 const uint8_t kungfu_frames[][WIDTH * HEIGHT / 8] = { /* ... */ }; void DisplayNextFrame(void){ static uint8_t current_index = 0; SendDataToOled(kungfu_frames[current_index]); if (++current_index >= NUM_OF_FRAMES) { current_index = 0; // 循环回放 } } int main(void){ HAL_Init(); SystemClock_Config(); Initialize_OLED(); // 初始化屏幕 while (true){ Delay_ms(DELAY_TIME); // 控制切换速度 DisplayNextFrame(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值