Arduino库之U8g2lib

某些图片、表格在手机竖屏状态下会显示不全,横屏显示即可。最好是用平板或电脑看。大部分内容摘自官网。

简介

U8g2

U8g2

  U8glib是用于单色显示屏的图形库,它可以用于51、Arduino、ARM控制显示屏,目前作者olikraus已经更新到version2了,也就是U8g2lib(下面简称U8g2)。U8g2这个库实际上包含两个库(api):U8g2和U8x8,它们有如下特点:

  • U8g2
    • 可处理所有图形
    • 支持很多字体(。(几乎)对字体大小没限制
    • 微控制器需要一定的存储空间来传递显示
  • U8x8
    • 只能输出文字
    • 只能输出固定像素的字体
    • 直接输出到显示屏,微控制器无需缓冲区

  这两个库还包含一个特殊的类(也能看作一个子库):U8log,它能模拟一个输出终端,功能如下:

  • U8log
    • Output of boot/startup information 输出初始化信息
    • Error logging 载入错误
    • Debugging logging 载入debug
    • Output of sensor values 输出传感器值(我看上的是这一点)

  我在这里只给出Arduino相关的部分,51和ARM大同小异。下面我们结合实际操作来学习。


安装U8g2

  进入Arduino IDE,点击上方“工具”-“管理库”,搜索U8g2,选择U8g2 by oliver那个,点击安装即可。

安装U8g2


Hello World!

  按照惯例,我们先输出一个Hello World!。点击上方“文件”-“示例”-“U8g2”-“full_buffer”-“HelloWorld”,先不要急着上传到Arduino,要先根据你的屏幕控制器、像素,删掉其中一个注释的//。我的型号是淘宝上常见的0.96 OLED(下图),所以我用的是这句:U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

我的OLED

  上传,接好线,上电,就可以看到屏幕上出现”Hello World!“(位置可能和上图不一样)。


配置

  虽然上面的”HelloWorld“看起来很长,但实际上只有以下几句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);void setup(void) {u8g2.begin();
}void loop(void) {u8g2.clearBuffer();         // clear the internal memoryu8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable fontu8g2.drawStr(0,10,"Hello World!");  // write something to the internal memoryu8g2.sendBuffer();          // transfer internal memory to the displaydelay(1000);  
}

  开头第一句是引用U8g2,我们着重看第二句,它就是配置”Setup“,具体分成以下几部分:

DescriptionExample
前缀U8G2
控制器(驱动器)SSD1306
显示屏128x64_NONAME
缓冲区大小12、或F(full)
通信协议HW_I2C
参数(U8G2_R0, U8x8_PIN_NONE)

控制器/显示屏名字

  这个没什么好讲的,一般淘宝上都会标出来,实在不知道就问商家,再不行就挨个试一下符合像素的那几句。

缓冲区大小

  1表示RAM中只会储存一页画面的缓冲。你需要用一个firstPage()/nextPage()循环来显示。

  2和1类似,但会储存两页。官网还说21的两倍快,但我实在不知道”快“指的是什么。

  F表示“full frame buffer”,储存所有页面,用clearBuffer()来清除缓冲,用sendBuffer()来把缓冲发送到显示屏。

  这一部分还没完全弄懂,貌似就是F相当于一本书,你可以预先在书上画很多页,然后要显示哪一页就翻到那里。1就相当于一块黑板,你只能画一页东西,要显示新的东西就要重新擦掉重画。2就是两块黑板。

通信协议

  支持常见的SPI、I2C、6800和8080,支持硬件HW和软件SW,具体有下面几种:

通信协议描述
4W_SW_SPI4线(clock, data, cs and dc)软件模拟SPI
4W_HW_SPI4线(clock, data, cs and dc)硬件SPI(基于SPI库)
2ND_4W_HW_SPI如果板子支持,第二个 4线硬件SPI
3W_SW_SPI3线(clock, data and cs)软件模拟SPI
SW_I2C软件模拟 I2C/TWI
HW_I2C硬件 I2C (基于Wire库)
2ND_HW_I2C如果板子支持,第二个 硬件 I2C (基于Wire库)
68008-bit并行接口,6800协议
80808-bit并行接口,8080协议

  软件模拟 I2C 需要设置SCL,SDA对应管脚:..._SW_I2C(clock, data [, reset])

旋转

  这是配置语句的第一个参数,有如下几种选择:

旋转/镜像描述
U8G2_R0不旋转
U8G2_R1顺时针旋转90度
U8G2_R2顺时针旋转180度
U8G2_R3顺时针旋转270度
U8G2_MIRROR不旋转,镜像翻转

接线

  官网上的表格:

