《Arduino》開發 之 基於 u8g2 庫 的 OLED 菜單界面

簡介:

程序思想移植於:OLED多級菜單實現方法

硬件:

ESP8266:

ESP8266 NODEMCU  
gpio5 D1 SCL
gpio4 D2 SDA

程序示例:

/*
@作者:劉澤文
@板卡:ESP8266
@功能:基於U8g2的簡單菜單演示
@時間:2020/5/3
*/
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

#define UP_KEY      D6 //gpio12
#define M_KEY       D5 //gpio14
#define DOWN_KEY    D7 //gpio13

//讀取鍵值
#define keyup     digitalRead(UP_KEY)
#define keyenter  digitalRead(M_KEY)
#define keydown   digitalRead(DOWN_KEY)

uint8_t func_index=0;
void (*current_operation_index)();
void fun1();
void fun2();
void fun3();
void fun4();
void page_1_to_4();

typedef struct
{
	uint8_t current;
	uint8_t up;//向上翻索引號
	uint8_t down;//向下翻索引號
	uint8_t enter;//確認索引號
	void (*current_operation)();
}key_table;

key_table table[7]=
{
	{0,3,1,0,(*fun1)},
	{1,0,2,1,(*fun2)},
	{2,1,3,2,(*fun3)},
	{3,2,0,3,(*fun4)},
};

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void)
{
  u8g2.begin();
  u8g2.enableUTF8Print();
  ESP.wdtEnable(5000);//看門狗初始化
}
 
void loop(void)
{
  /*******************find index****************************/
	if((keyup==0)||(keydown==0)||(keyenter==0))
	{
		delay(10);//消抖
		if(keyup==0)
		{
			func_index=table[func_index].up;    //向上翻
			while(!keyup)ESP.wdtFeed();// 喂 狗    
		}
		if(keydown==0)
  	{
    	func_index=table[func_index].down;    //向下翻
    	while(!keydown)ESP.wdtFeed();// 喂 狗    
		}
    if(keyenter==0)                     
		{                
		  func_index=table[func_index].enter;    //確認
		  while(!keyenter)ESP.wdtFeed();// 喂 狗
		}
	}
	current_operation_index=table[func_index].current_operation;
	(*current_operation_index)();//執行當前操作函數
  ESP.wdtFeed();// 喂 狗     
}

void fun1(){
  u8g2.clearBuffer();
  page_1_to_4();
  //顯示光標
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(1%4==0? 4:1%4)-4,118);
  u8g2.sendBuffer();
}
void fun2(){
  u8g2.clearBuffer();
  page_1_to_4();
  //顯示光標
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(2%4==0? 4:2%4)-4,118);
  u8g2.sendBuffer();
}
void fun3(){
  u8g2.clearBuffer();
  page_1_to_4();
  //顯示光標
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(3%4==0? 4:3%4)-4,118);
  u8g2.sendBuffer();
}
void fun4(){
  u8g2.clearBuffer();
  page_1_to_4();
  //顯示光標
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(4%4==0? 4:4%4)-4,118);
  u8g2.sendBuffer();
}
void page_1_to_4(){
  u8g2.setFont(u8g2_font_wqy14_t_gb2312a);
  u8g2.setCursor(20, 16*1-2);
  u8g2.print(" 1.桌面設置");
  u8g2.setCursor(20, 16*2-2);
  u8g2.print(" 2.屏幕設置");
  u8g2.setCursor(20, 16*3-2);
  u8g2.print(" 3.網絡信息");
  u8g2.setCursor(20, 16*4-2);
  u8g2.print(" 4.智能配網");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章