Proteus仿真中STM32与OLED显示屏的交互实现

介绍

本博客适合有一定基础的单片机学习爱好者。

OLED是一款具有良好显示性能的屏幕,在单片机领域中常见尺寸为0.96英寸(128*64),具体介绍详见博客:OLED详解

本文针对OLED显示屏做一个简单的基于按键控制的计算器。器件采用stm32f103c8(主控芯片),OLED12864I2C(OLED显示屏),及基础硬件若干。

OLED屏幕显示的具体内容较为复杂,我们采用其他博主编写好的代码即可

这里我有整理出来:链接:https://pan.baidu.com/s/1cgK1v5BYMZnZNilcSMFl4w 
提取码:pdsj 

文件注意事项: 这里打开后看见有个OLED.c的文件打开后需要配置相应的引脚

因为采用IIC通信协议,因此需要选择哪个端口接SCL,哪个端口接SDA,这里选的是GPIOA 的 PA4接SCL,PA5接SDA,相应的下面的引脚初始化也要进行修改,可根据实际情况进行更改,不必拘泥于这个端口选择问题。问题: 有个简单的问题,部分编译器可能不支持将初始化的第一句  GPIO_InitTypeDef GPIO_InitStructure;  写在其他c语句之后,所以这个我们就写在最前面,避免不必要的问题。

器件摆放如下

简单使用

#ifndef __OLED_H
#define __OLED_H

void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);

#endif

OLED.h文件里面有各种函数的声明,初始化,清屏,显示一个字符,显示一个字符串,显示数字,显示有符号数字,显示十六进制数,显示二进制数,右键选择 go to definition里面有各种函数的说明,写得很清楚。

下面我们来写一些简单的例子,倘若我们把屏幕分成4 * 16的格子,那么我们尝试下列函数

int main(void)
{ 
	OLED_Init();
	OLED_ShowChar(1,1,'A');
	OLED_ShowString(1,3,"HELLO!");
	OLED_ShowNum(2,1,128,3);
	OLED_ShowSignedNum(2,5,-10,2);
	OLED_ShowBinNum(3,1,0xCB,8);
	OLED_ShowHexNum(4,1,0xFF,2);
	while(1){  //主循环
		
	}
}

效果如图

 上述即为Proteus OLED的简单使用过程,函数文件已经配置完成,实际我们自己需要写的部分很少,学习起来较为容易。

然而,既然有了一个显示设备,不能轻易的就用来显示字符。实际上可以用来显示图片或者是视频(当然像素很低)。

高阶使用

参考文章:OLED显示图片

首先更换之前的OLED.c 等相关头文件

参考链接:驱动函数及图形转换工具
提取码:pdsj

同样的需要现在OLED.c文件中修改对应的SCL,SDA的端口,具体参考上述简单使用。

之后我们先学习如何绘制我们想要的图片,使用windows自带的画图功能

设置像素为 128 * 64,然后画出我们想要展示的图形

这里注意一定要保存为.bmp格式

 

然后打开图片转换器,配置为c51模式,打开保存的bmp文件,点击生成即可。

 

我们会得到一个文本文件,打开复制内容备用,在keil 中打开OLED_Font.h文件,找到图片这个选项,粘贴得到的数组即可。这里使用的是二位数组的形式,总共可以存放1024张图片,其实可以更多,这样我们就可以通过简单的索引方式来访问我们需要展示的图片。

最后在main.c中调用bmp显示函数即可

#include "stm32f10x.h"
#include "OLED.h"	// oled显示屏



int main(void)
{ 
	OLED_Init();
	OLED_BMP(0);
	while(1){  //主循环
		
	}
}

 

显示视频

视频就是快速播放的图片,当每秒播放的图片能够达到23帧以上时就可以看作视频,因此只需要提取一个视频的每一帧图片,转为规定格式大小bmp单色图,再通过图形转换工具转换成十六进制code,依次存放在上述的二维数组当中,通过主函数的循环调用就可以了。Proteus的视频仿真效果不是很好IIC的传输效率不够,这里不便展示,如果有条件,就使用实体的OLED屏幕配合单片机效果应该还不错。这里分享一个UP主写的内容:基于stm32的OLED显示(字符,字符串,汉字,图片,动图)_哔哩哔哩_bilibili

备注:可以实现kunkun打篮球的动态显示(博主本人不是小黑子bushi)

 

作者:George lin673

物联沃分享整理
物联沃-IOTWORD物联网 » Proteus仿真中STM32与OLED显示屏的交互实现

发表回复