本示例使用的模块如下
-
STM32F103C8T6核心升级板
-
0.96寸7线OLED模块
很多东西也是从网上学来的,多谢开源的各位大佬
部分参考:https://www.cnblogs.com/dragonet-Z/p/14689345.html
有的参考自己也忘记了…侵删
用到的资料在这里下载:oled相关资料
1 接线及CubeMax配置
模块是从某宝店家买的,所以用模块先看店家的第一手资料(自己不看资料一通乱搞的结果就是时间也花了,心态也炸了)
店家给出的接线方式如下
我们就按照这个方式来配置CubeMax。基本的配置就不说了,这里说SPI和GPIO
SPI配置如下
GPIO配置如下
其中PA5和PA7是硬件SPI的时钟和数据引脚,其余的三个是任意的GPIO输出引脚、
留意一下引脚标签,如果按照图中的写法进行标记在例程中就不需要修改引脚了
此外可以自己添加配置USART方便调试
2 例程移植
这里结合了网上搜罗来的几份例程,研究了一下发现都是大同小异,只是引脚配置等小细节有差别。完整例程下载即可
将oled文件夹放到CubaMax生成的工程文件夹内
打开keil,将oled.c添加入工程
添加.h文件路径
在main.c中添加头文件
oledfont.h在oled.c中已经包含了,如果在mian.h中再包含就会报重定义的错误
点击编译,没有问题就是例程已经移植成功了,接下来就是函数调用了
3显示方法
3. 1 显示字符串
oled在使用前需要初始化,在mian函数中调用初始化函数
中间两个函数是控制正反方向显示和正反色显示的,具体看例程注释
OLED显示文字的原理是我们提前将要显示的文字的像素信息存储到程序中,当要显示的时候,调用函数将文字一个字一个字地画出来,例程中,这些信息存储在oledfont.h中,像这些
这些信息是用软件取模得来的,具体的实现方法在资料中有介绍
得到取模信息后调用显示字符串函数即可
//显示字符串
//x,y:起点坐标 x:0-63,y:0-127
//size1:字体大小,只能选择12、16、24
//*chr:字符串起始地址
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t size1)
这个函数是把要显示的内容写入显存,所以使用完之后还要再调用OLED_Refresh()函数将显存中的内容显示出来
除了直接使用"hello"这种字符串还可以直接显示字符串变量,方法同理
当直接输出"hello"时,之所以要进行强制类型转换是为了消去警告信息
3.2 显示变量
要显示某个变量的值时,我们只要先将变量变成字符串,然后输出字符串即可
我们使用sprintf函数来将变量变成字符串,具体用法见百度
3.3 显示汉字
显示汉字同样是利用点阵信息,汉字的点阵信息像这样
要显示汉字,直接调用函数即可
//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//size1:汉字的字体大小,点阵中是多大,这里就要填多大
//取模方式 列行式
void OLED_ShowChinese(uint8_t x,uint8_t y,uint8_t num,uint8_t size1)
这样是一个汉字一个汉字地显示
例程中也有一次显示多个汉字飘过的函数
//num 显示汉字的个数
//space 每一遍显示的间隔
void OLED_ScrollDisplay(uint8_t num,uint8_t space)
本质还是调用OLED_showChinese函数,如果要调整显示的汉字,修改里面的OLED_showChinese函数即可
注意,space不要调得太大,否则可能只显示一次,不会连续显示,这个函数放在循环内和循坏外的效果是一样的(我也不知道为什么)
3.4 显示bmp图片
显示图片和显示汉字一样,是按像素画出来的,所以显示图片一样要先取模,例程中的图片取模信息存储在bmp.h中
直接调用bmp图片显示函数即可
/*
@brief 显示图片
@param x0:起始列地址
y0:起始页地址
x1:终止列地址
y1:终止页地址
BMP[]:存放图片代码的数组
@retval 无
*/
void OLED_ShowPicture(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t BMP[])
这里的参数需要额外注意
首先y0和y1是页地址而不是以像素为单位的坐标
OLED模块中,每8行像素点为一页,因为总像素是128*64,所以是一共是128列,8页
此外,x的范围(即x1-x0)和y的范围(即y1-y0)要和取模的图片信息一致,不要超了或少了,否则可能会显示不成功。取模软件取模后也能得到图片的像素大小,按照这个去设置参数就好
最后,这个函数并不是将图片信息写入显存在输出到屏幕,所以显存一直没有被更改,不要再调用OLED_Refresh()函数
3.5 显示gif
显示gif便是一张一张地显示bmp,取模好图片信息再调用显示函数即可
/*
@brief 显示动图
@param x0:起始列地址
y0:起始页地址
x1:终止列地址
y1:终止页地址
k: 帧个数
m: 单帧数组大小
BMP[][m]:存放动图代码的数组
@retval 无
*/
void OLED_DrawGIF(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1, unsigned char k, int m, unsigned char GIF[][m])
gif的取模信息会很长,我只取了3帧就有这么长
得到图片取模信息后在循环中调用显示函数即可,如果不在循环中调用,gif只会显示一遍
(这本来是一个打勾的动图,我只截了3帧,看得出在动就行…)