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