本文译自:https://github.com/olikraus/u8g2/wiki/setup_tutorial
本系列文章索引:
u8g2 图形库(1):u8g2 图形库简介
u8g2 图形库(2):u8g2 入门指南
u8g2 图形库(3):u8g2 移植到 STM32 平台
你需要知道所用显示器的控制器(译注:即驱动IC)和显示屏的分辨率(注:u8g2不支持“无控制器”的显示屏)。本文示例中,我们将使用一个 ST7920 128x64 显示屏。它是一个控制器为 ST7920,分辨率为 128x64 的 LCD。
在 U8g2 中,为了正确的初始化和显示你需要选择对应的构造函数。构造函数列表:C++ Setup/Arduino Constructor List
本文示例在:ST7920 128x64 部分
图像的信息需要发送给显示屏,显示器控制器通过物理总线来接收这些数据(通常2根或以上的数据线),通讯协议和命令序列。通常一个显示屏支持多种总线,你需要选择一种并正确的初始化。
物理总线通过特定的IO口接入的高(+5v)低电平(0V)来决定。比如 SSSD1306 OLED,PCB 上的 BS0,BS1,BS2 即是用来选择物理总线的:
左边的小表格,注明了不同物理总线的接法。典型的总线有:
此时,通常需要阅读芯片的说明手册或数据手册,来正确的初始化具体的某一个总线。
有时候总线已经被固定了,无法改变,比如以下这个SSD1306显示器:
显示屏的总线,可以通过它的IO口数量和丝印来猜测,上图中,它看起来就是IIC总线,因为他有SCL和SDA的标签丝印。
在我们最初的例子中,PCB看起来像这样:
根据 ST7920 数据手册,PSB 引脚用来决定 8-bit 或是 SPI总线。若是SPI总线,RS 引脚是片选,E 引脚是时钟输入,RW 是数据线。
注:上图中,PSB 连接到 BLK,BLK又接到GND中上。所以 ST7920 是以SPI 通信的。
要在 Arduino 上显示图像信息,就需要把显示屏和 Arduino 连接起来,根据选择的物理总线,将对应的数字线连接到 Arduino 的输出引脚上。
总的来说,U8g2 可以使用任何 Arduino 板子上的输出引脚,所以使用哪个输出并无关系(但是可以灵活的选择特定的IO口,使用外设输出以提高通信速度)。
我建议写下引脚号对应关系,比如显示器控制器ST7920:
Display | Arduino pin NumberS |
---|---|
E,Clock | 13 |
RW,Data,MOSI | 11 |
RS,Chip Seclect | 10 |
RST,Reset | 8 |
注意:RS(PCB上丝印 RS )意思为“寄存器选择”,但是在SPI模式,RS 是片选的作用。
记得把PSB引脚连接GND,也要查看数据手册,给显示屏的V0输入脚提供正确的电压。
U8g2 需要知道硬件引脚的对应关系,引脚号作为参数提供给 U8g2 的构造函数,其中各个参数对应各个引脚。
根据这个列表,构造函数有模板如下(对象名 u8g2):
U8G2_ST7920_128X64_1_SW_SPI u8g2(rotation, clock, data, cs [, reset])
在 “rotation”(旋转)参数后面,构造函数接收一个时钟引脚号,数据脚号,片选信号,最后的复位信号线是可选的。
例子中包括了类似的构造函数,你可以取消注释其中的一个,如果有必要,更新引脚号:
U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 8);
一个完整的例子如下所示:
#include
#include
#include
#include
U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 8);
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,24,"Hello World!");
} while ( u8g2.nextPage() );
}
U8g2 支持3中不同的绘图模式:
从 这里 选择一个 U8g2 的构造器,全屏缓存模式的构造器包含了“F”,比如:
U8G2_ST7920_128X64_ F _SW_SPI(rotation, clock, data, cs [, reset])
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,20,"Hello World!");
u8g2.sendBuffer();
}
从 这里 选择一个 U8g2 的构造器,全屏缓存模式的构造器包含了“1”,或者“2,”比如:
U8G2_ST7920_128X64_ 1 _SW_SPI(rotation, clock, data, cs [, reset])
注:在循环体内总是绘制同一张图片。相见:这里。
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,24,"Hello World!");
} while ( u8g2.nextPage() );
}
从之类选择一个U8x8 构造器,比如:
U8X8_ST7565_EA_DOGM128_4W_SW_SPI u8x8(clock, data, cs, dc [, reset]
所有的绘制指令直接写入显示器
void setup(void) {
u8x8.begin();
}
void loop(void) {
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.drawString(0,1,"Hello World!");
}