U8g2:超省内存+海量字体的显示库

你是不是也遇到过这种事:单色OLED、小点阵LCD买回家,折腾半天库不兼容、字符宽度怪怪的、花里胡哨的图形连条直线都画不出来?别急,我最近刷到一个宝藏库——U8g2,真心好用,赶紧搬给你们!

为什么需要U8g2
日常做嵌入式项目,经常要在小小屏幕上显示文字、图形。可是市面上各种屏幕控制器(SSD1306、ST7565、KS0108……)各有各的指令集,光找示例就头大。

  • • 库不统一,切换硬件还得重写一大堆初始化

  • • 字库死板,16×16不够,24×24又占太多内存

  • • 有的库只能画点、字符,想要线条、圆形、倒影啥的画不出来

  • 图片

U8g2 是什么神器?
U8g2,全称 “Universal Graphics Library for Monochrome Displays, version 2”,专门给单色 OLED/LCD 量身定做,集成:

  • • 线/框/圆/三角等常用图形绘制

  • • 支持上百种像素级字体(从5×7到72pt都能用)

  • • Buffer 模式(Microcontroller 里先渲染,再一次写入屏幕)

  • • U8x8 子库:8×8 栅格纯字符模式,无缓冲,超省内存

Ta 支持哪些屏?
U8g2 支持超多控制器,常见的有:

控制器

应用场景

SSD1306

0.96″/1.3″ OLED

SH1106

1.3″ OLED

ST7565

小点阵LCD

PCD8544

奔驰诺基亚 5110

MAX7219

点阵数码管

…

…

快速上手:Arduino 示例,仅供参考
下面演示一下,给 SSD1306 0.96″ OLED 画条直线、写段文字:

#include <U8g2lib.h>
// 硬件 SPI,CS:10, DC:9, RESET:8
U8G2_SSD1306_128X64_NONAME_F_HW_SPI u8g2(
  U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8)
;

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

void loop() {
  u8g2.clearBuffer();// 清空缓存
  u8g2.setFont(u8g2_font_ncenB08_tr);// 选择字体
  u8g2.drawStr(0,10,"Hello U8g2!");// 画文字
  u8g2.drawLine(0,12,127,12);// 画直线
  u8g2.sendBuffer();// 刷新到屏幕
  delay(1000);
}

它到底解决了啥痛点?

  • • 统一 API:屏幕换来换去,调用方式几乎不变

  • • 丰富字体:内置几十种 TTF 转成的点阵字库,随便挑

  • • 图形全家桶:画直线、矩形、圆弧、Bezier 曲线都能用

  • • 性能可选:FULL buffer(流畅) vs PAGE buffer(节省 RAM)

  • • 超省心:官方例程齐全,无需手撸底层指令

优缺点一览表

特性

优点

缺点

功能丰富

支持字体多、图形绘制全

全缓冲模式下要占用几 KB RAM

兼容性

几百款控制器,Arduino/RPi/C 端都行

某些边缘控制器驱动需手动适配

易用性

一致的接口、示例代码完备

学习曲线:buffer/page 模式需理解

性能

页模式可省内存,流畅度也不错

页模式下闪屏、图形闪烁稍显明显

小结
U8g2 真的为单色屏带来了“开箱即用”的体验,无论你是要做仪表盘、信息展示牌还是搞创意像素 art,都能轻松胜任。只要你有几 KB RAM,就能花式炫图、拼字,甩开底层烦恼。

项目地址:https://github.com/olikraus/u8g2

发表评论