参考1:
0. Arduino驱动LED128X64 - U8g2 自定义中文字库_
常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制
本人推荐u8g2这个库函数来控制,不管是4线还是6线都可以用u8g2这个库函数来控制。
OLED其实就是一个M x n 的像素点阵,想显示什么就得把具体位置的像素点亮起来。对于每一个像素点,有可能是1点亮,也有可能是0点亮;
1
只需要了解原理即可,不需要了解很深入。
I2C通讯:I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
SPI通讯:SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。
对于4线OLED,直接使用I2C通讯。(u8g2库)
OLED0.96 IIC模块使用IIC通信接口,只需要接4根线就可以完成OLED屏数据通信
VCC接到开发板的5V电源引脚上,GND接到开发板GND引脚上,SCL和SDA需要根据不同的开发板引脚定义来接线Arduino – Wire 库 – 太极创客
用OLED模块显示英文用的最多,显示汉字、显示图片,这类不常用的。
#include
#include
#ifdef U8X8_HAVE_HW_I2C
#include
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,SCL,SDA,U8X8_PIN_NONE);
void setup(void)
{
u8g2.begin();
}
void loop(void)
{
u8g2.clearBuffer(); //清除缓存
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0,10,"Hello World!");
u8g2.drawStr(0,20,"This is bro cainiao!");
u8g2.drawStr(0,30,"Welcome to U8G2!");
u8g2.sendBuffer(); //显示
delay(1000);
}
对于6线OLED,直接使用SPI通讯。(u8g2库)
六针oled屏没有CS接口,其在硬件中直接接地(只有一个SPI从机时,CS可以不使用);此外,Arduino发送指令和数据到 OLED,OLED 并不需要反馈任何数据。因此, OLED 模块是只有 MOSI(SDA)引脚,没 有 MISO 引脚的。
GND:电源地
VCC:2.2V~5.5V
SCL(D0):CLK 时钟 (高电平 2.2V~5.5V)
SDA(D1):MOSI 数据(高电平 2.2V~5.5V)
RST:复位(高电平 2.2V~5.5V)
D/C:数据/命令(高电平 2.2V~5.5V)
U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2 (U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7); //这个定义脚代码细心看就懂了。
U8G2_R0 是一个参数: 指定大局显示的基本布局:
布局 | 描述 |
---|---|
U8G2_R0 | 正常显示 |
U8G2_R1 | 90度顺时针旋转 |
U8G2_R2 | 180度顺时针旋转 |
U8G2_R3 | 270度顺时针旋转 |
U8G2_MIRROR | 正常显示镜像内容(v2.6.x版本以上使用) 注意:U8G2_MIRROR需要与setFlipMode()配搭使用. |
U8G2支持的OLED控制芯片: https://github.com/olikraus/u8g2/wiki/gallery
不同芯片的不同脚定义代码: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
通过这段程序的定义,我们知道:
OLED模块上的 SCL 对应于 clock
OLED模块上的 SDA 对应于 data
OLED模块上的 RES 对应于 reset
OLED模块上的 DC 对应于 dc
其中CS不管,CS是应用在7线OLED屏幕上面的,用的少!((CS脚可以不接)
对于使用SPI通讯控制6线OLED,OLED与主控板的连线可以自定义,读者可以自己编辑。 但这些需要连接到数字IO 上面。
/*
PrintUTF8.ino
Use the (Arduino compatible) u8g2 function "print" to draw a text.
Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
*/
#include
#include
#ifdef U8X8_HAVE_HW_SPI
#include
#endif
#ifdef U8X8_HAVE_HW_I2C
#include
#endif
/*
U8g2lib Example Overview:
Frame Buffer Examples: clearBuffer/sendBuffer. Fast, but may not work with all Arduino boards because of RAM consumption
Page Buffer Examples: firstPage/nextPage. Less RAM usage, should work with all Arduino boards.
U8x8 Text Only Example: No RAM usage, direct communication with display controller. No graphics, 8x8 Text only.
翻译:U8g2lib 示例概览:
帧缓冲区示例:clearBuffer/sendBuffer。速度快,但由于占用 RAM,可能不适用于所有 Arduino 板
页面缓冲区示例:firstPage/nextPage。内存占用较少,适用于所有 Arduino 板。
U8x8 纯文本示例: 不使用 RAM,直接与显示控制器通信。无图形,仅 8x8 文本。
*/
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}
void loop(void) {
u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("Hello World!");
u8g2.setCursor(0, 40);
u8g2.print("你好世界"); // Chinese "Hello World"
u8g2.sendBuffer();
delay(1000);
}
#include
#include
#include
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
void setup(void)
{
u8g2.begin(); //选择U8G2模式,或者U8X8模式
}
void loop(void)
{
u8g2.clearBuffer(); // 清除内部缓冲区
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,"Hello World!"); // write something to the internal memory
u8g2.drawStr(0,20,"This is EHANG!"); // write something to the internal memory
u8g2.drawStr(0,30,"Welcome to U8G2!"); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
}
网上很多类似这种的语法,个人建议不要这样使用,代码的移植性会很差的:不要按照此例程来书写!!!
void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,15,"Hello World!");
} while ( u8g2.nextPage() );
delay(1000);
}
用Arduino控制OLED,就用U8G2这个库函数就可以了,直接点击“加载库”,就可以在IDE里面自行安装库函数的。
使用上述例程就能达到显示多行英文的目的,如果读者做实验出现显示不全等现象,可能是:
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
这个引脚定义出了问题。关于如何定义,参考此篇文章:点击进入
前面的一串英文定义很讲究的**(U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI)**
显示不全,就去检查这个函数。
通过SPI通讯时,引脚可以自定义,但是需要接在数字引脚上;使用I2C通讯时,OLED上面的引脚必须要和开发板上面的I2C引脚对应起来接线!