Pin ArgumentDescriptionDatasheet Names
clockSPI or I2C clock lineSCL, SCLK, …
dataSPI or I2C data lineSDA, MOSI, SDIN, …
d0 … d7Data lines of the parallel interfaceD0 … D7
csChip select lineCS
dcData/command selection line (register select)D/C, A0, RS, …
enable“Write” for the 8080 interface, “enable” for the 6800 interface8080: WR, 6800: E
resetReset line

  如果你不需要用某个引脚但又需要一个参数,可以用U8X8_PIN_NONE

16 Bit模式

  U8g2默认是8 Bit Mode,如果你的设备支持 256或以上的像素宽,你可以在u8g2.h文件中取消注释//#define U8G2_16BIT

SSD1306 128X64_NONAME

  由于这个模块比较常用,所以我把它的详细介绍搬了过来。其他模块请去官网。(显示不全的话请横屏查看)

Controller “ssd1306”, Display “128x64_noname”Descirption
U8G2_SSD1306_128X64_NONAME_1_SW_I2C(rotation, clock, data [, reset])page buffer, size = 128 bytes
U8G2_SSD1306_128X64_NONAME_2_SW_I2C(rotation, clock, data [, reset])page buffer, size = 256 bytes
U8G2_SSD1306_128X64_NONAME_F_SW_I2C(rotation, clock, data [, reset])full framebuffer, size = 1024 bytes
U8G2_SSD1306_128X64_NONAME_1_HW_I2C(rotation, [reset [, clock, data]])page buffer, size = 128 bytes
U8G2_SSD1306_128X64_NONAME_2_HW_I2C(rotation, [reset [, clock, data]])page buffer, size = 256 bytes
U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rotation, [reset [, clock, data]])full framebuffer, size = 1024 bytes
U8G2_SSD1306_128X64_NONAME_1_2ND_HW_I2C(rotation, [reset])page buffer, size = 128 bytes
U8G2_SSD1306_128X64_NONAME_2_2ND_HW_I2C(rotation, [reset])page buffer, size = 256 bytes
U8G2_SSD1306_128X64_NONAME_F_2ND_HW_I2C(rotation, [reset])full framebuffer, size = 1024 bytes

控制函数

  下面一些控制函数,能对全局进行操作。写得有点乱。

begin

  • 函数原型:

    1
    2
    bool U8G2::begin(void)
    bool U8G2::begin(uint8_t menu_select_pin, uint8_t menu_next_pin, uint8_t menu_prev_pin, uint8_t menu_up_pin = U8X8_PIN_NONE, uint8_t menu_down_pin = U8X8_PIN_NONE, uint8_t menu_home_pin = U8X8_PIN_NONE)
    
  • 描述:用上面的配置设置显示屏,并且会清空显示屏,退出显示屏的省电模式。还可以设置按键:将按键的对应引脚传递到对应参数(按键要求低有效),用getMenuEvent来检查按键事件,从而构建用户交互界面。

  • 这个函数会调用:

    1. initDisplay
    2. clearDisplay
    3. setPowerSave
  • 返回值:永远是1/true

  • 相关:initDisplay, setPowerSave, clearDisplay, U8X8::begin

  • 例子:这个函数一般放在void setup(void)里面:

    1
    2
    3
    void setup(void) {u8g2.begin();
    }
    

initDisplay

  • 函数原型:

    1
    void U8G2::initDisplay(void) 
    
  • 描述:重新设置显示屏。显示前一定要先调用这个函数。它会让屏幕处在省电模式。要让屏幕显示,先取消省电模式(setPowerSave)
  • 相关:setPowerSave, begin

setPowerSave

  • 原型:

    1
    1
    void U8G2::setPowerSave(uint8_t is_enable)
    
  • 描述:开启(is_enable=1)或关闭(is_enable=0)显示屏的省电模式。当省电模式开启时,屏幕上的内容不可见,屏幕RAM的内容未更改。这个函数在begin被调用。

  • 参数:

    • is_enable:开启(1)或关闭(0)显示屏的省电模式。
  • 相关:begin

clear

  • 函数原型:

    1
    void U8G2::clear(void)
    
  • 描述:清空屏幕(display)和缓冲区(buffer)的所有像素(说实话我分不清这俩)。将print的指针(cursor)归位到左上角。
  • 这个函数会调用:
    1. home
    2. clearDisplay
    3. clearBuffer
  • 相关:home, clearDisplay, clearBuffer

home

  • 函数原型:

    1
    void U8G2::home(void)
    
  • 描述:将print函数的指针(游标cursor)重置到左上角。如果字体的参考点不在上方的话,字体的一部分会看不见。

  • 相关:print, clear, setCursor

