日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

玩转u8g2 OLED库,一篇就够

發布時間:2025/3/15 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转u8g2 OLED库,一篇就够 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

????最近博主聽到QQ群里面問得比較多的問題:
????“博哥,有玩過OLED嗎?”
????“博哥,有試過在ESP8266上調成功過SSD1306嗎?”
????“博哥,OLED上顯示天氣信息怎么弄?”
????........
????諸如此類的問題,在博主看來,無非都是對OLED庫用法的不熟悉甚至不了解。Arduino OLED庫眾多,博主也曾經介紹過一款 《博哥OLED系列》- 玩轉SSD1306-12864 OLED Adafruit_GFX 和 Adafruit_SSD1306庫。但是,博主今天要介紹的是目前Arduino平臺上使用最廣泛的OLED庫 —— U8G2庫,也是很多初學者容易懵逼的一個第三方庫。目前在github上超過1K star,1800次commit,可以說維護熱度很高,讀者大可放心使用。
????至于這個庫為什么這么火爆,請讀者認真看完本博文自行評價,博主只能說功能真的很好很強大!!!!
????那么,博主首先立個flag,閱讀完本篇博文的最終效果——讀者以后在Arduino平臺上開發OLED項目的時候,可以考慮U8G2庫,并且知道U8G2庫的具體用法,甚至可以能夠當做工具書來翻閱。
????進入正文之前,博主要給讀者灌輸兩個個非常重要的知識點:

  • 其一 像素點點陣
OLED其實就是一個M x n 的像素點陣,想顯示什么就得把具體位置的像素點亮起來。對于每一個像素點,有可能是1點亮,也有可能是0點亮;
  • 其二 坐標系

????在坐標系中,左上角是原點,向右是X軸,向下是Y軸。

????希望讀者能仔細理解這兩個知識點。

2.U8g2簡介

2.1 U8g2是什么

????U8g2是嵌入式設備的單色圖形庫,一句話簡單明了。主要應用于嵌入式設備,包括我們常見的單片機;

2.2 U8g2支持的顯示控制器

????U8g2支持單色OLED和LCD,包括以下控制器:SSD1305,SSD1306,SSD1309,SSD1322,SSD1325,SSD1327,SSD1329,SSD1606,SSD1607,SH1106,SH1107,SH1108,SH1122,T6963,RA8835,LC7981,PCD8544,PCF8812,HX1230 ,UC1601,UC1604,UC1608,UC1610,UC1611,UC1701,ST7565,ST7567,ST7588,ST75256,NT7534,IST3020,ST7920,LD7032,KS0108,SED1520,SBN1661,IL3820,MAX7219(有關完整列表,請參見 此處)。
????可以說,基本上主流的顯示控制器都支持,比如我們常見的SSD1306 12864,讀者在使用該庫之前請查閱自己的OLED顯示控制器是否處于支持列表中

2.2 U8g2支持的Arduino主板

????可以說基本上所有Arduino API的主板都得到U8g2的支持。包括:

  • Aruino Zero,Uno,Mega,Due,101,MKR Zero以及所有其他Arduino官方主板
  • 基于Arduino平臺的STM32
  • 基于Arduino平臺的ESP8266和ESP32
  • 甚至其他不知名的基于Arduino平臺的開發板

????所以說,讀者完全不用擔心兼容性問題,放心使用。

2.3 U8g2如何在Arduino平臺上安裝

????Arduino庫U8g2可以從Arduino IDE的庫管理器安裝,讀者在庫管理器搜索“U8g2”關鍵字就可以下載安裝:

????下載完畢,測試一下庫是否安裝成功:

#include <U8g2lib.h> void setup() {// put your setup code here, to run once: }void loop() {// put your main code here, to run repeatedly: }

????編譯成功,證明你本地已經加載了U8G2庫。

2.4 U8g2的優勢

????為什么要運用U8g2庫?也就是說U8g2庫能帶給我們什么樣的開發便利。在博主看來,主要考慮幾個方面:

  • U8g2庫平臺支持性好,基本上支持絕大部分Arduino開發板,特別也博主比較喜歡的ESP8266;
  • U8g2庫顯示控制器支持性好,基本上市面上的OLED都完美支持;
  • U8g2庫 API眾多,特別支持了中文,支持了不同字體,這是一個對于開發者倆說不小的福利。

????以下是官方提供的一些U8G2庫測試圖,博主挑選了幾張常見的以及附上U8G2庫的配置(讀者可以先不用理會配置,等看完博文再次閱讀就會了解含義):

  • ESP32 and SSD1306 OLED
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R2, /* clock=*/ 16, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, pure SW emulated I2C U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17); // ESP32 Thing, HW I2C with pin remapping
  • MAX7219 32x8 LED Matrix
U8G2_MAX7219_32X8_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ U8X8_PIN_NONE);
  • SSD1305 128x32
U8G2_SSD1305_128X32_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
  • SSD1306 128x32
U8X8_SSD1306_128X32_UNIVISION_SW_I2C u8x8(/* clock=A5*/ 19, /* data=A4*/ 18);
  • PCD8544 84x48 (Nokia 5110) LCD
U8G2_PCD8544_84X48_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Nokia 5110 Display
  • ST7920 128x64 LCD in 8080 parallel mode
U8G2_ST7920_128X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18 /* A4 */, /*cs=*/ U8X8_PIN_NONE, /*dc/rs=*/ 17 /* A3 */, /*reset=*/ 15 /* A1 */); // Remember to set R/W to 0

????這只是一些常見的顯示器,可以說,已經足夠覆蓋到我們常見的范圍了。

3.U8g2庫詳解

3.1 U8g2庫百度腦圖

老規則,先上一個圖:

方法可以分為四大類:

  • 基本函數
  • 繪制相關函數
  • 顯示配置相關函數
  • 緩存相關函數

3.2 U8g2庫函數詳解

3.2.1 基本函數

3.2.1.1 u8g2.begin() —— 構造U8G2

函數說明:

/*** 初始化U8g2庫* @Note 關聯方法 initDisplay clearDisplay setPowerSave*/ bool U8G2::begin(void)

源碼說明:

