ndfweb.cn

【arduino】【u8g2庫】OLED屏-U8glib庫 增強版 U8G2庫


2020-10-05 15:58:41 (14335)



以下的函數描述是源自原文: https://github.com/olikraus/u8g2/wiki/u8g2reference#begin 
自己再通過測試後才發布,采用一個更新方式(精力有限,學習為主),客官覺得不錯,就打賞一下唄~ 
U8G2是U8GLIB的增強版,相對舊版更加好用,強大,兼容板子多。U8G2有兩種模式:U8g2是增強版模式,U8X8是簡便模式省內存,在setup()裏必須設定模式. 
函數開始前,先講一個東西。arduino 和OLED連接的方法(示例NANO和128X64 API OLED) 
  
顏色對顏色線連接。 
nano的板子上的D4567腳可以修改。不修改也行。 

SCL=S&COLCK  //時鍾     SDA=S&DATA //數據        RES/RST = Reset //複位       D/C = DC 
API連接這4條交互線就行了,和另外供電。 那麼在代碼中一開始必須定義好腳: (D3號腳可以不接) 

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI  u8g2 (U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);    //這個定義腳代碼細心看就懂了。 

//U8G2支持的OLED控製芯片: https://github.com/olikraus/u8g2/wiki/gallery 
//不同芯片的不同腳定義代碼: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp 
例子:


  1. #include <Arduino.h>

  2. #include <SPI.h>

  3. #include <U8g2lib.h>


  4. U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);


  5. void setup(void) {

  6.   u8g2.begin();   //選擇U8G2模式,或者U8X8模式

  7. }


  8. void loop(void) {

  9.   u8g2.firstPage();

  10.   do {

  11.     u8g2.setFont(u8g2_font_ncenB14_tr);

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

  13.   } while ( u8g2.nextPage() );

  14.   delay(1000);

  15. }


複製代碼

U8G2_R0 是一個參數: 指定大局顯示的基本布局: 

布局描述
U8G2_R0正常顯示
U8G2_R190度順時針旋轉
U8G2_R2180度順時針旋轉
U8G2_R3270度順時針旋轉
U8G2_MIRROR正常顯示鏡像內容(v2.6.x版本以上使用)         注意:U8G2_MIRROR需要與setFlipMode()配搭使用.


------------------------------------------------- 屏幕基本函數 ------------------------------------------- 
u8g2.begin( )    //開始構造U8G2, 在setup()內使用。     特別說明: 初始化在 Arduino的環境。 配置OLED的顯示模式initDiplay或者省電模式setPowerSave,或者重置(清屏)clearDisplay 。同時檢測六個按鈕程序(比如前進、後退、確認、上一級...)。如果沒有,可以在裏定義按鈕事件的引腳,用GetMenuEvent函數來定義,來進入到用戶想要的界麵,詳情就看userInterfaceMessage  GetMenuEvent 函數。無返回值。 
  關聯使用函數:initDispaly 、setPowersave、clearDisplay、 

u8g2.clear()   // 清除緩衝區"Buffer"內的所有像素點 
   關聯使用函數:print、home、clearBuffer 


