Arduino STM32F103(BluePill)教程七 基于U8g2的软件IIC控制 OLED1306 128*64

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并下载对应库:
Arduino STM32F103(BluePill)教程七 基于U8g2的软件IIC控制 OLED1306 128*64_第1张图片
下载完成后贴代码:

#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中,每隔一段时间进行一次显示屏初始化,可以实现显示屏的“热插拔"功能。

文章写到这里基本上已经结束,如果喜欢我的代码,请点个赞或者关注。

你可能感兴趣的:(Arduino类)