介绍
本博客适合有一定基础的单片机学习爱好者。
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)
标签:Column,void,uint8,STM32,OLED,Proteus,Line,图片 From: https://blog.csdn.net/2302_80954675/article/details/142185029