u8g2.clearBuffer()    //清除內存中的所有緩衝區內的像素,而後可以用sendBuffer函數來把緩衝區“Buffer”在屏幕上顯示出來,以便清屏。因這個過程是在微處理器中RAM裏的副本"Buffer"中進行,標誌“F”,所以 sendBuffer也就是直接操作副本“Buffer”。 
     關聯使用函數:sendBuffer 例子: 


  1. void loop(void) {

  2. u8g2.clearBuffer();   //清除當前Buffer內的像素

  3.                            // 在Buffer內一些操作 

  4. u8g2.sendBuffer();    //發送Buffer內容到屏上

  5. delay(1000);


複製代碼



u8g2.clearDisplay()    //清除顯示中所有像素。此過程在begin()中調用。在程序中一般用不上,也是通過sendBuffer和clearBuffer函數顯示出來,一樣的處理方式。 
關聯使用函數:begin 

u8g2.disableUTF8Print()  //禁用 UTF8字集 (萬國語字庫),默認是開啟的。 關聯使用函數:print 、enableUTF8Print  

u8g2.enableUTF8Print ()     //啟用 UTF8字集,許可UniCode向print發送字符串。這個函數通常在begin()後調用。 
關聯使用函數:print、disableUTF8Print 
例子: 


  1. void setup(void) {

  2.   u8g2.begin();

  3.   u8g2.enableUTF8Print();       // 使print支持UTF8字集

  4. }


複製代碼


u8g2.Print()     //在入當前光標位置用當前設置的字體,來打印出(內容)。光標位置可以用setCursor函數 。字體可以用setFont函數。 
關聯使用函數:print(U8x8)、enableUTF8Print、setFont、setCursor、 
例子: 

  1. u8g2.setFont(u8g2_font_ncenB14_tr); //設置字體

  2. u8g2.setCursor(0, 15);    //設置光標處

  3. u8g2.print("Hello World!");  //輸出內容


複製代碼

U8x8: 一個自帶字庫,詳情見setFont函數 

------------------------------------------------- 繪圖顯示函數 ------------------------------------------- 
u8g2. drawBitMap()   //在指定的x / y位置(位圖左上角)繪製位圖.。位圖的部分可能位於顯示邊界之外。位圖由數組位圖指定。清除位意味著:不繪製像素。數組內的一個置位意味著:用當前顏色索引寫像素。對於單色顯示器,顏色索引0通常會清除一個像素,並且顏色索引1將設置一個像素。 因為複雜耗內存,此函數在U8G2中被停用! 格式:u8g2.drawBitMap (x,y,cnt,h) 
參數:   x是水平線位置 
           y是垂直線位置 
           cnt是點陣圖字節數,寬是1字節*8(這個字節數必須控製好,否則點陣圖會出現扭曲) 
           h是點陣圖高度 

u8g2.drawBox()     //畫個實心方形
格式:u8g2.drawBitMap (x,y,w,h) 
參數:   x是水平線起始位置 
           y是垂直線 起始 位置 
           w是方形的寬 
           h是 方形的  
例子: 


  1. #include <Arduino.h>

  2. #include <SPI.h>

  3. #include <U8g2lib.h>


  4. U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* cs=*/ 3, /* dc=*/ 6, /* reset=*/ 7);


  5. void setup(void) {

  6.   u8g2.begin();

  7. }


  8. void loop(void) {

  9. u8g2.firstPage();

  10. do {

  11. u8g2.drawBox(48,20,25,15);  //(起始X,起始Y,方形的寬W,方形的高H)

  12. } while ( u8g2.nextPage() );

  13. delay(1000);

  14. }


複製代碼


u8g2.drawCircle()       //畫個空心圓,可選四個方向的半圓 
類似與關聯函數:drawDisc 、setDrawColor格式:u8g2.drawCircle(x, y ,rad,opt);  // X,YS是繪圖起始位置(圓的中心點),rad是圓的四分之一弧度。 opt是選項: 

U8G2_DRAW_UPPER_RIGHT     //左上角弧度

U8G2_DRAW_UPPER_LEFT     //右上角弧度

U8G2_DRAW_LOWER_LEFT    //左下角幅度

U8G2_DRAW_LOWER_RIGHT      //右下角幅度

U8G2_DRAW_ALL      //全圓

例子: 


  1. void loop(void) {

  2. u8g2.firstPage();

  3. do {

  4. u8g2.drawCircle(48, 30, 10, U8G2_DRAW_LOWER_LEFT);

  5. } while ( u8g2.nextPage() );

  6. delay(1000);

  7. }


複製代碼


u8g2.drawDisc()     //畫個實心圓,使用法跟drawCircle 一個餅樣。多普達手機不好使,圖片將就看。 
  

U8G2.drawEllipse()       //畫一個空心橢圓形,實際上,和畫圓是非常相似的用法。格式:u8g2.drawEllipse(X,Y, RX, RY, OPT); 

參數: X,Y是橢圓形中心坐標

          RX是橢圓形水平線的RAD,RY是垂直線的RAD

           opt是選項:

U8G2_DRAW_UPPER_RIGHT     //左上角弧度

U8G2_DRAW_UPPER_LEFT     //右上角弧度

