Arduino BluePill (STM32 F103)教程七 基于U8g2的软件IIC控制 OLED1306 128*64
为什么之前有硬件IIC,这里又上软件IIC呢?因为之前在公司做了一个小项目,STM32硬件IIC经常卡死,加入看门狗甚至FreeRTOS都无法解决,后来在查阅正点原子F407探索者资料时才知道,八卦新闻是由于受某大公司专利限制STM硬件IIC是有问题的!
但最常见的OLED1306显示屏是基于IIC或SPI协议的,为了节省IO口,果断选择使用IIC,为保持与之前硬件IIC接线一致性,模拟IIC也使用PB6和PB7(请原谅我之前没细说,STM的IIC相当的不稳定,在F103勘误手册有详细说明)
接线如下:
GND->GND
VCC->3.3
SCL->PB6
SDA->PB7
打开Arduino,点击 项目-加载库-管理库-搜索u8g2并下载对应库:
下载完成后贴代码:
#include <U8g2lib.h> //调用u8g2库
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE); // 使用软件IIC,SCL PB6,SDA PB7
void setup(void)
{
Serial.begin(115200);
u8g2.begin(); // 初始化显示屏
}
long int t = 0;
void loop(void)
{
u8g2.begin(); // 初始化显示屏
u8g2.clearBuffer(); // 清屏
u8g2.setFont(u8g2_font_ncenR12_tr); // 选择12*12字体(具体字体说明可以在git上搜索u8g2查看)
u8g2.drawStr(0, 16, "Hello World!"); //注意这里是0,0开始显示Hello World
u8g2.drawStr(0, 32, "Hello!"); // 注意这里是0,16开始显示Hello!
u8g2.drawStr(0, 48, "Hi!"); // 注意这里是0,32开始显示Hello!
u8g2.setCursor(0, 64); // 设置打印起始地址(下面的t显示在什么地方)
u8g2.print(t); // 显示t
//u8g2.drawStr(48, 64, "C"); // write something to the internal memory
//u8g2.drawStr(112, 64, "%"); // write something to the internal memory
u8g2.sendBuffer(); // 将以上所有的缓存内容显示
Serial.println(t); //串口输出t!
delay(500); //延时0.5秒
t++; //为了区别,t自加1
}
OK,程序并不复杂,但可以解决Bluepill使用IIC卡顿的问题,当然,笔者将u8g2.begin(); 放入loop中,每隔一段时间进行一次显示屏初始化,可以实现显示屏的“热插拔"功能。
文章写到这里基本上已经结束,如果喜欢我的代码,请点个赞或者关注。