重要叠甲声明: 各位学嵌入式的前辈们,我知道这个项目非常简单,没有技术含量,但这个是面向外行的,所以求轻喷!
器件清单:
-
0.96寸OLED一个(I2C驱动,如下图。确保上面的接口有四个,分别是VCC、GND、SCL、SDA)
-
一个单片机(任何单片机都可以,只要确保你能使用这个单片机成功运行点灯程序),为方便这里采用STM32F103C8T6最小系统板
-
一个底板(可选,只要确保单片机和OLED屏幕正确连接就可以)
步骤
1.画出要显示的图片
特别注意!上文所采用的屏幕分辨率是128x64,所以这里新建图片是分辨率也选择128x64。此外这个屏幕只有黑白两色,所以画的时候也注意使用黑白两色进行绘制。
随手画了一个,大概是这样。
2.使用python将该图片转换为C语言的数组
为执行该程序,确保您已经安装了python,并且安装了pillow库。
from PIL import Image # 导入PIL模块,这是python用于处理图像的模块
img = Image.open("D:\\pic\\pic.png") # 打开图片。确保在此处将图片路径换为上一步画出来的图片的路径!!
f = open("D:\\pic\\pic.h", "w") # 这是生成的C语言数组。确保将此处的路径换成您希望它出现的位置!
f.write("#include<stdint.h>"+"\n"+"uint8_t pic[8][128] = {") # C语言数组的格式
list = [] # 创建一个空列表,用于存放图片对应的数据
for i in range(0,64):
line = []
for j in range(0,128):
# 获取某一点的像素值
pix = img.getpixel((j,i))
# 如果是黑色就写入0,如果是白色就写入1
if(pix[0] < 128 ):
line.append(0)
else:
line.append(1)
list.append(line)
# 将上一部分得到的python列表转换为OLED能识别的数组
for i in range(0,8):
f.write("{")
for j in range(0,128):
a = list[i*8+0][j]+list[i*8+1][j]*2+list[i*8+2][j]*4+list[i*8+3][j]*8+list[i*8+4][j]*16+list[i*8+5][j]*32+list[i*8+6][j]*64+list[i*8+7][j]*128
f.write(str(a))
if j!=127:
f.write(",")
f.write("}")
if i!=7:
f.write(",")
f.write("};")
搭建STM32开发环境
这一步的目标:安装一个软件,该软件可以把您的C语言源代码转换为单片机可以识别的程序。
这里网上有现成的教程,我就不赘述了。贴上两个链接:
环境搭建
创建工程
打开cubeMX,选择单片机型号为stm32f103c8t6。将PB8和PB9两个端口配置为GPIO_Output模式。在Project Manager选项卡中将Toolchain/IDE配置为MDK-ARM。点击右上角的GENERATE CODE生成初始化代码。
编辑工程
OLED驱动文件选用江协科技的:
OLED驱动
打开刚刚生成的工程,将OLED的驱动文件和刚刚用python生成的C头文件统统加入工程。
将OLED.c中这两个函数的原型加入到OLED.h中,这样就可以在主函数中调用这两个函数了。
打开main.c,将OLED.h和OLED.c这两个文件包含进去:
#include "OLED.h"
#include "pic.h"
在主函数的while(1){}代码之前加入如下代码:
OLED_Init();//初始化OLED显示屏
//绘制图案
for(i=0;i<8;i++)
{
for(j=0;j<128;j++)
{
OLED_SetCursor(i,j);
OLED_WriteData(pic[i][j]);
}
}
项目编译及下载
点击build按钮编译项目。然后使用stlink将单片机连接至电脑并点击"load"按钮。
结果
将单片机与OLED正确连接(参考下图)并按单片机上的复位按钮。我这里没有实物,所以使用仿真软件来代替一下。
尾声
如果您在没有开发经验的情况下跟着该博客做到了这里,那么非常棒!您已经超越了绝大多数的电子类专业的学生,电子的世界欢迎您!
如果没做出来也不要气馁,因为电子类专业的学生也是学了将近一学期才学到这里的。