clearDisplay

  • 函数原型:

    1
    void U8G2::clearDisplay(void)  
    
  • 描述:清空内部和显示屏的缓冲区的像素。这个函数在begin函数内被调用,因此除了初始化时之外,无需再调用这个函数。其他函数,如 sendBuffer 和 nextPage) ,也能覆盖/清空显示。

  • 注:

    • 这个命令可以对_F__1__2_三种缓冲区大小都有效
    • 不要在单页的循环内使用这个命令(在firstPage和nextPage)
  • 相关:begin

clearBuffer

  • 函数原型:

    1
    void U8G2::clearBuffer(void)
    
  • 描述:清空内部缓冲区的所有像素。清楚后,用 sendBuffer 来将新的页面传递给显示屏。这个函数只对_F_(储存所有页面)的情况有效(见上面的缓冲器大小)。它还会发送一个刷新信号(refreshDisplay)给墨水屏。

  • 相关:sendBuffer

  • 示例:

    1
    2
    3
    4
    5
    void loop(void) {u8g2.clearBuffer();// ... write something to the buffer u8g2.sendBuffer();delay(1000);
    

sendBuffer

  • 函数原型:

    1
    void U8G2::sendBuffer(void) 
    
  • 描述:将内存缓冲区中的内容发送给显示。用 clearBuffer清空缓冲区,用绘画函数向缓冲区添加内容。这个函数只对_F_(储存所有页面)的情况有效(见上面的缓冲器大小)。它还会发送一个刷新信号(refreshDisplay)给墨水屏。

  • 注:有点复杂,把英文抄下来:

    Actually this procedure will send the current page to the display. This means, the content of the internal pixel buffer will be placed in the tile row given by the current page position. This means, that this procedure could be used for partial updates on paged devices (constructor with buffer option “1” or “2”). However, this will only work for LCDs. It will not work with most e-Paper/e-Ink devices because of the buffer switch in the display controller. Conclusion: Use this command only together with full buffer constructors. It will then work with all LCDs and e-Paper/e-Ink devices.

  • 相关:clearBuffer, updateDisplay

firstPage

  • 函数原型

    1
    void U8G2::firstPage(void)
    
  • 描述:这个和nextPage一起构成图像循环,将内容发送到显示屏。有一些限制:不要在执行循环时更改显示内容。循环时总是重新绘制所有内容,而非一部分。这样能节约ram,参考sendBuffer。

  • 相关:nextPage

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    4
    5
    6
    7
    u8g2.firstPage();do {/* all graphics commands have to appear within the loop body. */    u8g2.setFont(u8g2_font_ncenB14_tr);u8g2.drawStr(0,20,"Hello World!");} while ( u8g2.nextPage() );

nextPage

  • 函数原型:

    1
    uint8_t U8G2::nextPage(void)
    
  • 描述:这个和firstPage一起构成图像循环,将内容发送到显示屏。有一些限制:不要在执行循环时更改显示内容。循环时总是重新绘制所有内容,而非一部分。这样能节约ram,参考sendBuffer。完成循环后,这个函数会发送一个刷新命令(refreshDisplay)给墨水屏(在返回0之前)。

  • 返回值:0,在循环完成后(所有数据都传送给屏幕)。

  • 相关:firstPage

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    4
    5
    6
    7
    u8g2.firstPage();do {/* all graphics commands have to appear within the loop body. */    u8g2.setFont(u8g2_font_ncenB14_tr);u8g2.drawStr(0,20,"Hello World!");} while ( u8g2.nextPage() );

disableUTF8Print

  • 函数原型:

    1
    void U8G2::disableUTF8Print(void)
    
  • 描述:禁止print函数用UTF8。这是默认设置。

  • 相关:print, enableUTF8Print

enableUTF8Print

  • 函数原型:

    1
    void U8G2::enableUTF8Print(void)
    
  • 描述:允许print函数用UTF8。当其有效时,可以传递unicode符号的字符串给print函数。通常这个函数在begin后被调用:

    1
    2
    3
    4
    void setup(void) {u8g2.begin();u8g2.enableUTF8Print();		// enable UTF8 support for the Arduino print()
    }
    
  • 相关:print, disableUTF8Print

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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.firstPage();do {u8g2.setCursor(0, 40);u8g2.print("你好世界");		// Chinese "Hello World" } while ( u8g2.nextPage() );delay(1000);
    }
    

setI2CAddress

  • 函数原型

    1
    void U8G2::setI2CAddress(uint8_t adr)
    
  • 描述:默认情况,U8g2假设显示屏为最不可能的地址(原文为:By default, U8g2 assumes the lowest possible I2C address of the display.)。如果需要设置一个不同的地址,请在begin()之前调用这个函数。

  • 参数:I2C地址乘以2(我也不知道为什么,我用I2C_scan程序扫描到的地址为0x3C,但只有输入0x78(0x3C*2=0x78)才有效),并且最低位必须为0(才能写)

  • 相关:begin

  • 注:U8g2 v2.6.x才可用。

绘图函数

  这类函数有一个特点,就是都以draw开头,可以画各种点、线、形。需要注意的是,下面的所有坐标都是以左上角为(0, 0),正方向为向右和向下。测试时可用如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);void setup(void) {u8g2.begin();
}void loop(void) {u8g2.firstPage();do {/*graphics commands*/} while ( u8g2.nextPage() ); 
}

