本帖最后由 小恶魔owo 于 2024-11-23 00:19 编辑

(一)简介
187d66060f387ad82a98d5fdfd8c2d7.png
0.96寸OLED显示屏是一种小型的显示设备,常用于电子项目中。它采用IIC(I2C)通信协议进行数据传输,具有低功耗、高对比度的优点。该显示屏的分辨率为128x64,支持多种显示方式,如文字、图形等。其驱动芯片通常为SSD1306,可以灵活控制屏幕的亮度、对比度等参数。

屏幕参数
工作电压: 3.3V
工作电流: 9MA
模块尺寸: 27.3 x 27.8 MM
像素大小: 128(H) x 64(V)RGB
驱动芯片: SSD1306
通信协议: IIC
管脚数量: 4 Pin(2.54mm间距排针)


(二)库文件
U8G2库
项目地址:https://github.com/olikraus/u8g2
U8g2库是一个用于嵌入式设备的单色图形库,全称为“Universal 8bit Graphics Library version2”,由Oliver Kraus开发,专门为微控制器设计,用于驱动各种单色LCD和OLED显示屏。以下是对Arduino U8g2库的详细介绍,包括其主要函数:

一、U8g2库特点
  • 跨平台性:U8g2可以在不同的微控制器平台上运行,如Arduino、STM32、ESP32/ESP8266等。
  • 多种显示支持:支持多种单色显示设备,包括LCD和OLED。
  • 字体支持:U8g2内置了多种字体,包括不同大小的字体和特殊字体(包括中文)。
  • 易用性:U8g2的API设计简单易用,方便开发者快速上手。
  • 低内存占用:U8g2在设计中考虑到了嵌入式设备的资源限制,尽量减少了内存的使用。
  • 开源:U8g2是开源的,可以自由使用和修改。

二、U8g2库函数

U8g2库提供了丰富的API,用于控制各种显示器并在屏幕上绘制文本、图形等元素。以下是一些常用的函数:

  • 初始化函数
    • u8g2_Setup():根据具体的显示设备和配置,初始化U8g2对象。例如,u8g2_Setup_ssd1306_i2c_128x64_noname_f()用于初始化SSD1306 OLED显示屏。
    • u8g2.begin() 或 u8g2.beginSimple():构造U8G2对象,并初始化显示控制器。
  • 显示控制函数
    • u8g2.initDisplay():初始化显示控制器,写入关键显示参数。
    • u8g2.clearDisplay():清除屏幕内容。
    • u8g2.setPowerSave():开启或关闭省电模式。
    • u8g2.clearBuffer():清除缓冲区,但不清除屏幕。通常与u8g2.sendBuffer()配对使用,以刷新显示。
  • 绘制函数
    • u8g2.drawBox():绘制实心方形。
    • u8g2.drawCircle():绘制空心圆。
    • u8g2.drawDisc():绘制实心圆。
    • u8g2.drawEllipse():绘制空心椭圆。
    • u8g2.drawFilledEllipse():绘制实心椭圆。
    • u8g2.drawFrame():绘制空心方形(矩形框)。
    • u8g2.drawGlyph():绘制字体字集的符号。
    • u8g2.drawHLine():绘制水平线。
    • u8g2.drawLine():在两点之间绘制直线。
    • u8g2.drawPixel():绘制像素点。
    • u8g2.drawRBox():绘制圆角实心方形。
    • u8g2.drawRFrame():绘制圆角空心方形。
    • u8g2.drawStr():在指定位置绘制字符串。
    • u8g2.drawTriangle():绘制实心三角形。
    • u8g2.drawUTF8():绘制UTF8编码的字符(可显示汉字)。
    • u8g2.drawVLine():绘制竖直线。
    • u8g2.drawXBM()/drawXBMP():绘制XBM格式的图像。
  • 显示配置函数
    • u8g2.setFont():设置当前使用的字体。
    • u8g2.setDisplayRotation():设置显示器的旋转角度。
    • u8g2.setAutoPageClear():设置是否自动清除缓冲区。
    • u8g2.setBitmapMode():设置位图模式。
    • u8g2.setCursor():设置绘制光标位置。
    • u8g2.setDrawColor():设置绘制颜色(对于单色显示屏,通常只支持黑白两种颜色)。
  • 其他函数
    • u8g2.disableUTF8Print():禁用UTF8打印功能。
    • u8g2.enableUTF8Print():启用UTF8打印功能。
    • u8g2.home():重置显示光标的位置到原点(0,0)。
    • u8g2.firstPage()/u8g2.nextPage():用于分页绘制大型图像或图形时的控制函数。
    • u8g2.sendBuffer():将缓冲区的内容发送到屏幕,以刷新显示。
    • u8g2.getBufferPtr():获取缓存空间的地址。
    • u8g2.getDisplayHeight()/u8g2.getDisplayWidth():获取显示器的高度和宽度。
8. u8g2.getMaxCharHeight()/u8g2.getMaxCharWidth():获取当前字体里的最大字符的高度和宽度。


(三)程序
①先引入标准的arduino库,还有u8g2库,wire库是iic通信库,配合u8g2用的
  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #include <Wire.h>

②定义宏BOARD_I2C_SCL为A5,BOARD_I2C_SDA为A4
因为arduino uno内A5为SCL,A4为SDA
image.png
声明u8g2库,NONAME_F_SW_I2C为软件模拟,也可以用硬件模拟
U8G2_R0为不旋转屏幕
clock设置SCL引脚A5,data设置SDA引脚A4
复位功能为U8X8_PIN_NONE,不使用
  1. #define BOARD_I2C_SCL   A5
  2. #define BOARD_I2C_SDA   A4   

  3. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);


③初始化函数
设置波特率为115200,同时输出一条测试信息
u8g2开始初始化
u8g2设置u8g2_font_ncenB08_tr字体
(u8g2内置非常多字体,具体到GitHub查看)
  1. void setup() {
  2.   Serial.begin(115200);
  3.   Serial.println("Init u8g2 ....");
  4.   u8g2.begin();
  5.   u8g2.setFont(u8g2_font_ncenB08_tr); //设置字体
  6.   delay(100);
  7. }


④循环函数
将屏幕的缓存区清空
在屏幕10,10的位置上,输出“good”,并将此数据上传到缓存区显示
  1. void loop() {
  2.    u8g2.clearBuffer();  //清除缓存     
  3.     Serial.println("u8g2 showing chars ....");
  4.       u8g2.setCursor (10, 10);

  5.   u8g2.println("good");
  6.   u8g2.sendBuffer();
  7.     delay(1000);
  8. }


⑤实验现象
2fc3996f11b77df3f3166745a3ec0b2.jpg


⑥完整代码
  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #include <Wire.h>

  4. #define BOARD_I2C_SCL   A5
  5. #define BOARD_I2C_SDA   A4   

  6. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);  


  7. void setup() {
  8.   // put your setup code here, to run once:
  9.   Serial.begin(115200);
  10.   Serial.println("Init u8g2 ....");
  11.   u8g2.begin();
  12.   u8g2.setFont(u8g2_font_ncenB08_tr); //设置字体


  13.   delay(100);
  14. }

  15. void loop() {
  16.    u8g2.clearBuffer();  //清除缓存     
  17.     Serial.println("u8g2 showing chars ....");
  18.       u8g2.setCursor (10, 10);

  19.   u8g2.println("good");
  20.   u8g2.sendBuffer();
  21.     delay(1000);
  22. }