bool begin(void) { /* note: call to u8x8_utf8_init is not required here, this is done in the setup procedures before */initDisplay(); //初始化顯示器clearDisplay(); // 重置清屏setPowerSave(0); //喚醒屏幕return 1; }

3.2.1.2 u8g2.beginSimple() —— 構造U8G2

函數說明:

/*** 簡單初始化U8g2庫* @Note 關聯方法 beginSimple*/ void U8G2::beginSimple(void);

源碼說明:

void beginSimple(void) { /* does not clear the display and does not wake up the display */ /* user is responsible for calling clearDisplay() and setPowerSave(0) */initDisplay();//初始化顯示器 }

注意點:

  • 讀者可以看到和begin()函數的區別,需要用戶自行控制初始化過程,給了一定的自由度,不過博主建議大家還是直接用begin函數吧。

3.2.1.3 u8g2.initDisplay() —— 初始化顯示控制器

函數說明:

/*** 初始化顯示控制器*/ void U8G2::initDisplay(void)

注意點:

  • 這個方法不需要我們單獨調用,會在begin函數主動調用一次,我們主要理解即可,會在里面針對具體的OLED進行配置;

3.2.1.4 u8g2.clearDisplay() —— 清除屏幕內容

函數說明:

/*** 清除屏幕*/ void U8G2::clearDisplay(void)

注意點:

  • 這個方法不需要我們單獨調用,會在begin函數主動調用一次,我們主要理解即可;
  • 不要在 firstPage 和 nextPage 函數之間調用該方法;

3.2.1.5 u8g2.setPowerSave() —— 是否開啟省電模式

函數說明:

/*** 清除顯示緩沖區* @param is_enable* 1 表示啟用顯示器的省電模式,屏幕上看不到任何東西* 0 表示禁用省電模式*/ void U8G2::setPowerSave(uint8_t is_enable)

注意點:

  • 不管是啟用還是禁用,顯示器需要的內存消耗是不會變的,說到底就是為了關閉屏幕,做到省電;
  • 所以這里就可以理解為什么初始化需要 setPowerSave(0);

3.2.1.6 u8g2.clear() —— 清除操作

函數說明:

/*** 清除屏幕顯示,清除緩沖區,光標回到左上角原點位置(0,0)* @Note 關聯方法 home clearDisplay clearBuffer*/ void U8G2::clear(void)

源碼說明:

void clear(void) { home(); //回到原點clearDisplay(); //清除屏幕上的顯示clearBuffer(); //清除緩沖區 }

3.2.1.7 u8g2.clearBuffer() —— 清除緩沖區

函數說明:

/*** 清除內存中數據緩沖區*/ void U8G2::clearBuffer(void)

注意點:

  • 一般這個函數是與sendBuffer函數配對使用,通常用法如下:
void loop(void) {u8g2.clearBuffer();// ... write something to the buffer u8g2.sendBuffer();delay(1000); }

3.2.1.8 u8g2.disableUTF8Print() —— 禁用 UTF8打印

函數說明:

/*** 禁用Arduino平臺下支持輸出UTF8字符集,默認是開啟*/ void U8G2::disableUTF8Print(void)

3.2.1.9 u8g2.enableUTF8Print() —— 啟用 UTF8打印

函數說明:

/*** 開啟Arduino平臺下支持輸出UTF8字符集*/ void U8G2::enableUTF8Print(void)

注意點:

  • 我們的中文字符就是UTF8;
  • 常見例子
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); }

3.2.1.10 u8g2.home() —— 重置顯示光標的位置

函數說明:

/*** 重置顯示光標的位置,回到原點(0,0)* @Note 關聯方法 print clear*/ void U8G2::home(void)

3.2.2 繪制相關函數

3.2.2.1 u8g2.drawBox() —— 畫實心方形

函數說明:

/*** 畫實心方形,左上角坐標為(x,y),寬度為w,高度為h* @param x 左上角的x坐標* @param y 左上角的y坐標* @param w 方形的寬度* @param h 方形的高度* @Note 關聯方法 drawFrame setDrawColor*/ void U8G2::drawBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;

示例:

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

3.2.2.2 u8g2.drawCircle() —— 畫空心圓

函數說明:

/*** 畫空心圓,圓心坐標為(x0,y0),半徑為rad* @param x0 圓點的x坐標* @param y0 圓點的y坐標* @param rad 圓形的半徑* @param opt 圓形選項* U8G_DRAW_ALL 整個圓* U8G2_DRAW_UPPER_RIGHT 右上部分的圓弧* U8G2_DRAW_UPPER_LEFT 左上部分的圓弧* U8G2_DRAW_LOWER_LEFT 左下部分的圓弧* U8G2_DRAW_LOWER_RIGHT 右下部分的圓弧* 選項可以通過 | 操作符來組合* @Note 關聯方法 drawDisc setDrawColor*/ void U8G2::drawCircle(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt = U8G2_DRAW_ALL)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;
  • 直徑等于2rad + 1;

示例:

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

3.2.2.3 u8g2.drawDisc() —— 畫實心圓

函數說明:

/*** 畫實心圓,圓心坐標為(x0,y0),半徑為rad* @param x0 圓點的x坐標* @param y0 圓點的y坐標* @param rad 圓形的半徑* @param opt 圓形選項* U8G_DRAW_ALL 整個圓* U8G2_DRAW_UPPER_RIGHT 右上部分的圓弧* U8G2_DRAW_UPPER_LEFT 左上部分的圓弧* U8G2_DRAW_LOWER_LEFT 左下部分的圓弧* U8G2_DRAW_LOWER_RIGHT 右下部分的圓弧* 選項可以通過 | 操作符來組合* @Note 關聯方法 drawCircle setDrawColor*/ void U8G2::drawDisc(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt = U8G_DRAW_ALL)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;
  • 直徑等于2rad + 1;

3.2.2.4 u8g2.drawEllipse() —— 畫空心橢圓

函數說明:

/*** 畫空心橢圓,圓心坐標為(x0,y0),半徑為rad* @param x0 圓點的x坐標* @param y0 圓點的y坐標* @param rx 橢圓形水平x方向的半徑* @param ry 橢圓形豎直y方向的半徑* @param opt 圓形選項* U8G_DRAW_ALL 整個橢圓* U8G2_DRAW_UPPER_RIGHT 右上部分的圓弧* U8G2_DRAW_UPPER_LEFT 左上部分的圓弧* U8G2_DRAW_LOWER_LEFT 左下部分的圓弧* U8G2_DRAW_LOWER_RIGHT 右下部分的圓弧* 選項可以通過 | 操作符來組合* @Note 關聯方法 drawCircle*/ void U8G2::drawEllipse(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx, u8g2_uint_t ry, uint8_t opt)

注意點:

  • rx*ry 在8位模式的u8g2必須小于512(博主暫且沒有理解);

示例:

u8g2.drawEllipse(20, 25, 15, 10, U8G2_DRAW_ALL);

3.2.2.5 u8g2.drawFilledEllipse() —— 畫實心橢圓

函數說明:

/*** 畫實心橢圓,圓心坐標為(x0,y0),半徑為rad* @param x0 圓點的x坐標* @param y0 圓點的y坐標* @param rx 橢圓形水平x方向的半徑* @param ry 橢圓形豎直y方向的半徑* @param opt 圓形選項* U8G_DRAW_ALL 整個橢圓* U8G2_DRAW_UPPER_RIGHT 右上部分的圓弧* U8G2_DRAW_UPPER_LEFT 左上部分的圓弧* U8G2_DRAW_LOWER_LEFT 左下部分的圓弧* U8G2_DRAW_LOWER_RIGHT 右下部分的圓弧* 選項可以通過 | 操作符來組合* @Note 關聯方法 drawCircle*/ void U8G2::drawFilledEllipse(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx, u8g2_uint_t ry, uint8_t opt)

注意點:

  • rx*ry 在8位模式的u8g2必須小于512(博主暫且沒有理解);

3.2.2.6 u8g2.drawFrame() —— 畫空心方形

函數說明:

/*** 畫空心方形,左上角坐標為(x,y),寬度為w,高度為h* @param x 左上角的x坐標* @param y 左上角的y坐標* @param w 方形的寬度* @param h 方形的高度* @Note 關聯方法 setDrawColor*/ void U8G2::drawFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;

示例:

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

3.2.2.7 u8g2.drawGlyph() —— 繪制字體字集的符號

函數說明:

/*** 繪制字體字集里面定義的符號* @param x 左上角的x坐標* @param y 左上角的y坐標* @param encoding 字符的unicode值* @Note 關聯方法 setFont*/ void U8G2::drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding)

注意點:

  • U8g2支持16位以內的unicode字符集,也就是說encoding的范圍為0-65535,drawGlyph方法只能繪制存在于所使用的字體字集中的unicode值;
  • 這個繪制方法依賴于當前的字體模式和繪制顏色;

3.2.2.8 u8g2.drawHLine() —— 繪制水平線

函數說明:

/*** 繪制水平線* @param x 左上角的x坐標* @param y 左上角的y坐標* @param w 水平線的長度* @Note 關聯方法 setDrawColor*/void U8G2::drawHLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;

3.2.2.9 u8g2.drawLine() —— 兩點之間繪制線

函數說明:

/*** 繪制線,從坐標(x0,y0) 到(x1,y1)* @param x0 端點0的x坐標* @param y0 端點0的y坐標* @param x1 端點1的x坐標* @param y1 端點1的y坐標* @Note 關聯方法 setDrawColor*/void U8G2::drawLine(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;

示例:

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

3.2.2.10 u8g2.drawPixel() —— 繪制像素點

函數說明:

/*** 繪制像素點,坐標(x,y)* @param x 像素點的x坐標* @param y 像素點的y坐標* @Note 關聯方法 setDrawColor*/ void U8G2::drawPixel(u8g2_uint_t x, u8g2_uint_t y)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;
  • 你會發現很多繪制方法的底層都是調用drawPixel,畢竟像素屬于最小顆粒度;
  • 我們可以利用這個繪制方法自定義自己的圖形顯示;

3.2.2.11 u8g2.drawRBox() —— 繪制圓角實心方形

函數說明:

/*** 繪制圓角實心方形,左上角坐標為(x,y),寬度為w,高度為h,圓角半徑為r* @param x 左上角的x坐標* @param y 左上角的y坐標* @param w 方形的寬度* @param h 方形的高度* @param r 圓角半徑*/ void U8G2::drawRBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;
  • 要求,w >= 2(r+1) 并且 h >= 2(r+1),這是顯而易見的限制;

3.2.2.12 u8g2.drawRFrame() —— 繪制圓角空心方形

函數說明:

/*** 繪制圓角空心方形,左上角坐標為(x,y),寬度為w,高度為h,圓角半徑為r* @param x 左上角的x坐標* @param y 左上角的y坐標* @param w 方形的寬度* @param h 方形的高度* @param r 圓角半徑*/ void U8G2::drawRFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r)

注意點:

  • 如果支持繪制顏色(也就是不是單色顯示器),那么由setDrawColor設置;
  • 要求,w >= 2(r+1) 并且 h >= 2(r+1),這是顯而易見的限制

示例:

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

3.2.2.13 u8g2.drawStr() —— 繪制字符串

函數說明:

/*** 繪制字符串* @param x 左上角的x坐標* @param y 左上角的y坐標* @param s 繪制字符串內容* @return 字符串的長度*/ u8g2_uint_t U8g2::drawStr(u8g2_uint_t x, u8g2_uint_t y, const char *s)

注意點:

  • 需要先設置字體,調用setFont方法;
  • 這個方法不能繪制encoding超過256的,超過256需要用drawUTF8或者drawGlyph;說白了就是一般用來顯示英文字符;
  • x,y屬于字符串左下角的坐標;

示例:

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

3.2.2.14 u8g2.drawTriangle() —— 繪制實心三角形

函數說明:

/*** 繪制實心三角形,定點坐標分別為(x0,y0),(x1,y1),(x2,y2)*/ void U8G2::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2)

示例:

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

3.2.2.15 u8g2.drawUTF8() —— 繪制UTF8編碼的字符

函數說明:

/*** 繪制UTF8編碼的字符串* @param x 字符串在屏幕上的左下角x坐標* @param y 字符串在屏幕上的左下角y坐標* @param s 需要繪制的UTF-8編碼字符串* @return 返回字符串的長度*/ u8g2_uint_t U8g2::drawUTF8(u8g2_uint_t x, u8g2_uint_t y, const char *s)

