本文译自:https://github.com/olikraus/u8g2/wiki/setup_tutorial

本系列文章索引:
u8g2 图形库(1):u8g2 图形库简介
u8g2 图形库(2):u8g2 入门指南
u8g2 图形库(3):u8g2 移植到 STM32 平台


如何在显示屏上使用 U8g2 库

显示屏

你需要知道所用显示器的控制器(译注:即驱动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 即是用来选择物理总线的:
在这里插入图片描述
左边的小表格,注明了不同物理总线的接法。典型的总线有:

  • 3SPI,3线SPI:3条信号线的串行接口:时钟,数据和片选
  • 4SPI,4线SPI:和3线相同,但是多了一个命令数据线(一般丝印为;D/C,RS,或者A0)
  • I2C,IIC或TWI:2根信号线的集成电路总线:时钟(SCL)和数据(SDA)
  • 8080:8位数据总线,需要8数据线,片选线和读写数据线
  • 6800:另外一种8bit纵向,但是协议是不一样的

此时,通常需要阅读芯片的说明手册或数据手册,来正确的初始化具体的某一个总线。

有时候总线已经被固定了,无法改变,比如以下这个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:

DisplayArduino pin NumberS
E,Clock13
RW,Data,MOSI11
RS,Chip Seclect10
RST,Reset8

注意:RS(PCB上丝印 RS )意思为“寄存器选择”,但是在SPI模式,RS 是片选的作用。

在这里插入图片描述
记得把PSB引脚连接GND,也要查看数据手册,给显示屏的V0输入脚提供正确的电压。

U8g2 初始化

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 <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

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 完整缓存(full buffer),页面缓存(page buffer)和u8x8 模式

U8g2 支持3中不同的绘图模式:

  • 全屏缓存模式
  • 页面模式(U8glib 图片轮询)
  • U8c8,纯字符模式

全屏缓存模式(full buffer)

优缺点

  • 快速
  • 可使用所有的图形程序
  • 需要大量的内存(RAM)

初始化

这里 选择一个 U8g2 的构造器,全屏缓存模式的构造器包含了“F”,比如:
U8G2_ST7920_128X64_ F _SW_SPI(rotation, clock, data, cs [, reset])

使用

  1. 清除缓存内容:u8g2.clearBuffer()。
  2. 使用绘图指令绘制图形
  3. 发送缓存数据给显示器以显示:u8g2.sendBuffer()

示例

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB14_tr);
  u8g2.drawStr(0,20,"Hello World!");
  u8g2.sendBuffer();
}

页面缓存模式(图片轮询)

优缺点

  • 所有的图形程序可用
  • 要求少量的内存(RAM)
  • 速度慢

初始化

这里 选择一个 U8g2 的构造器,全屏缓存模式的构造器包含了“1”,或者“2,”比如:
U8G2_ST7920_128X64_ 1 _SW_SPI(rotation, clock, data, cs [, reset])

使用

  1. 调用 u8g2.firstPage()
  2. 运行一个 do-while 循环
  3. 在循环体内绘制一些图形
  4. 循环到U8g2.nextPage()返回真结束

注:在循环体内总是绘制同一张图片。相见:这里

示例

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 字符模式

优缺点

  • 快速
  • 不需要内存(RAM)
  • 不能绘制图形
  • 不支持所有显示控制器

初始化

从之类选择一个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!");
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