drawPixel

  • 函数原型:

    1
    void U8G2::drawPixel(u8g2_uint_t x, u8g2_uint_t y)
    
  • 描述:在特定的x/y位置画一个点。(0, 0)为左上角。可能会超出屏幕边界。这个程序会用当前颜色(setDrawColor)来画,颜色0会清除一个像素,颜色1会设置一个像素。

  • 参数:

    • x:x坐标
    • y:y坐标
  • 相关:setDrawColor

drawBitmap

  • 函数原型:

    1
    void U8G2::drawBitmap(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t cnt, u8g2_uint_t h, const uint8_t *bitmap)
    
  • 描述:在特定的x/y处画一个位图(x/y对应位图的左上角)。位图的一部分可能会超出屏幕边界。位图由bitmap数组给定。

  • 参数:

    • x:x坐标(位图的左上角)
    • y:y坐标(位图的左上角)
    • cnt:水平方向上位图的字数。位图的宽度=cnt*8。
    • h:位图的高度
  • 注:不要再用这个函数,用drawXBM代替。

  • 相关:drawXBM

drawXBM

  • 函数原型:

    1
    2
    void U8G2::drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)
    void U8G2::drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)
    
  • 描述:画一个X BitMap (一种单色点阵图),x/y对应点阵图的左上角。颜色由setColorIndex给定。在U8g2 Version 2.15.x中,引进了实/虚模式(solid/transparent),默认是实模式。这个函数的XBMP版本(即drawXBMP)要求点阵图储存在PROGMEM中(ROM内)。有很多工具可以将普通图片转换到XBM,比如开源软件GIMP,在线网站onlineconvertfree。实在不知道,可以参考教程Interfacing & displaying a custom graphic on an 0.96″ I2C OLED with Arduino

  • 参数:

    • x/y:点阵图左上角的位置
    • w/h:点阵图的宽/高
    • bitmap:指向点阵图开头的指针
  • 相关:setBitmapMode

  • 注:XBMP版本要求点阵图数组按下面方式定义:

    1
    static const unsigned char u8g_logo_bits[] U8X8_PROGMEM = { ...
    

    另外,由于Arduino普遍内存小,尽量

  • 示例:

    1
    2
    3
    4
    5
    6
    #define u8g_logo_width 38
    #define u8g_logo_height 24
    static const unsigned char u8g_logo_bits[] PROGMEN= {//使用PROGMEN储存,不然可能会提示错误0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0xe0,
    ...0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f };
    

    这个可以直接粘贴到你的代码里。

    1
    u8g2.drawXBM( 0, 0, u8g_logo_width, u8g_logo_height, u8g_logo_bits);
    

drawLine

  • 函数原型:

    1
    void U8G2::drawLine(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1)
    
  • 描述:在两点之间画一条直线,这个函数会用当前颜色(setDrawColor)来画。

  • 参数:

    • x0y0:起始点的坐标
    • x1y1:终点的坐标
  • 相关:drawPixel, setDrawColor

  • 示例:

    1
    u8g2.drawLine(20, 5, 5, 32);
    

    drawLine示例

drawHLine

  • 函数原型:

    1
    void U8G2::drawHLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w)
    
  • 描述:以x/y为左边起点,w为长度向右画水平线。线的一部分可能超出屏幕边界。这个函数会用当前颜色(setDrawColor)来画,颜色0为清除像素,颜色1为设置像素。

  • 参数:

    • x/y:左边起点的x/y坐标
    • w:水平线的长度
  • 相关:setDrawColor, drawVLine

drawVLine

  • 函数原型:

    1
    void U8G2::drawVLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t h)
    
  • 描述:以x/y为上面起点,h为长度向下画竖直线。线的一部分可能超出屏幕边界。这个函数会用当前颜色(setDrawColor)来画,颜色0为清除像素,颜色1为设置像素。

  • 参数:

    • x/y:上面起点的x/y坐标
    • h:竖直线的长度
  • 相关:setDrawColor, drawHLine

drawTriangle

  • 函数原型:

    1
    void U8G2::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2)
    
  • 描述:画一个实心的三角形。参数为16bit。图形会根据显示屏尺寸裁剪。后面一段看不懂……

    Multiple polygons are drawn so that they exactly match without overlap:The left side of a polygon is drawn, the right side is not draw. The upper side is only draw if it is flat.

  • 参数:

    • x0/y0:点0的位置
    • x1/y1:点1的位置
    • x2/y2:点2的位置
  • 示例:

    1
    u8g2.drawTriangle(20,5, 27,50, 5,32);
    