注意點:

  • 使用該方法,有兩個前提。首先是你的編譯器需要支持UTF-8編碼,對于絕大部分Arduino板子已經支持;其次,顯示的字符串需要存為“UTF-8”編碼,Arduino IDE上默認支持;
  • 該方法需要依賴于fontMode(setFont)以及drawing Color,也就是說如果你傳進來的字符串編碼必須在font定義里面;

示例:

u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawUTF8(5, 20, "Snowman: ?");

3.2.2.16 u8g2.drawVLine() —— 繪制豎直線

函數說明:

/*** 繪制豎直線* @param x 左上角坐標x* @param y 左上角坐標y* @param h 高度*/ void U8G2::drawVLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t h)

3.2.2.17 u8g2.drawXBM()/drawXBMP() —— 繪制圖像

函數說明:

/*** 繪制圖像* @param x 左上角坐標x* @param y 左上角坐標y* @param w 圖形寬度* @param h 圖形高度* @param bitmap 圖形內容* @Note 關聯方法 setBitmapMode*/ 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)

注意點:

  • drawXBM和drawXBMP區別在于 XBMP支持PROGMEM;

3.2.2.18 u8g2.firstPage()/nextPage() —— 繪制命令

函數說明:

/*** 繪制圖像*/ void U8G2::firstPage(void) uint8_t U8G2::nextPage(void)

注意點:

  • firstPage方法會把當前頁碼位置變成0;
  • 修改內容處于firstPage和nextPage之間,每次都是重新渲染所有內容;

優勢點:

  • 該方法消耗的ram空間,比sendBuffer消耗的ram空間要少;

示例:

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() );

庫源碼解析:

