隨著越來越多的人機交互需求,帶有屏幕的嵌入式設備需要展示的信息也越來越多,多種菜單隨著按鍵輸入進行各種深入、各種切換操作。如何方便的管理不同菜單之間的切換操作呢?本篇通過實驗來介紹多級菜單的實現思路。
1. 多級菜單介紹
在各種屏幕操作中,多級菜單其實是一種思路或者說是一種固定的編程框架。簡單來說就是當按鍵觸發時,根據按鍵定義從數組中取出當前按鍵需要跳轉的界面索引,然后根據索引去執行響應的界面函數。
2. 具體實現
1. 首先,我們要定義一個結構體,結構體成員變量一般包括界面索引號、界面函數指針和與實際按鍵對應的變量,用來存儲按鍵表示的索引號。其中,索引號與界面函數指針是對應的。
typedef struct
{
unsigned char index;
unsigned char up;
unsigned char down;
unsigned char left;
unsigned char right;
void (*operation)(void);
} KEY_TABLE;
本實驗中定義了四個按鍵,故定義了up、down、left、right四個按鍵變量。
2. 使用定義的結構體類型來定義一個結構體數組,有多少個界面,數組的元素個數就是多少。
KEY_TABLE table[9] =
{
{0, 0, 0, 0, 0, (*menu11)},
{1, 0, 0, 0, 0, (*menu12)},
{2, 0, 0, 0, 0, (*menu21)},
{3, 0, 0, 0, 0, (*menu22)},
{4, 0, 0, 0, 0, (*menu23)},
{5, 0, 0, 0, 0, (*menu31)},
{6, 0, 0, 0, 0, (*menu32)},
{7, 0, 0, 0, 0, (*menu33)},
{8, 0, 0, 0, 0, (*menu34)},
};
本實驗中定義了9個界面,所以如上數組元素有9個,其中界面索引號從0到8,分別對應其界面函數指針。本實驗中一級菜單有2個,二級菜單有3個,三級菜單有4個。
3. 確定各按鍵按下需要跳轉的界面索引。這一步驟確定了各界面之間的切換關系,非常重要。
在此之前可以通過草圖來整理菜單之間切換關系,如下所示為本實驗9個界面之間的關聯圖。
多級菜單結構
舉幾個例子:
在index為0,即menu11界面下,確定{0, 0, 0, 0, 0, (*menu11)}中四個按鍵變量的值:
- 當按下up鍵時,顯示menu11界面,即index為0的界面,那么此時up=0;
- 當按下down鍵時,顯示menu12界面,即index為1的界面,那么此時down=1;
- 當按下left鍵時,顯示menu11界面,即index為0的界面,那么此時down=0;
- 當按下right鍵時,顯示menu21界面,即index為2的界面,那么此時down=2;
故得到{0, 0, 1, 0, 2, (*menu11)}
在index為5,即menu31界面下,確定{5, 0, 0, 0, 0, (*menu31)}中四個按鍵變量的值:
- 當按下up鍵時,顯示menu31界面,即index為5的界面,那么此時up=5;
- 當按下down鍵時,顯示menu32界面,即index為6的界面,那么此時down=6;
- 當按下left鍵時,顯示menu21界面,即index為2的界面,那么此時down=2;
- 當按下right鍵時,顯示menu31界面,即index為5的界面,那么此時down=5;
故得到{5, 5, 6, 2, 5, (*menu31)}
各個界面之間的跳轉關系根據實際的需求進行確立,如下為本實驗中完整的結構體數組變量賦值情況。
KEY_TABLE table[9] =
{
{0, 0, 1, 0, 2, (*menu11)},
{1, 0, 1, 1, 4, (*menu12)},
{2, 2, 3, 0, 5, (*menu21)},
{3, 2, 3, 0, 7, (*menu22)},
{4, 4, 4, 1, 4, (*menu23)},
{5, 5, 6, 2, 5, (*menu31)},
{6, 5, 6, 2, 6, (*menu32)},
{7, 7, 8, 3, 7, (*menu33)},
{8, 7, 8, 3, 8, (*menu34)},
};
4. 根據實際按鍵返回值對應的功能,獲取按鍵對應的界面索引號,然后根據索引號找到并執行對應的界面函數。
switch (keyValue)//獲取按鍵對應序號
{
case 1: funIndex = table[funIndex].right; break;
case 2: funIndex = table[funIndex].left; break;
case 3: funIndex = table[funIndex].down; break;
case 4: funIndex = table[funIndex].up; break;
}
current = table[funIndex].operation;//根據需要獲取對應需要執行的函數
(*current)();//執行獲取到的函數
3. 實驗材料
4. 實驗步驟
1. 根據原理圖搭建電路圖。
OLED屏的VCC、GND分別連接開發板的3.3V、GND,OLED屏的SDA和SCL分別連接開發板的A4和A5。雙軸按鍵搖桿模塊的VCC、GND分別連接開發板的5V、GND,模塊的X軸輸出、Y軸輸出分別連接開發板的模擬引腳A0、A1。
實驗原理圖如下圖所示:
實驗原理圖
2. 新建sketch,拷貝代碼替換自動生成的代碼并進行保存。
由于代碼較長,完整代碼可在文末獲取。
3. 連接開發板,設置好對應端口號和開發板類型,進行程序下載。
程序下載
評論
查看更多