drawBox

  • 函数原型:

    1
    void U8G2::drawBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
    
  • 描述:画一个实心矩形,左上角的位置对应x/y,宽为w,高为h。矩形的一部分可能会超出屏幕边界。这个函数会用当前颜色(setDrawColor)来画,对于单色显示屏,颜色0表示清除像素,颜色1表示显示像素。

  • 参数:

    • x:x坐标(框的左上角)
    • y:y坐标(框的左上角)
    • w:矩形的宽度
    • h:矩形的长度
  • 相关:drawFrame, setDrawColor

  • 示例:

    1
    u8g2.drawBox(3,7,25,15);
    

    drawBox示例

drawFrame

  • 函数原型:

    1
    void U8G2::drawFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
    
  • 描述:画一个空心框,左上角的位置对应x/y,宽为w,高为h。矩形的一部分可能会超出屏幕边界。这个函数会用当前颜色(setDrawColor)来画,对于单色显示屏,颜色0表示清除像素,颜色1表示显示像素。

  • 参数:

    • x:x坐标(框的左上角)
    • y:y坐标(框的左上角)
    • w:框的宽度
    • h:框的长度
  • 相关:drawBox, setDrawColor

  • 示例:

    1
    u8g2.drawFrame(3,7,25,15);
    

    drawFrame示例

drawRBox

见drawRFrame

drawRFrame

  • 函数原型:

    1
    2
    void U8G2::drawRBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r)
    void U8G2::drawRFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r)
    
  • 描述:画一个有圆角的框/矩形,以x/y为左上角的坐标,以w/h为宽/长。部分可能会超出屏幕边界。圆角半径为r,要求w >= 2*(r+1)h >= 2*(r+1),函数不会检查是否满足这个关系,如果wh小于2*(r+1),会发生未定义的行为(就是出错…)这个函数会用当前颜色(setDrawColor)来画,对于单色显示屏,颜色0表示清除像素,颜色1表示显示像素。

  • 参数

    • x/y:左上角的坐标

    • w:框/矩形的宽度

    • h:框/矩形的长度

    • r:圆角的半径

  • 相关:[setDrawColor]{#setDrawColor}, [drawFrame]{#drawFrame}, [drawBox]{#drawBox}

  • 示例:

    1
    u8g2.drawRFrame(20,15,30,22,7);
    

    drawRFrame示例

drawCircle

  • 函数原型:

    1
    void U8G2::drawCircle(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt = U8G_DRAW_ALL)
    
  • 描述:以(x0, y0)为圆心,rad为半径,画空心圆。圆的直径为2*rad+1。不同opt参数可以设置画圆的不同部分,可选的参数有:U8G2_DRAW_UPPER_RIGHTU8G2_DRAW_UPPER_LEFTU8G2_DRAW_LOWER_LEFTU8G2_DRAW_LOWER_RIGHTU8G2_DRAW_ALL,并且这些参数可以用|结合。这个函数会用当前颜色(setDrawColor)来画。

  • 参数:

    • x0y0:圆心的位置
    • rad:圆的半径
    • opt:选择画圆的哪部分。
      • U8G2_DRAW_UPPER_RIGHT
      • U8G2_DRAW_UPPER_LEFT
      • U8G2_DRAW_LOWER_LEFT
      • U8G2_DRAW_LOWER_RIGHT
      • U8G2_DRAW_ALL
  • 注:不支持Draw color 2(XOR Mode)

  • 相关:drawDisc, setDrawColor

  • 示例:

    1
    u8g2.drawCircle(20, 25, 10, U8G2_DRAW_ALL);
    

    drawCircle示例

drawDisc

  • 函数原型:

    1
    void U8G2::drawDisc(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt = U8G_DRAW_ALL)
    
  • 描述:以(x0, y0)为圆心,rad为半径,画实心圆。圆的直径为2*rad+1。不同opt参数可以设置画圆的不同部分,可选的参数有:U8G2_DRAW_UPPER_RIGHTU8G2_DRAW_UPPER_LEFTU8G2_DRAW_LOWER_LEFTU8G2_DRAW_LOWER_RIGHTU8G2_DRAW_ALL,并且这些参数可以用|结合。这个函数会用当前颜色(setDrawColor)来画。

  • 参数:

    • x0y0:圆心的位置
    • rad:圆的半径
    • opt:选择画圆的哪部分。
      • U8G2_DRAW_UPPER_RIGHT
      • U8G2_DRAW_UPPER_LEFT
      • U8G2_DRAW_LOWER_LEFT
      • U8G2_DRAW_LOWER_RIGHT
      • U8G2_DRAW_ALL
  • 注:不支持Draw color 2(XOR Mode)

  • 相关:drawDisc, setDrawColor

  • 示例:(见drawCircle)

drawGlyph

  • 函数原型:

    1
    void U8G2::drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding)
    
  • 描述:画一个Unicode象形文字。文字放在x/y像素上方。U8g2只支持Unicode低16位编码的字符(BMP):encoding的值为0~65535。只有当字体中有对应编码时才能画出来。

  • 参数:

    • x/y:字符在屏幕上的位置
    • encoding:字符的Unicode值
  • 注:这个绘画函数受setDrawColor和setFontMode控制

  • 相关:setFont

  • 示例:“雪人”是Unicode中的天气符号之一,其Unicode编码为9731(十进制)/2603(2进制):⛄。“雪人”也是U8g2字体:u8g2_font_unifont_t_symbol中的一个字。

    1
    2
    	u8g2.setFont(u8g2_font_unifont_t_symbols);u8g2.drawGlyph(5, 20, 0x2603);	/* dec 9731/hex 2603 Snowman */
    

    drawGlyph示例