U8G2_DRAW_LOWER_LEFT    //左下角幅度

U8G2_DRAW_LOWER_RIGHT      //右下角幅度

U8G2_DRAW_ALL      //全圓

例子:

void loop(void) {

u8g2.firstPage();

do {

u8g2.drawEllipse(48, 30, 15, 10, U8G2_DRAW_ALL);

} while ( u8g2.nextPage() );

delay(1000);

}

、  



u8g2.drawFilledEllipse()     
 //畫一個實心橢圓形,與u8g2.drawEllipse用法也是一個餅樣 
  


u8g2.DrawFrame      //畫一個空心方框格式: 
u8g2.drawFrame(X,Y,W,H);   // X,Y是方框的左上角坐標,W,H是寬和高,注意,如果方框比屏大,則多出部分不繪畫,也就是說不耗內存和出現錯圖。 
例子: 
void loop(void) { 
u8g2.firstPage(); 
do { 
u8g2.drawFrame(48,30,25,15); 
} while ( u8g2.nextPage() ); 
delay(1000); 
} 



u8g2.drawGlyph()    //繪製字集裏的符號,這個功能很帥。

格式:u8g2.drawGlyph(X,  Y,  字集代碼);    // XY依然是坐標,字集需要先設置字體,然後參考示圖選擇符號輸出,如下圖

例子:

void loop(void) {

u8g2.firstPage();

do {

u8g2.setFont(u8g2_font_unifont_t_symbols);   //先設置字體字集

u8g2.drawGlyph(48, 40, 0x2603);                       //輸出代碼

} while ( u8g2.nextPage() );

delay(1000);

}


  



u8g.drawLine()     //畫一條平麵直線 
格式:u8g.drawLine(x0, y0, x1, y1);    //x0,y0是直線起始位置, x1,y1是直線終止位置。例子: 
u8g.drawLine(20, 5, 5, 32); 
  
drawPixel()     //畫一個點,一個點的像素。 
格式:drawPixel(x,y)      //x,y是畫點的位置。(寬,高) 


u8g2.drawRFrame()     //畫一個圓角空心方形 
u8g2.drawRBox()   //畫一個圓角實心方形
 
特別說明:關於這兩個代碼,綜合一下U8G2裏麵關於畫四邊形的函數:drawBox(實心),drawFrame(空心)這兩個是直角四邊形。然而 drawRBox(實心),drawRFrame(空心)  這兩個帶R的是圓角四邊形的。Box是實心,Frame是空心,帶R的都是圓角。 
參數:兩個函數的參數排放一樣: (X起始位,Y 起始位 ,W寬度,H高度,R圓角的半徑(至少R<XY))  
例子: 


  1. void loop() {  

  2.   u8g2.firstPage();

  3.   do {  

  4.   u8g2.drawRFrame(20,17,30,22,7);

  5.   u8g2.drawRBox(80,25,20,25,5);

  6.   } while( u8g2.nextPage());

  7.   }    


複製代碼


  
   ps:任何一個形狀如果XY初始位置放不好(至少沒有位置能全部繪製出W*H),就會出現一下圖。多出的圖形不會繪製,也就是說不會浪費內存。 

  

u8g2.drawStr()   //繪製字符串,可以想象字符串是一串符號,它能輸出什麼“字符串”在屏上。取決於它的setFont被設置的字體集。 
說明:一般都配搭著setFont函數使用,當然,如果不需要其它的字體集,在一開始begin()後設置,全局。字體集詳情看setFont函數。一下是三個實例圖。 
格式:u8g2.drawStr(X, Y,  S );    //S記得加“”。 
 
特別注意,它的初始點XY是在左下角:   

u8g.drawTriangle()  //繪製實體三角形 
格式:u8g.drawTriangle(X0,Y0, X1,Y1, X2,Y2); 

X0,Y0 :第一個角位置

X1,Y1 :第二個角位置

X2,Y2  :第三個腳位置

例子:

u8g.drawTriangle(20,5, 27,50, 5,32);  //至於如何控製顯示要預想的位置,看多幾次圖片就明白了,很簡單。


本文版权:http://www.ndfweb.cn/news-806.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2025 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