void u8g2_FirstPage(u8g2_t *u8g2) {if ( u8g2->is_auto_page_clear ){//清除緩沖區u8g2_ClearBuffer(u8g2);}//設置當前緩沖區的Tile Row 一個Tile等于8個像素點的高度u8g2_SetBufferCurrTileRow(u8g2, 0); }uint8_t u8g2_NextPage(u8g2_t *u8g2) {uint8_t row;u8g2_send_buffer(u8g2);row = u8g2->tile_curr_row;row += u8g2->tile_buf_height;if ( row >= u8g2_GetU8x8(u8g2)->display_info->tile_height ){//如果row已經到達最后一行,觸發refreshDisplay調用,表示整個頁面已經刷完了u8x8_RefreshDisplay( u8g2_GetU8x8(u8g2) );return 0;}if ( u8g2->is_auto_page_clear ){//清除緩沖區u8g2_ClearBuffer(u8g2);}//不斷更新TileRow 這是非常關鍵的一步u8g2_SetBufferCurrTileRow(u8g2, row);return 1; }

3.2.2.19 u8g2.print() —— 繪制內容

函數說明:

/*** 繪制內容* @Note 關聯方法 setFont setCursor enableUTF8Print*/ void U8G2::print(...)

示例:

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

3.2.2.20 u8g2.sendBuffer() —— 繪制緩沖區的內容

函數說明:

/*** 繪制緩沖區的內容* @Note 關聯方法 clearBuffer*/ void U8G2::sendBuffer(void)

注意點:

  • sendBuffer的RAM占用空間大,需要結合構造器的buffer選項(請繼續往下看,先有個概念)使用;
  • 不管是fistPage、nextPage還是sendBuffer,都涉及到一個叫做 current page position的概念;

庫源碼解析:

void u8g2_SendBuffer(u8g2_t *u8g2) {u8g2_send_buffer(u8g2);u8x8_RefreshDisplay( u8g2_GetU8x8(u8g2) ); }static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t src_tile_row, uint8_t dest_tile_row) {uint8_t *ptr;uint16_t offset;uint8_t w;w = u8g2_GetU8x8(u8g2)->display_info->tile_width;offset = src_tile_row;ptr = u8g2->tile_buf_ptr;offset *= w;offset *= 8;ptr += offset;u8x8_DrawTile(u8g2_GetU8x8(u8g2), 0, dest_tile_row, w, ptr); }/* write the buffer to the display RAM. For most displays, this will make the content visible to the user.Some displays (like the SSD1606) require a u8x8_RefreshDisplay() */ static void u8g2_send_buffer(u8g2_t *u8g2) U8X8_NOINLINE; static void u8g2_send_buffer(u8g2_t *u8g2) {uint8_t src_row;uint8_t src_max;uint8_t dest_row;uint8_t dest_max;src_row = 0;src_max = u8g2->tile_buf_height;dest_row = u8g2->tile_curr_row;dest_max = u8g2_GetU8x8(u8g2)->display_info->tile_height;do{u8g2_send_tile_row(u8g2, src_row, dest_row);src_row++;dest_row++;} while( src_row < src_max && dest_row < dest_max ); }

示例:

void loop(void) {u8g2.clearBuffer();// ... write something to the buffer u8g2.sendBuffer();delay(1000);

3.2.3 顯示配置相關函數

3.2.3.1 u8g2.getAscent() —— 獲取基準線以上的高度

函數說明:

/*** 獲取基準線以上的高度* @return 返回高度值* @Note 關聯方法 setFont getDescent setFontRefHeightAll*/ int8_t U8G2::getAscent(void)

注意點:

  • 跟字體有關(setFont);

示例:
下面例子,ascent是18

3.2.3.2 u8g2.getDescent() —— 獲取基準線以下的高度

函數說明:

/*** 獲取基準線以下的高度* @return 返回高度值* @Note 關聯方法 setFont setFontRefHeightAll*/ int8_t U8G2::getDescent(void)

注意點:

  • 跟字體有關(setFont);

示例:
下面例子,descent是-5

3.2.3.3 u8g2.getDisplayHeight() —— 獲取顯示器的高度

函數說明:

/*** 獲取顯示器的高度* @return 返回高度值*/ u8g2_uint_t getDisplayHeight(void)

3.2.3.4 u8g2.getDisplayWidth() —— 獲取顯示器的寬度

函數說明:

/*** 獲取顯示器的寬度* @return 返回寬度值*/ u8g2_uint_t getDisplayWidth(void)

3.2.3.5 u8g2.getMaxCharHeight() —— 獲取當前字體里的最大字符的高度

函數說明:

/*** 獲取當前字體里的最大字符的高度* @return 返回高度值* @Note 關聯方法 setFont*/ u8g2_uint_t getMaxCharHeight(void)

注意點:

  • 每一個字符在font字集中都是一個位圖,位圖有高度和寬度;

3.2.3.6 u8g2.getMaxCharWidth() —— 獲取當前字體里的最大字符的寬度

函數說明:

/*** 獲取當前字體里的最大字符的寬度* @return 返回寬度值* @Note 關聯方法 setFont*/ u8g2_uint_t getMaxCharWidth(void)

注意點:

  • 每一個字符在font字集中都是一個位圖,位圖有高度和寬度;

3.2.3.7 u8g2.getStrWidth() —— 獲取字符串的像素寬度

函數說明:

/*** 獲取字符串的像素寬度* @param s 繪制字符串* @return 返回字符串的像素寬度值* @Note 關聯方法 setFont drawStr*/ u8g2_uint_t U8G2::getStrWidth(const char *s)

注意點:

  • 像素寬度和當前font字體有關;

3.2.3.8 u8g2.getUTF8Width() —— 獲取UTF-8字符串的像素寬度

函數說明:

/*** 獲取UTF-8字符串的像素寬度* @param s 繪制字符串* @return 返回字符串的像素寬度值* @Note 關聯方法 setFont drawStr*/ u8g2_uint_t U8G2::getUTF8Width(const char *s)

注意點:

  • 像素寬度和當前font字體有關;

3.2.3.9 u8g2.setAutoPageClear() —— 設置自動清除緩沖區

函數說明:

/*** 是否自動清除緩沖區* @param mode 0 表示關閉* 1 表示開啟,默認是開啟*/ void U8G2::setAutoPageClear(uint8_t mode)

注意點:

  • 該方法用于 firstPage 和 nextPage(看上面的源碼解析);
  • 建議該方法保持默認就好,如果用戶禁止了,那么需要自己維護緩沖區的狀態或者手動調用clearBuffer;

3.2.3.10 u8g2.setBitmapMode() —— 設置位圖模式

函數說明:

/*** 設置位圖模式(定義drawXBM方法是否繪制背景顏色)* @param is_transparent* 0 繪制背景顏色,不透明,默認是該值* 1 不繪制背景顏色,透明* @Note 關聯方法 drawXBM*/ void U8G2::setBitmapMode(uint8_t is_transparent)

示例:

u8g2.setDrawColor(1); u8g2.setBitmapMode(0); u8g2.drawXBM(4,3, u8g2_logo_97x51_width, u8g2_logo_97x51_height, u8g2_logo_97x51_bits); u8g2.drawXBM(12,11, u8g2_logo_97x51_width, u8g2_logo_97x51_height, u8g2_logo_97x51_bits);

u8g2.setDrawColor(1); u8g2.setBitmapMode(1); u8g2.drawXBM(4,3, u8g2_logo_97x51_width, u8g2_logo_97x51_height, u8g2_logo_97x51_bits); u8g2.drawXBM(12,11, u8g2_logo_97x51_width, u8g2_logo_97x51_height, u8g2_logo_97x51_bits);

3.2.3.11 u8g2.setBusClock() —— 設置總線時鐘

函數說明:

/*** 設置總線時鐘(I2C SPI)* @param mode clock_speed 總線時鐘頻率(Hz)* @Note 關聯方法 begin*/ void U8G2::setBusClock(uint32_t clock_speed);

注意點:

  • 僅僅Arduino平臺支持;
  • 必須在u8g2.begin() 或者 u8g2.initDisplay()之前調用;

3.2.3.12 u8g2.setClipWindow() —— 設置采集窗口大小

函數說明:

/*** 設置采集窗口,窗口范圍從左上角(x0,y0)到右下角(x1,y1)* 也就是我們繪制的內容只能在規范范圍內顯示* @param x0 左上角x坐標* @param y0 左上角y坐標* @param x1 右上角x坐標* @param y1 右上角y坐標* @Note 關聯方法 begin*/ void U8G2::setClipWindow(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1 );

注意點:

  • 可以通過 setMaxClipWindow 去掉該限制
void U8G2::setMaxClipWindow(void)

示例:

u8g2.setClipWindow(10, 10, 85, 30); u8g2.setDrawColor(1); u8g2.drawStr(3, 32, "U8g2");

3.2.3.13 u8g2.setCursor() —— 設置繪制光標位置

函數說明:

/*** 設置繪制光標位置(x,y)* @Note 關聯方法 print*/ void U8G2::setCursor(u8g2_uint_t x, u8g2_uint_t y)

示例:

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

3.2.3.14 u8g2.setDisplayRotation() —— 設置顯示器的旋轉角度

函數說明:

/*** 設置顯示器的旋轉角度* @param u8g2_cb 旋轉選項* U8G2_R0 不做旋轉 水平* U8G2_R1 旋轉90度* U8G2_R2 旋轉180度* U8G2_R3 旋轉270度* U8G2_MIRROR 不做旋轉 水平,顯示內容是鏡像的,暫時不理解*/ void setDisplayRotation(const u8g2_cb_t *u8g2_cb)

3.2.3.15 u8g2.setDrawColor() —— 設置繪制顏色

函數說明:

/*** 設置繪制顏色(暫時還沒有具體去了解用法)*/ void U8G2::setDrawColor(uint8_t color)

3.2.3.16 u8g2.setFont() —— 設置字體集

這是一個非常重要的方法,非常重要!!!

函數說明:

/*** 設置字體集(字體集用于字符串繪制方法或者glyph繪制方法)* @param font 具體的字體集* @Note 關聯方法 drawUTF8 drawStr drawGlyph print*/ void U8G2::setFont(const uint8_t *font)

Font會根據像素點高度做了很多區分,具體font請參考 wiki。
如果我們需要用到中文字符,可以在wiki里面搜索一下chinese,你就會發現很多中文font,比如:

//支持UTF-8或者GB2312編碼 u8g2_font_wqy15_t_chinese1 u8g2_font_wqy15_t_chinese2 u8g2_font_wqy15_t_chinese3 u8g2_font_wqy12_t_gb2312 u8g2_font_wqy12_t_gb2312a ......

注意點:

  • 中文字符集消耗內存大,請謹慎使用,可以用在Arduino 101等ram空間比較大的板子上;

至于用哪一個,看自己的需求了。

我們看看Font的命名規則:

<prefix> '_' <name> '_' <purpose> <char set>

其中:

  • prefix基本上都是 u8g2;
  • name 一般會掛鉤上字符像素使用量,比如5X7
  • purpose
描述
tTransparent font, Do not use a background color.
hAll glyphs have common height(所有的圖形有通用的高度).
mAll glyphs have common height and width (monospace).
8All glyphs fit into a 8x8 pixel box.
  • char set
描述
fThe font includes up to 256 glyphs.
rOnly glyphs on the range of the ASCII codes 32 to 127 are included in the font.
uOnly glyphs on the range of the ASCII codes 32 to 95 (uppercase chars) are included in the font.
nOnly numbers and extra glyphs for writing date and time strings are included in the font.
...Other custom character list.

注意點:

  • U8G2庫提供的font非常多,博主也暫時消化不了太多。如果我們使用中文的話,就去看看中文font就好;

示例:Fonts u8g2_font_5x7_tr and u8g2_font_pressstart2p_8u

3.2.3.17 u8g2.setFontDirection() —— 設置字體方向

函數說明:

/*** 定義字符串繪制或者圖形繪制的方向* @param dir 方向* @param 關聯方法 drawStr*/ void U8G2::setFontDirection(uint8_t dir)

注意點:

  • dir參數
ArgumentString RotationDescription
00 degreeLeft to right
190 degreeTop to down
2180 degreeRight to left
3270 degreeDown to top

示例:

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

3.2.4 緩存相關函數

緩存相關函數,一般不會去操作,了解即可;

3.2.4.1 u8g2.getBufferPtr() —— 獲取緩存空間的地址

函數說明

/*** 獲取緩存空間的地址* @return 返回緩存空間起始地址* @Note 關聯方法 getBufferTileHeight, getBufferTileWidth, clearBuffer*/ uint8_t *U8G2::getBufferPtr(void)

注意點:

  • 緩存大小等于 8 * u8g2.getBufferTileHeight() * u8g2.getBufferTileWidth().

3.2.4.2 u8g2.getBufferTileHeight() —— 獲取緩沖區的Tile高度

函數說明

/*** 獲取緩沖區的Tile高度* @return 返回高度值*/ uint8_t U8G2::getBufferTileHeight(void)

注意點:

  • 一個tile等于8個像素點.

3.2.4.3 u8g2.getBufferTileWidth() —— 獲取緩沖區的Tile寬度

函數說明

/*** 獲取緩沖區的Tile寬度* @return 返回寬度值*/ uint8_t U8G2::getBufferTileWidth(void)

注意點:

  • 一個tile等于8個像素點.

3.2.4.4 u8g2.getBufferCurrTileRow() —— 獲取緩沖區的當前Tile row

函數說明

/*** 獲取緩沖區的當前Tile row行數* @return 返回當前的tilerow*/ uint8_t U8G2::getBufferCurrTileRow(void)

注意點:

  • 這個方法跟我們上面說到的page position相關.

3.2.4.5 u8g2.setBufferCurrTileRow() —— 設置緩沖區的當前Tile row

函數說明

/*** 設置緩沖區的當前Tile row* @param 當前的tilerow*/ void U8G2::setBufferCurrTileRow(uint8_t row)

注意點:

  • 在 firstPage/nextPage 循環時,由于底層調用了setBufferCurrTileRow,所以盡量不要自己手動調用該方法;

示例:

u8g2.setBufferCurrTileRow(0); // let y=0 be the topmost row of the buffer u8g2.clearBuffer(); u8g2.setFont(u8g2_font_helvB08_tr); u8g2.drawStr(2, 8, "abcdefg");u8g2.setBufferCurrTileRow(2); // write the buffer to tile row 2 (y=16) on the display u8g2.sendBuffer(); u8g2.setBufferCurrTileRow(4); // write the same buffer to tile row 4 (y=32) on the display u8g2.sendBuffer();

利用好該方法,我們可以實現部分更新;

4.如何運用U8G2庫

????前面博主介紹到U8G2適配了絕大部分的OLED,那么我們如何構建具體的OLED驅動呢?可分為以下幾個順序步驟:

  • 區分顯示器
  • 選擇物理總線方式
  • 區分數字連線
  • U8g2初始化
  • U8g2繪制模式

4.1 區分顯示器

????首先,你需要知道OLED顯示器的控制器型號以及屏幕大小。舉個例子,博主手上有一塊SSD1306 128X64的OLED,那么它的控制器就是SSD1306,屏幕大小是128X64。
????其次,你所選擇的OLED必須在U8g2庫所支持的OLED列表中,具體可參考 鏈接地址。

4.2 選擇物理總線方式

????圖像信息是通過物理總線方式發給OLED顯示器。通常,我們的總線包括:

  • 3SPI,3-wire SPI:串行外圍接口,依靠三個控制信號,Clock、Data、CS;
  • 4SPI, 4-Wire SPI,跟3SPI一樣,只是額外多了一條數據命令線,經常叫做D/C;
  • I2C, IIC or TWI: SCL SDA;
  • 8080:A 8-Bit bus which requires 8 data lines, chip select and a write strobe signa
  • 6800: Another 8-Bit bus, but with a different protocol.

????具體的OLED使用什么物理總線,我們需要查閱各自的數據手冊。比如,博主的SSD1306就是IIC。

4.3 區分數字連線

????知道了物理連線模式之后,我們一般都是把OLED連接到Arduino Board的輸出引腳,也就是軟件模擬具體總線協議。當然,如果有現成的物理總線端口那就更好了。

4.4 U8g2初始化

????經歷以上三步之后,我們就可以開始初始化出具體的OLED驅動了。比如,博主的IIC SSD1306 128X64 的OLED,就可以用以下初始化構造器(Builder設計模式,有空可以去了解一下):

U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display

當然SSD1306還有其他構造器(具體可以參考 wiki):

Controller "ssd1306", Display "128x64_noname"Descirption
U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI(rotation, clock, data, cs, dc [, reset])page buffer, size = 128 bytes
U8G2_SSD1306_128X64_NONAME_2_4W_SW_SPI(rotation, clock, data, cs, dc [, reset])page buffer, size = 256 bytes
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI(rotation, clock, data, cs, dc [, reset])full framebuffer, size = 1024 bytes
U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI(rotation, cs, dc [, reset])page buffer, size = 128 bytes

????那么,我們這里就需要重點講述一下構造器的規則。
????構造器的名字包括以下幾方面:

NoDescriptionExample
1PrefixU8G2
2Display ControllerSSD1306
3Display Name128X64_NONAME
4Buffer Size1, 2 or F (full frame buffer)
5Communication4W_SW_SPI

????它們之間使用"_"連接起來。其中:

  • BufferSize,緩存大小
BufferSizeDescription
1保持一頁的緩沖區,用于firstPage/nextPage的PageMode.
2保持兩頁的緩沖區,用于firstPage/nextPage的PageMode..
F獲取整個屏幕的緩沖區,ram消耗大,一般用在ram空間比較大的arduino板子.
  • Communication,通信協議
CommunicationDescription
4W_SW_SPI4-wire (clock, data, cs and dc) software emulated SPI
4W_HW_SPI4-wire (clock, data, cs and dc) hardware SPI (based on Arduino SPI library)
2ND_4W_HW_SPIIf supported, second 4-wire hardware SPI (based on Arduino SPI library)
3W_SW_SPI3-wire (clock, data and cs) software emulated SPI
SW_I2CSoftware emulated I2C/TWI
HW_I2CHardware I2C based on the Arduino Wire library
2ND_HW_I2CIf supported, use second hardware I2C (Arduino Wire lib)
68008-bit parallel interface, 6800 protocol
80808-bit parallel interface, 8080 protocol
  • Rotation (軟件模擬總線前提下的構造器的第一個參數)
Rotation/MirrorDescription
U8G2_R0No rotation, landscape
U8G2_R190 degree clockwise rotation
U8G2_R2180 degree clockwise rotation
U8G2_R3270 degree clockwise rotation
U8G2_MIRRORNo rotation, landscape, display content is mirrored (v2.6.x)

所以,一個完整的例子為:

#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() ); }

????那么,我們來看看到底構造器里面做了什么操作?還是以博主使用的SSD1306 128X64為例子:

/*** SSD1306 4線軟件模擬SPI*/ U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI(.....)

????類定義:

/*** SSD1306構造器,繼承U8G2*/ class U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI : public U8G2 {public: U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {//配置SSD1306u8g2_Setup_ssd1306_128x64_noname_1(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);//設置通信協議u8x8_SetPin_4Wire_SW_SPI(getU8x8(), clock, data, cs, dc, reset);} };

????從上面代碼看出,默認調用了父類U8G2的構造函數,我們看看它里面做了什么:

class U8G2 : public Print {protected:u8g2_t u8g2;u8x8_char_cb cpp_next_cb; /* the cpp interface has its own decoding function for the Arduino print command */public:u8g2_uint_t tx, ty;U8G2(void) { //設置Arduino print函數的解碼方法,這里是ASCII,當然也有UTF-8cpp_next_cb = u8x8_ascii_next; //屏幕初始化home(); }.......
  • U8G2類構造函數主要是定義好解碼方法以及初始化屏幕(包括重置原點);

????然后我們看看,u8g2_Setup_ssd1306_128x64_noname_1做了什么:

void u8g2_Setup_ssd1306_128x64_noname_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb) {uint8_t tile_buf_height;//定義好緩存空間 記住 這里是 1 page modeuint8_t *buf;//配置屏幕u8g2_SetupDisplay(u8g2, u8x8_d_ssd1306_128x64_noname, u8x8_cad_001, byte_cb, gpio_and_delay_cb);//生成buf 這里是128 bytesbuf = u8g2_m_16_8_1(&tile_buf_height);//初始化bufu8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation); }/*============================================*/ /*This procedure is called after setting up the display (u8x8 structure).--> This is the central init procedure for u8g2 object */ void u8g2_SetupBuffer(u8g2_t *u8g2, uint8_t *buf, uint8_t tile_buf_height, u8g2_draw_ll_hvline_cb ll_hvline_cb, const u8g2_cb_t *u8g2_cb) {u8g2->font = NULL;//u8g2->kerning = NULL;//u8g2->get_kerning_cb = u8g2_GetNullKerning;//u8g2->ll_hvline = u8g2_ll_hvline_vertical_top_lsb;u8g2->ll_hvline = ll_hvline_cb;u8g2->tile_buf_ptr = buf;u8g2->tile_buf_height = tile_buf_height;u8g2->tile_curr_row = 0;//頁碼 這是一個很重要的參數u8g2->font_decode.is_transparent = 0; /* issue 443 */u8g2->bitmap_transparency = 0;u8g2->draw_color = 1;u8g2->is_auto_page_clear = 1;//自動清除u8g2->cb = u8g2_cb;u8g2->cb->update_dimension(u8g2); #ifdef U8G2_WITH_CLIP_WINDOW_SUPPORTu8g2_SetMaxClipWindow(u8g2); /* assign a clip window and call the update() procedure */ #elseu8g2->cb->update_page_win(u8g2); #endifu8g2_SetFontPosBaseline(u8g2); /* issue 195 */#ifdef U8G2_WITH_FONT_ROTATION u8g2->font_decode.dir = 0; #endif }

可以總結幾點:

  • 配置初始化屏幕
  • 配置初始化緩沖區

注意點:

  • 上面講解涉及到了繪制模式,請參考下一節;

4.5 U8g2繪制模式

????U8g2支持三種繪制模式:

  • Full screen buffer mode,全屏緩存模式
  • Page mode (This is the U8glib picture loop) 分頁模式
  • U8x8, character only mode 僅僅支持普通字符

4.5.1 Full screen buffer mode

特點:

  • 繪制速度快
  • 所有的繪制方法都可以使用
  • 需要大量的ram空間

構造器:

  • 構造器必須帶有F,比如:
U8G2_ST7920_128X64_F_SW_SPI(rotation, clock, data, cs [, reset])

用法:

  • 清除緩沖區 u8g2.clearBuffer()
  • 操作一些繪制方法
  • 發送緩沖區的內容到顯示器 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(); }

    4.5.2 Page mode

    特點:

    • 繪制速度慢
    • 所有的繪制方法都可以使用
    • 需要少量的ram空間

    構造器:

    • 構造器必須帶有“1”或者2,比如:
    U8G2_ST7920_128X64_ 1 _SW_SPI(rotation, clock, data, cs [, reset])

    用法:

  • 調用 u8g2.firstPage()
  • 開始一個 do while 循環
  • 在循環內部 操作一些繪制方法
  • 不斷判斷 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() ); }

    4.5.3 U8x8 character mode

    特點:

    • 繪制速度快
    • 并不是對所有的顯示器都有效
    • 圖形繪制不可用
    • 不需要ram空間

    構造器:

    • 使用U8X8構造器,比如:
    U8X8_ST7565_EA_DOGM128_4W_SW_SPI(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!"); }

    轉載于:https://www.cnblogs.com/danpianjicainiao/p/11048729.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的玩转u8g2 OLED库,一篇就够的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产免费叼嘿网站免费 | 国产精品久久久久久a | 久久久久久久久久网 | 91传媒在线看 | 国产精品 中文字幕 亚洲 欧美 | 国产剧情一区 | 91av视频在线观看免费 | 成人免费在线看片 | 成人精品一区二区三区电影免费 | 亚洲精品视频在线观看免费视频 | 国产高清免费av | 日本在线观看中文字幕无线观看 | 国产一区视频免费在线观看 | 天天操天天曰 | 在线观看一级片 | 欧美国产高清 | 天天舔天天射天天操 | 免费在线播放av电影 | 一区在线观看 | 国产二区免费视频 | 免费日韩 精品中文字幕视频在线 | 中文字幕永久 | 九九免费观看视频 | 久久艹在线 | 99在线视频网站 | 黄色一二级片 | 在线日韩中文 | 日韩欧美国产成人 | 天天插天天操天天干 | 高清av中文在线字幕观看1 | 夜夜摸夜夜爽 | 久久久国产网站 | 综合久久影院 | 欧美日韩在线精品一区二区 | 玖草在线观看 | 午夜精品久久久久久久爽 | a在线观看免费视频 | 久久免费黄色大片 | 亚洲精品国产精品久久99热 | 国产精品第十页 | 国产美女永久免费 | 国产精品va在线 | 成人av在线影视 | 最新超碰在线 | 91久久久久久久 | 亚洲自拍av在线 | 国产精品视频地址 | 中文免费在线观看 | 怡红院久久| 激情五月看片 | 一级淫片在线观看 | 日本午夜免费福利视频 | 亚洲精品美女在线观看 | 亚洲激情五月 | 日韩av免费一区 | 亚洲综合在线五月天 | 四虎在线免费 | 狠狠狠狠狠色综合 | 久久久久久99精品 | 免费黄色在线网址 | 国产精品一区二区免费 | 综合天天色 | 日韩黄色免费电影 | 在线成人免费电影 | 色五月成人 | 亚洲理论片 | 久草视频精品 | 日韩在线观看 | 日日骑| 我要色综合天天 | 亚洲永久精品在线 | 国产伦理久久 | 亚洲精品视频二区 | 久久视频在线视频 | 久久精品视频在线看 | 激情婷婷久久 | 亚洲精品视频第一页 | 天天操天天添 | 2024av| 日韩av一区二区三区四区 | 激情欧美一区二区三区免费看 | 国产精品一区二区电影 | 久久99精品热在线观看 | 最新影院 | 亚洲精品国产日韩 | 国产精品免费在线 | 国产精品亚洲片夜色在线 | 欧美坐爱视频 | 欧美激情综合色综合啪啪五月 | 婷婷丁香色| 欧美一级片在线播放 | 国产免费亚洲高清 | 国产又粗又猛又黄又爽的视频 | 欧美大片mv免费 | 亚洲 成人 一区 | 久久天天躁夜夜躁狠狠85麻豆 | 国产精品少妇 | 欧美欧美 | 精品999在线观看 | 人人爽人人舔 | 国产精品第2页 | 黄色亚洲精品 | 国产美女久久 | 亚洲一区欧美精品 | 美女露久久 | 久久在线精品视频 | 狠狠成人 | 玖玖在线播放 | 国产电影黄色av | 日韩午夜电影 | 国产精品精品国产色婷婷 | 丁香婷婷社区 | 最近中文字幕高清字幕在线视频 | 97色婷婷成人综合在线观看 | 99中文在线| 精品国产一区在线观看 | 91私密视频 | 91看片在线观看 | 福利久久久 | 在线视频久久 | 中文字幕久久网 | 日日夜夜精品免费视频 | 中文在线天堂资源 | a国产精品| 国产永久免费高清在线观看视频 | 国产亚洲精品中文字幕 | 色噜噜日韩精品一区二区三区视频 | 日韩精品一区二区三区电影 | 久久黄色免费 | 四虎8848免费高清在线观看 | 一区二区电影网 | 国产一级一片免费播放放 | 成人久久久久久久久 | 成人av地址| 免费黄色在线播放 | 99这里只有精品视频 | 国产一级大片在线观看 | 国产精品久久久久免费观看 | 欧美99热| 成人 国产 在线 | 99久久99久久精品国产片果冰 | 成人av免费在线 | 99电影 | 国产成人三级 | 中文资源在线官网 | 国产乱码精品一区二区三区介绍 | av大片免费 | 国产亚洲va综合人人澡精品 | 91视频久久久久久 | 免费三级网 | 欧美成年网站 | 日本论理电影 | 综合精品在线 | 国产亚洲精品女人久久久久久 | 日本中出在线观看 | 欧美黑吊大战白妞欧美 | 精品国自产在线观看 | 国产高清视频在线播放 | 二区三区中文字幕 | av成人在线电影 | 国产成人一区二区三区电影 | 午夜10000| 国产1区2区| 亚洲精品综合欧美二区变态 | 激情文学丁香 | 96国产精品视频 | 亚洲黄色av网址 | 亚洲成人资源 | 色婷丁香| 国产一区二区高清 | 蜜臀av在线一区二区三区 | 伊人六月 | 日日夜夜精品免费观看 | 日韩黄色免费看 | 日韩中文字幕免费电影 | 国产成人在线观看免费 | 久久久久久久久久久久影院 | 在线观看日韩视频 | 国产一区观看 | 特级西西444www大胆高清无视频 | 夜夜操天天干, | 日韩电影在线一区 | 国产精品一区二区三区四区在线观看 | 亚洲经典中文字幕 | 日韩免费看的电影 | 天天射综合网视频 | 日韩视频免费播放 | 国产中文伊人 | 国产精品视频永久免费播放 | 国产精品字幕 | 久久婷婷精品视频 | 96在线| 人人爽人人爱 | 黄色电影在线免费观看 | 亚洲涩涩涩涩涩涩 | 97超碰人人澡 | 婷婷.com| 97av视频在线| 欧美日韩另类在线 | 国产精久久久 | 久久午夜色播影院免费高清 | 欧美成人h版电影 | 国产一区二区在线视频观看 | 在线观看视频你懂得 | 色中文字幕在线观看 | 人人干97| 中文字幕在线观看免费高清完整版 | 国产精品免费一区二区三区在线观看 | 精品福利片 | 五月婷婷视频在线 | 国产精品久久久久久久久久久免费看 | 精品欧美一区二区三区久久久 | 国产精品久久久久久久久大全 | 国内精品视频一区二区三区八戒 | 91人人澡人人爽人人精品 | 国产精品专区h在线观看 | 黄色软件网站在线观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 午夜视频播放 | 国产一级黄色av | 国产精品免费久久久久 | 在线观看精品黄av片免费 | 国产精品久久久久四虎 | 国产精品私人影院 | 久久涩视频 | 少妇精品久久久一区二区免费 | 日日夜夜91| 国产人成免费视频 | 亚洲免费精彩视频 | 成人久久亚洲 | 免费黄色看片 | 国产手机在线播放 | 久久精品美女视频 | 久要激情网 | 最近久乱中文字幕 | 国产高清视频免费在线观看 | 欧美ⅹxxxxxx | 在线观看视频国产一区 | 免费观看91视频 | 欧美性黄网官网 | 91麻豆看国产在线紧急地址 | 激情综合五月天 | 国产精品自产拍在线观看蜜 | 久久久18| 丝袜美腿在线播放 | 成人av电影免费在线观看 | 国产在线观看免费 | 天天做日日做天天爽视频免费 | 亚洲精品乱码白浆高清久久久久久 | 国产精品一区二区av | 亚洲精欧美一区二区精品 | 少妇搡bbb| 国产精品二区在线 | 91探花在线视频 | 国产伦理一区二区 | 丰满少妇高潮在线观看 | 国产精品涩涩屋www在线观看 | 69av视频在线观看 | 97香蕉超级碰碰久久免费软件 | 免费在线观看成人 | 欧美精品在线一区二区 | 亚洲高清视频一区二区三区 | 免费av网站在线看 | 美女黄网站视频免费 | 麻豆免费精品视频 | 国产精品一区二区在线免费观看 | 国产在线一区二区 | www.91av在线 | 成人一区二区三区在线 | 午夜丁香视频在线观看 | 日韩视频免费看 | 在线亚洲成人 | 久久久久一区二区三区四区 | 天天操天天爱天天爽 | 久艹视频在线观看 | 久久国产精品色婷婷 | 99色国产 | 国内精品美女在线观看 | 久久激五月天综合精品 | 国产成人99久久亚洲综合精品 | 欧美精品在线一区二区 | 免费看成人片 | 黄色一级在线观看 | 亚洲黄色在线播放 | 久久久久亚洲精品成人网小说 | 操操日| 狠狠狠色丁香综合久久天下网 | 成人黄色大片网站 | 欧美日韩国产一区二区在线观看 | 国产视频一区二区在线播放 | 国产一线天在线观看 | 日韩欧美一区二区三区黑寡妇 | 黄色大片av | 日韩资源在线 | 波多野结衣在线视频一区 | 天天干天天草天天爽 | 久久精品国产成人 | 国产专区在线视频 | 超碰公开在线观看 | 欧美日韩精品综合 | 亚洲国产三级在线 | 久久成人免费视频 | 久久99精品国产一区二区三区 | 日韩av一区二区三区 | 五月天婷亚洲天综合网精品偷 | 国产中出在线观看 | 中文字幕一区二区三区精华液 | 成人aⅴ视频 | 在线观看va| 成人啊 v| 精品自拍av | 911香蕉视频 | 日韩在线视频网站 | 91丨九色丨蝌蚪丨对白 | 欧美色久 | 亚洲午夜久久久久久久久 | 久久深夜福利免费观看 | 日韩中文字幕在线看 | 久久高清免费观看 | 亚洲激情 欧美激情 | 日韩一级成人av | 亚欧洲精品视频在线观看 | 国产精品中文字幕在线观看 | 黄a在线观看| 中文字幕在线观看av | 欧美午夜精品久久久久久浪潮 | 欧美精品免费在线观看 | 婷婷在线免费 | 欧美精品久久久久久久久久丰满 | 99在线看 | 天天操天天拍 | 精品免费视频 | 中文字幕在线播放av | 国产老熟| 日韩 在线 | 天天色天天搞 | 粉嫩av一区二区三区免费 | 午夜精品久久久久久久久久久久久久 | 久久精品国产第一区二区三区 | 一个色综合网站 | 国产精品美女久久久久久 | 麻豆播放 | 日韩一二区在线 | 国产999精品久久久 免费a网站 | 久久久久久久毛片 | 国产中文字幕大全 | 久久女教师 | 亚洲精品久久久蜜桃直播 | 香蕉视频在线视频 | 天天射,天天干 | 911久久香蕉国产线看观看 | 国产69精品久久久久99 | 国产区久久 | 亚洲a免费| 天天玩天天操天天射 | 黄色av三级在线 | 在线日韩亚洲 | 在线播放视频一区 | 久久精国产 | 久久国产三级 | 在线婷婷 | 日韩在线视频精品 | 亚洲精品在线免费 | 在线播放视频一区 | 玖玖爱免费视频 | 免费黄色a网站 | 九九热在线免费观看 | 超碰在线天天 | 久久久久久福利 | 黄色片视频在线观看 | 国产精品久久久久久电影 | 久久爱www. | 97在线观看免费 | 亚洲精品xxx| 三级黄色在线 | 91 在线视频 | 中文字幕观看在线 | 久久er99热精品一区二区三区 | 色婷婷狠狠五月综合天色拍 | 伊人久久av | 在线播放国产一区二区三区 | 欧美性黄网官网 | 成人免费视频视频在线观看 免费 | 韩国av免费在线 | 国产精品久久精品国产 | 亚洲精品高清视频在线观看 | 97电影网手机版 | 国产香蕉在线 | 国产福利一区二区三区在线观看 | 日韩毛片在线免费观看 | 久久婷亚洲五月一区天天躁 | 亚洲美女免费精品视频在线观看 | 香蕉视频网站在线观看 | 中文字幕精品一区 | 五月激情综合婷婷 | 久久久国产电影 | 9999精品| 国产精品情侣视频 | 国产精品免费不卡 | 婷婷在线五月 | 亚洲精品免费在线观看 | 国产+日韩欧美 | 视频国产在线观看18 | 久久爽久久爽久久av东京爽 | av电影在线观看完整版一区二区 | 五月花婷婷 | aⅴ视频在线 | 午夜av在线电影 | 日韩专区在线 | 国产精品丝袜在线 | 人人舔人人插 | 97人人网 | 久久免费av| 夜夜夜夜操 | 91精品国产电影 | 久久综合狠狠综合 | 日韩av网页 | 欧美日韩国产在线一区 | 天天艹天天 | 国产一卡久久电影永久 | 99色网站 | 精品九九久久 | 中文字幕在线看片 | 精品麻豆入口免费 | 亚州国产精品视频 | 日日草夜夜操 | 亚洲免费观看在线视频 | 91女人18片女毛片60分钟 | 免费日韩一区二区三区 | 亚洲乱亚洲乱妇 | 国产视频不卡 | 五月天激情视频 | 中文字幕高清有码 | 国产一区二区三区 在线 | 在线看免费 | 国产在线观看免 | 久久久久久国产精品亚洲78 | 97综合视频 | 亚洲精品高清视频 | 色97在线 | 欧美午夜a | 伊人电影在线观看 | 九九在线免费视频 | 久久久久免费观看 | bbbbb女女女女女bbbbb国产 | 91麻豆精品国产91久久久无限制版 | 日韩成人精品一区二区 | 久久综合五月天婷婷伊人 | www免费看 | 国产成人一区二区三区电影 | 五月天网页| 日韩黄色在线 | 免费aa大片| 亚洲欧洲成人 | 69av视频在线 | 成人午夜网址 | 国产精品一区二区三区在线看 | 亚洲欧美在线综合 | 久久国产女人 | 国产亚洲精品久久久久久大师 | 少妇资源站 | 天天躁日日躁狠狠躁av麻豆 | 99re亚洲国产精品 | 国产一区二区三区视频在线 | 中文字幕在线一二 | 亚洲1区 在线 | www黄| av看片在线观看 | 国产福利一区二区三区在线观看 | 精品福利视频在线观看 | 91在线小视频 | 毛片网站免费 | 精品久久免费 | 国产精品一区二区三区四区在线观看 | 国产免费黄色 | 91亚色视频在线观看 | 国产精品久久久久久久7电影 | 国产黄色特级片 | 久久色中文字幕 | 91在线porny国产在线看 | 黄色三级视频片 | 久久久黄色免费网站 | 日日夜夜天天综合 | 国产精品久久久久久久久久ktv | 最近中文字幕久久 | www黄| 精品国产乱码久久 | www狠狠操 | 国产小视频免费在线观看 | 蜜臀aⅴ国产精品久久久国产 | 97精品国产91久久久久久久 | 一区二区三区在线影院 | 亚洲国产精品第一区二区 | 最近av在线 | 美女av免费看 | 依人成人综合网 | 日韩高清一区 | 欧美日韩一区二区视频在线观看 | 国产精品毛片一区视频播不卡 | 欧美一级片免费播放 | 亚洲日本激情 | 欧美久久99| 国产精品二区三区 | 亚洲午夜久久久久久久久电影网 | 一区二区三区 中文字幕 | 四虎最新入口 | 欧美一区二区三区四区夜夜大片 | 中文字幕黄色av | 日韩性久久 | av高清网站在线观看 | 黄色的网站免费看 | 久久久美女 | 日韩二区三区在线观看 | 免费三及片 | 缴情综合网五月天 | 狠狠躁夜夜躁人人爽超碰91 | 美女av电影| 天天舔天天搞 | 国产在线97 | 国产99久久久久久免费看 | 免费人人干 | 日韩va欧美va亚洲va久久 | 超碰国产97 | 91精品国自产在线偷拍蜜桃 | 婷婷免费视频 | 伊人狠狠操 | 特级a毛片 | 久久精品亚洲一区二区三区观看模式 | avhd高清在线谜片 | 国产精品久久久久久久久久久久久 | 国产日韩高清在线 | 国产精品九九热 | 嫩嫩影院理论片 | 欧美日韩在线观看一区二区 | 超碰在线97免费 | 久久99亚洲精品 | 中文字幕在线专区 | 中文字幕免费 | 婷婷综合| 黄色影院在线免费观看 | 国产黄色精品在线 | 日本中文字幕在线视频 | 国产真实在线 | 久久精品久久99精品久久 | 欧美精彩视频在线观看 | 一区二区三区手机在线观看 | 欧美精品中文字幕亚洲专区 | 国产精品9999久久久久仙踪林 | 免费人做人爱www的视 | jizz18欧美18| 欧美日韩高清一区二区 | 亚洲成人黄色在线 | 美女视频永久黄网站免费观看国产 | 特级xxxxx欧美 | 国产视频欧美视频 | 亚洲免费视频在线观看 | 亚洲在线视频网站 | 久久免费的精品国产v∧ | 狠狠干天天色 | 日韩羞羞 | 亚洲综合激情小说 | 麻豆久久一区 | 美女在线免费观看视频 | 九九免费在线视频 | 丁香婷婷社区 | 国产成人三级在线观看 | 色婷婷狠狠18 | www国产在线 | 2018精品视频| 国产婷婷视频在线 | 久久天天操 | 国产一区二区免费在线观看 | 中文字幕免费高 | 亚洲视频精品在线 | 久久精品综合视频 | 999视频在线播放 | 97热久久免费频精品99 | 日本成人a | 中文字幕av最新更新 | 国产特级毛片 | 丁香花在线视频观看免费 | 91精品高清| 国产黄a三级三级 | 精品在线看 | 免费看搞黄视频网站 | 在线播放一区二区三区 | 亚洲视频免费在线看 | 欧美久久久久 | 伊人五月天.com | 精品日韩中文字幕 | 久久免费看av | 天天色视频| 欧美日比视频 | 中文字幕久久精品一区 | 西西www4444大胆视频 | 国产成人亚洲在线电影 | 色网免费观看 | 国产一性一爱一乱一交 | 婷婷社区五月天 | 国产三级香港三韩国三级 | 亚洲精品免费看 | 午夜精品久久久久久久99 | 欧美性极品xxxx娇小 | 成人小视频在线播放 | 99麻豆久久久国产精品免费 | 欧美日韩午夜 | 久久久久亚洲精品男人的天堂 | 国产精品亚洲视频 | 激情久久网 | www.成人精品| 伊人成人激情 | 亚洲狠狠婷婷 | 国产亚洲精品电影 | 中文字幕在线一区二区三区 | 成年人网站免费观看 | 人人澡人 | 手机av在线不卡 | 日韩欧美高清在线 | 久久久精品一区二区 | 看全黄大色黄大片 | 91视频在线自拍 | 国产一二三四在线观看视频 | 日日爽天天 | 欧美一级片在线播放 | av在线免费在线观看 | 中文字幕一区二区三区在线观看 | 国产精品毛片一区二区 | 天天操天天射天天爱 | 99精品视频在线播放观看 | 免费在线观看视频一区 | 91精品网站在线观看 | 狠狠狠色丁香综合久久天下网 | 天天曰视频 | www中文在线| 777奇米四色 | 黄色aaa级片| 亚洲精品国产高清 | 日日日操操 | 最近中文字幕mv免费高清在线 | 国产高清视频在线免费观看 | 欧美日一级片 | 一区二区三区免费在线观看视频 | 久久综合国产伦精品免费 | 精品国产aⅴ麻豆 | 日韩欧美高清免费 | 精品国内 | 久久看视频| 国产午夜精品免费一区二区三区视频 | 在线精品观看国产 | 成人黄色免费在线观看 | 国产精品大尺度 | 中文字幕在线视频网站 | www..com毛片| 色网影音先锋 | 天天想夜夜操 | 免费在线观看不卡av | 美女黄久久 | 日韩欧美在线中文字幕 | 日韩在线 | av中文国产 | 久久经典国产视频 | 欧美日韩电影在线播放 | 摸bbb搡bbb搡bbbb| 婷婷丁香在线观看 | 人人爱人人舔 | 久久国产精品第一页 | 国产精品99久久久久久武松影视 | 99视频国产在线 | 日本不卡视频 | 中文字幕在线成人 | 视频二区在线 | 免费看高清毛片 | 99热九九这里只有精品10 | 久草免费在线 | 中文乱幕日产无线码1区 | 亚洲最大免费成人网 | www.99在线观看 | 免费99| 欧美大香线蕉线伊人久久 | 在线视频18在线视频4k | 国产精品久久一区二区三区, | 久久精品一区二区三区国产主播 | 视频91| 五月天精品视频 | 日本一区二区三区视频在线播放 | 国产正在播放 | 久久国语露脸国产精品电影 | 福利精品在线 | 91在线视频免费播放 | 国产在线国偷精品产拍免费yy | 亚洲人av免费网站 | 亚洲精品影视在线观看 | 91av官网 | 中文字幕黄色av | 美女黄频 | 久久精选| 免费在线成人 | 国产麻豆电影在线观看 | 麻豆视屏| 国产又粗又长又硬免费视频 | 一区二区三区韩国免费中文网站 | 在线观看av小说 | 天天操婷婷 | 国产精品日韩精品 | v片在线播放 | 欧美日韩在线观看不卡 | 日韩视频a | 欧美一级裸体视频 | 国产在线观看午夜 | 特黄免费av | 日韩黄色免费看 | 精品久久久久一区二区国产 | 免费能看的黄色片 | 激情五月播播久久久精品 | 最近中文字幕在线播放 | 精品免费观看视频 | 欧美成人性战久久 | 国产色视频网站2 | 欧美a级片网站 | 免费欧美 | 三级小视频在线观看 | 中文字幕精品在线 | 久久这里有 | 久久99久久精品国产 | 久久dvd | 久久久久久国产一区二区三区 | 在线看免费 | 日韩色综合 | 国产精品久久嫩一区二区免费 | 欧美一级免费 | 色婷婷综合久色 | 蜜臀av性久久久久av蜜臀三区 | 国产精品久久亚洲 | 韩国精品福利一区二区三区 | 免费毛片一区二区三区久久久 | 丁香午夜 | 免费观看一级 | 天天干,天天插 | 中文字幕av影院 | 四川bbb搡bbb爽爽视频 | av免费电影在线观看 | 欧美亚洲专区 | 日本最大色倩网站www | 五月婷香| 国内小视频 | 99久久99久久 | 国产成人精品三级 | 午夜国产一区 | 在线亚州 | 亚洲特级毛片 | 黄p网站在线观看 | 国产成人精品一二三区 | 日本久久高清视频 | 久久久久久久久久免费视频 | 中文在线天堂资源 | 国产精品中文字幕av | 天天射天天干天天 | 国产精品成人在线 | 女人18毛片a级毛片一区二区 | 亚洲国产成人av网 | 国产在线观看91 | 久久免费视频播放 | 国产精品久久久久久影院 | 毛片一区二区 | 国产在线91在线电影 | 国产日韩在线看 | 免费a网 | 欧美电影黄色 | 久久国产99 | 国产第一页在线观看 | 亚洲伊人网在线观看 | 国产在线观| 男女激情免费网站 | 日日干综合 | 亚洲欧洲成人 | 国产免费亚洲 | 久久久久电影 | 久久精品看 | 国产精品一区二区免费视频 | 婷婷视频在线播放 | 国产手机在线视频 | 在线a视频 | 天天操夜夜操夜夜操 | 中文字幕国产一区 | 亚洲精品中文字幕视频 | 国产精品一区二区三区在线看 | 成人性生交大片免费看中文网站 | 亚洲婷婷综合色高清在线 | 日韩成人黄色av | 美女在线观看网站 | 国产精品午夜在线 | 欧美日韩在线精品 | 97免费视频在线 | 色综合久久综合网 | 久久国产精品99久久久久久老狼 | 午夜12点| 国产亚洲精品久久久久久大师 | 色综合久久久久久久久五月 | 国内免费久久久久久久久久久 | 9热精品 | 99在线免费观看 | 99精品欧美一区二区三区 | 97精品久久人人爽人人爽 | 欧美日韩一区二区三区在线免费观看 | 久久综合久久久 | 蜜臀av免费一区二区三区 | 色爽网站| 九九国产视频 | 亚州国产精品 | 999久久 | 少妇bbbb搡bbbb桶| 日韩精品短视频 | 国产高清av免费在线观看 | 综合色站导航 | 国产福利91精品一区 | 在线播放 日韩专区 | 国产精品久久久久久久久久妇女 | 狠狠干在线 | 亚洲免费在线 | 久久精品一二三区白丝高潮 | 一区三区在线欧 | 亚洲一级片在线观看 | 草在线| 欧美日韩综合在线观看 | 精品久久久精品 | 久久夜色精品国产欧美乱极品 | 日韩乱码中文字幕 | 99国内精品 | 免费开视频 | 日韩av电影中文字幕在线观看 | 三级av免费| 日韩经典一区二区三区 | 成人日批视频 | 13日本xxxxxⅹxxx20| 麻豆视频在线观看免费 | 成人免费网站视频 | 不卡av在线 | 黄色a一级视频 | 成人在线你懂得 | 欧美日韩高清一区二区 国产亚洲免费看 | 97在线影院 | 天天爱天天射天天干天天 | 成人免费视频视频在线观看 免费 | 91传媒免费在线观看 | 99日精品 | 成人午夜黄色影院 | 天天躁日日躁狠狠 | 国产人成在线观看 | aa一级片 | av黄色在线播放 | 成人毛片一区 | 成人高清在线观看 | 美女黄久久 | 99视频免费看 | 日本中文字幕网 | 国产精品欧美久久久久久 | 制服丝袜在线 | 在线观看视频一区二区 | 久久午夜电影 | 国产在线无 | 一区二区三区国 | 国产精品免费不 | 激情五月色播五月 | 久久超碰97 | 日本高清免费中文字幕 | 欧美日韩国产三级 | 一区二区三区四区五区六区 | 日本三级人妇 | 午夜av网站| 永久免费的av电影 | 国产精品四虎 | 精品国产自在精品国产精野外直播 | 人人狠狠综合久久亚洲婷 | 1区2区3区在线观看 三级动图 | 欧美黄污视频 | 深夜激情影院 | 久久国产乱 | 国产美女视频免费观看的网站 | 日韩专区 在线 | 国产亚洲欧美精品久久久久久 | 亚洲欧洲国产精品 | 一本一道久久a久久精品蜜桃 | 午夜精品久久久久久久爽 | 国产在线精品二区 | 日韩中文字幕亚洲一区二区va在线 | 视频在线观看99 | 人人草在线视频 | 天天操天天摸天天干 | 九九精品视频在线看 | 欧美精彩视频在线观看 | 国产一二区视频 | 久久69av| 婷婷av电影| 在线看片中文字幕 | 免费成人结看片 | 久久久久久久久亚洲精品 | 国产亚洲精品久久久久久移动网络 | 亚洲男人天堂a | 亚洲视频电影在线 | 青青射 | 草久在线观看视频 | 手机看片午夜 | 狠狠五月天 | 中文字幕在线看视频国产 | 欧美精品亚洲二区 | 久久久精品网站 | 国产一级在线观看 | 久草在线资源网 | av一级片网站 | 国产精品丝袜久久久久久久不卡 | 视频在线观看一区 | 久久电影日韩 | 亚州精品天堂中文字幕 | 国产一级免费电影 | 激情婷婷 | 国产理论免费 | 日本精品中文字幕 | 婷五月天激情 | 日韩丝袜在线观看 | 免费在线观看av | 久草新在线 | 久久久成人精品 | 天天操福利视频 | 久久久久久久国产精品视频 | 久久久久久久久综合 | 亚洲欧美日韩精品一区二区 | 91超碰在线播放 | 五月天激情在线 | 欧美aa一级 | av.com在线| 91高清视频 | 在线a亚洲视频播放在线观看 | 91av蜜桃| 色婷婷免费视频 | 日韩av在线免费播放 | 亚洲一区二区视频 | 国产专区在线看 | 色午夜影院 | 久久九九久久九九 | 色噜噜在线观看 | 成人羞羞视频在线观看免费 | 黄色网在线播放 | 中文字幕文字幕一区二区 | 日韩精品一区二区三区高清免费 | 1区2区3区在线观看 三级动图 | 久久久久久黄 | 999久久久国产精品 高清av免费观看 | 中文字幕一区二区三 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 国产一区二区三区高清播放 | 91九色蝌蚪视频在线 | 日本在线观看视频一区 | 欧美黄色成人 | 久久深夜福利免费观看 | 日本三级不卡视频 | 国产黄色免费电影 | www.五月婷婷 | 97碰视频| 欧美另类xxx | 亚洲激情校园春色 | 国产精品欧美久久 | 81国产精品久久久久久久久久 | 亚洲精品免费视频 | 欧美人操人 | 久久不卡国产精品一区二区 | 欧美激精品| 日韩成人免费在线电影 | 91传媒在线观看 | 黄污网站在线观看 | 色九九影院| 中文字幕乱码一区二区 | 国产 日韩 中文字幕 | 在线播放第一页 | 免费久草视频 | 日韩免费观看一区二区 | 99r精品视频在线观看 | 在线观看中文av | 手机在线看永久av片免费 | 精品久久久久久久久久久久久久久久久久 | 亚洲精品乱码久久久久久蜜桃91 | 超碰免费久久 | 久久综合国产伦精品免费 | 日日干天天爽 | 国产精品影音先锋 | 色多多视频在线观看 | 久草在线视频首页 | 日韩丝袜视频 | 色在线免费观看 | 久久综合中文色婷婷 | 在线观看日本高清mv视频 | 国产色婷婷 | 中文字幕在线免费观看 | 国产黄网站在线观看 | 天堂激情网 | 亚洲日本韩国一区二区 | 日本中文字幕电影在线免费观看 | 三级视频片 | 日韩二区三区在线观看 |