drawStr

  • 函数原型:

    1
    u8g2_uint_t U8g2::drawStr(u8g2_uint_t x, u8g2_uint_t y, const char *s)
    
  • 描述:画一个字符串。第一个字符的位置为x/y。调用这个函数前用setFont来指定一种字体。要输入编码为127~255的字符的话,用C/C++/Arduino的转义字符 “\xab”(16进制)或“\xyz”(8进制)。这个函数不能画编码大于等于256的字符,请用drawUTF8或drawGlyph来这种字符。

  • 参数:

    • x/y:第一个字符的位置
    • s:文本
  • 返回值:字符串的长度

  • 注:

    • 这个绘画函数受setDrawColor和setFontMode控制
    • 用print来显示出数值型变量
  • 相关:setFont, drawUTF8, drawGlyph, print

  • 示例:

    1
    2
        u8g2.setFont(u8g2_font_ncenB14_tr);u8g2.drawStr(0,15,"Hello World!");
    

    drawStr示例

drawUTF8

  • 函数原型:

    1
    u8g2_uint_t U8g2::drawUTF8(u8g2_uint_t x, u8g2_uint_t y, const char *s)
    
  • 描述:画一个以UTF-8编码的字符串。使用该函数的前提条件有两个:

    1. C/C++/Arduino编译器必须支持UTF-8(这是GNU编译器的默认设置,而大多数Arduino用的正是GNU)
    2. 代码编辑器必须支持UTF-8(Arduino IDE支持)

    如果满足上两条件,你可以使用编码大于127的字符(当然,这个字符要在字体文件中存在,见setFont)。

    好处:代码的可读性更好;可直接”复制“-”粘贴“象形文字到代码里。

    坏处:代码的移植性差;strLen函数无法返回字符长度,要用getUTF8Len来代替strLen

  • 参数:

    • x/y:首字符的位置
    • s:UTF-8编码的文本
  • 返回值:字符串的长度

  • 注:

    • 这个绘画函数受setDrawColor和setFontMode控制
    • 用print来显示出数值型变量
  • 相关:setFont, drawStr, print

  • 示例:

    1
    2
        u8g2.setFont(u8g2_font_unifont_t_symbols);u8g2.drawUTF8(5, 20, "Snowman: ☃");	
    

    drawUTF8示例

print

  • 函数原型:

    1
    void U8G2::print(...)
    
  • 描述:相当书Arduino的 print() 函数,见Arduino官网上的LiquidCrystalPrint和Serial.print()。这个函数会在当前指针处(setCursor),用当前字体(setFont)打印文本(或数字)。要想支持UTF-8,可以用enableUTF8Print

  • 参数:见上面的Arduino官网后俩链接

  • 相关:enableUTF8Print, setCursor, setFont

  • 示例:

    1
    2
    3
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.setCursor(0, 15);
    u8g2.print("Hello World!");
    

    print示例

设置函数

setAutoPageClear

  • 函数原型:

    1
    uint8_t U8G2::setAutoPageClear(uint8_t mode)
    
  • 描述:开启(mode=1)或关闭(mode=0)自动清除像素缓冲,通过

setFont

  • 函数原型:

    1
    void U8G2::setFont(const uint8_t *font)
    
  • 描述:设置u8g2字体。注意u8x8的字体无法使用。字体的最后两个字母决定字体的种类或字符集:

    字体名字体种类
    u8g2_xxx_tx字体透明,宽度可变
    u8g2_xxx_mx等宽字体
    u8g2_xxx_hx宽度可变,普通高度
    u8g2_xxx_8x等宽字体,宽度限制在8x8的格子中
    字体名字符集
    u8g2_xxx_xeExtended:unicode 32~701
    u8g2_xxx_xfFull:unicode 32~255
    u8g2_xxx_xrRestricted:unicode 32~127
    u8g2_xxx_xuUppercase:数字和大写字母
    u8g2_xxx_xn数字和与日期时间相关的字符
    u8g2_xxx_x_something特殊的字符集,看具体的字体图列
  • 参数:

    • font:u8g2字体,具体见这里
  • 相关:drawUTF8, drawStr, drawGlyph, u8g2字体集

  • 示例:字体:u8g2_font_5x7_tr

setFontDirection

  • 函数原型:

    1
    void U8G2::setFontDirection(uint8_t dir)
    
  • 描述:决定字体显示的方向:

    参数旋转描述
    00 度从左到右
    190 度从上到下
    2180 度从右到左
    3270 度从下到上
  • 参数

    • dir:方向
  • 相关:drawStr

  • 示例:

    1
    2
    3
    4
    5
    u8g2.setFont(u8g2_font_ncenB14_tf);
    u8g2.setFontDirection(0);
    u8g2.drawStr(15, 20, "Abc");
    u8g2.setFontDirection(1);
    u8g2.drawStr(15, 20, "Abc");
    

    setFontDirection示例

setFontMode

  • 函数原型:

    1
    void U8G2::setFontMode(uint8_t is_transparent)
    
  • 描述:决定背景是否有颜色(is_transparent = 0无颜色,is_transparent = 1有颜色),默认为0

  • 参数:

    • is_transparent:开启(1)或关闭(0)透明模式
  • 注:要选择一个合适的字体:

    字体名字体种类适用于
    u8g2_xxx_tx透明字体,宽度可变is_transparent = 1, XOR Mode
    u8g2_xxx_mx等宽字体is_transparent = 0
    u8g2_xxx_hx宽度可变,普通高度is_transparent = 0
    u8g2_xxx_8x等宽字体,宽度限制在8x8的格子中is_transparent = 0
  • 示例:展示字体与背景的四种组合(setFontColor)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* write background pattern, then: */
    u8g2.setFontMode(0);
    u8g2.setDrawColor(1);
    u8g2.drawStr(3, 15, "Color=1, Mode 0");
    u8g2.setDrawColor(0);
    u8g2.drawStr(3, 30, "Color=0, Mode 0");
    u8g2.setFontMode(1);
    u8g2.setDrawColor(1);
    u8g2.drawStr(3, 45, "Color=1, Mode 1");
    u8g2.setDrawColor(0);
    u8g2.drawStr(3, 60, "Color=0, Mode 1");
    

    setFontMode示例

setPowerSave

  • 函数原型:

    1
    1
    void U8G2::setPowerSave(uint8_t is_enable)
    
  • 描述:开启(is_enable = 1)或关闭(is_enable = 0)显示屏的省电模式。开启省电模式时,显示屏上无显示,但不改变RAM。这个函数被begin调用。

  • 参数:

    • is_enable:开启(1)或关闭(0)省电模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/200735.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞格心理咨询系统设置多个管理员的操作方法

使用瑞格心理咨询系统&#xff0c;需要设置多个admin权限的管理员账号来管理&#xff0c;咨询厂家答复只能有1个管理员&#xff0c;个人觉得不可能&#xff0c;于是开始折腾。 解决办法&#xff1a; 在没有数据字典的情况下&#xff0c; 通过遍历数据库&#xff0c;发现用户信…

16. @PostConstruct注解和开关原理(验证码开关、IP开关)

1►PostConstruct注解 PostConstruct是java自带的注解&#xff0c;会在java项目启动的时候先执行下面的方法 2►开关原理&#xff08;验证码开关&#xff09; 我们的项目具有验证码功能&#xff0c;旧版不支持关闭&#xff0c;新版已经支持关闭了。 我们打开页面“参数管…

使用 ClickHouse 做日志分析

原作&#xff1a;Monika Singh & Pradeep Chhetri 这是我们在 Monitorama 2022 上发表的演讲的改编稿。您可以在此处找到包含演讲者笔记的幻灯片和此处的视频。 当 Cloudflare 的请求抛出错误时&#xff0c;信息会记录在我们的 requests_error 管道中。错误日志用于帮助解…

Nginx - 本机读取服务器图像、视频

目录 一.引言 二.安装 Nginx 1.安装 By apt 2.安装 By 官网 三.配置 Nginx 1.Linux 机器配置 2.重启 Nginx 服务 3.本机查看机器文件 四.总结 一.引言 前面介绍了 GFP-GAN、PNG2GIF、GIF2PNG 等操作&#xff0c;我们生成的 video、gif、png 等形式的文件都存储在 lin…

【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

目录 Ⅰ. 理论部分 0x00 升降计数器&#xff08;UP DOWN Counter&#xff09; 0x01 波纹计数器&#xff08;Ripple Counter&#xff09; 0x02 约翰逊计数器&#xff08;Johnson Counter&#xff09; Ⅱ. 实践部分 0x00 实现&#xff1a;升降计数器&#xff08;4-bit&…

Unity - 实现模型动态伸长缩短,贴图不变形(材质球参数篇)

思路为修改模型材质球的Tiling参数&#xff0c;根据与自身localScale的值得到合适的比例&#xff0c;再修改Tiling值 var mat target.transform.GetComponent<Renderer>().material; var oriValue mat.mainTextureScale;//沿着Y轴伸缩 oriValue.y 1 * target.transfo…

使用DHorse发布SpringBoot项目到K8S

前言 在介绍DHorse的操作之前&#xff0c;先来介绍一下使用k8s发布应用的步骤&#xff0c;以SpringBoot应用为例进行说明。 1.首先从代码仓库下载代码&#xff0c;比如GitLab&#xff1b; 2.接着进行构建&#xff0c;比如使用Maven&#xff1b; 3.如果要使用k8s作为编排&am…

MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况

目录 一、索引 1.1、简单介绍 1.2、索引的分类 1.2.1、主键索引 1.2.2、单值索引&#xff08;单列索引、普通索引&#xff09; 1.2.3、唯一索引 1.2.4、复合索引 1.2.5、复合索引经典问题 1.3、索引原理 1.3.1、主键自动排序 1.3.2、索引的底层原理 1.3.3、B 树和 B…

海康威视监控相机的SDK与opencv调用(非工业相机)

1.研究内容 本篇主要对海康威视的监控相机的SDK回调进行研究&#xff0c;并于opencv结合&#xff0c;保存图像,以供后续其他处理&#xff0c;开发语言为C 2.步骤及方法 2.1 海康SDK介绍 海康SDK下载地址 根据自身编译环境&#xff0c;下载对应的SDK&#xff0c;需要注意的是…

wincc定时器功能介绍

1定时器功能介绍 WinCC中定时器的使用可以使WinCC按照指定的周期或者时间点去执行任务&#xff0c;比如周期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。WinCC已经提供了一些简单的定时器&#xff0c;可以满足大部分定时功能。但是在有些情况下&#xff0c…

SpringBoot:ch02 配置文件(日志)

前言 简单介绍 Spring Boot 中常见的配置文件类型&#xff0c;如 application.properties 和 application.yml 等&#xff0c;并说明它们各自的特点和用途。 一、前期准备 1、新建项目&#xff0c;结构如下 2、添加依赖 <?xml version"1.0" encoding"UTF…

OpenLayers入门,OpenLayers6的WebGLPointsLayer图层样式运算符详解

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解使用OpenLayers6的WebGL图层显示大量点情况下,列举出所有WebGLPointsLayer图层所支持的所有样式运算符大全。 二、基于的OpenLayers版本 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使…

html页面直接使用elementui Plus时间线 + vue3

直接上效果图 案例源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"../js/vue3.3.8/vue.global.js"></script><link rel"styles…

英语六级范文模板

目录 现象解释 观点选择 问题解决 六级只考议论文&#xff0c;我们将从现象解释&#xff0c;观点选择&#xff0c;问题解决三个角度给出范文&#xff1a; 多次使用的句子&#xff0c;就可以作为模板记下来~~ 现象解释 In the contemporary world, the ability to meet cha…

VPX 插座(VITA46)介绍及应用 (简单介绍)

1. VPX 插座的介绍 VPX是VITA(VME International Trade Association, VME国际贸易协会)组织于2007年在其VME总线基础上提出的新一代高速串行总线标准。VPX总线的基本规范、机械结构和总线信号等具体内容均在ANSI/VITA46系列技术规范中定义。VPX就是基于高速串行总线的新一代总线…

LeetCode977.有序数组的平方(双指针法、暴力法、列表推导式)

LeetCode977.有序数组的平方 1.问题描述2.解题思路3.代码4.知识点 1.问题描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] …

竞赛选题 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

虚拟机配置网络ip,主打一个详细

文章目录 一、前言二、安装vim编辑器三、检查联网状态1. 使用ping命令 四、查看ip五、ens33网卡六、开机启动ens33网卡七、获取子网地址和子网掩码八、配置网关与子网掩码1. 编辑虚拟网络信息2. 配置网关3. 配置ens33网卡信息 九、动态ip配置十、静态ip配置 一、前言 本文主要…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

Redis事务+秒杀案例

Redis事务是一个单独的隔离操作&#xff0c;是指将多条命令放在一个命令队列当中&#xff0c;按顺序执行&#xff0c;保证多个命令在同一个事务中执行而不受其他客户端的影响。 通俗来说就是&#xff1a;串联多个命令防止别的命令插队。 1.Multi、Exec、discard 在输入Multi命…