基于STM32驅(qū)動(dòng)OLED屏顯示三級(jí)菜單界面框架搭建
個(gè)人總結(jié)的一些經(jīng)驗(yàn),寫的不好勿噴。
- 硬件要求
(1)處理器:STM32F103系列。
(2)OLED屏,SPI或IIC接口都可以。
(3)按鍵,用于控制界面的切換。
一個(gè)基本的菜單界面最少有有一個(gè)主界,所以所有先設(shè)計(jì)一個(gè)主界面。
1.什么是主界面?
/******** 這里說(shuō)的主界面是本次需要設(shè)計(jì)的主界面 ********/
主界面是電路上電程序啟動(dòng)完成后屏幕顯示的第一個(gè)界面,就是主界面。
主界面根據(jù)自己的愛好來(lái)設(shè)計(jì),比如:
IMG_20181001_135438.jpg (4.29 MB, 下載次數(shù): 157)
下載附件
2018-10-3 21:32 上傳
界面中的圖形和文字可自己設(shè)計(jì),這里我設(shè)計(jì)的就如上圖所示。
主界面設(shè)計(jì)好后,那么根據(jù)自己的需求來(lái)添加多級(jí)界面。
我這里就設(shè)計(jì)了三級(jí)菜單界面。
IMG_20181001_141102.jpg (1.73 MB, 下載次數(shù): 164)
下載附件
2018-10-3 21:32 上傳
好,那么對(duì)應(yīng)的界面做好后,就是如何控制界面之間的切換。- /*********************************************
- * 創(chuàng)建一個(gè)結(jié)構(gòu)體
- * 存放界面標(biāo)志位
- */
- typedef struct
- {
- u8 Interface_Mark; //界面狀態(tài)
- u8 Task_Mark; //任務(wù)狀態(tài)
- u8 Run_Task; //開始運(yùn)行任務(wù)
- } Mark;
- Mark Mark_Sign;//狀態(tài)標(biāo)志位
- /*********************************************
- * 創(chuàng)建一個(gè)枚舉
- * 存放界面變量
- */
- enum
- {
- Main_Interface = 0x10, /****主界面*****/
- Menu_Interface = 0x20, /****菜單界面***/
- Task_Interface = 0x30, /****任務(wù)界面***/
- };
- /*******************************************/
- switch(Mark_Sign.Interface_Mark)
- {
- //狀態(tài)標(biāo)志位 主界面
- case Main_Interface:
- Main_Interface_APP();//顯示主界面
- break;
- //狀態(tài)標(biāo)志位 菜單界面
- case Menu_Interface:
- Menu_Interface_APP();//顯示菜單界面
- break;
- //狀態(tài)標(biāo)志位 任務(wù)界面
- case Task_Interface:
- Function_Menu_APP();//顯示功能界面
- break;
- default:
- break;
-
復(fù)制代碼
上面這段代碼用來(lái)判斷是三級(jí)中哪一級(jí)界面。
里面創(chuàng)建了一個(gè)結(jié)構(gòu)體,通過(guò)改變結(jié)構(gòu)體里面的一個(gè)標(biāo)志位來(lái)控制三級(jí)界面之間的切換。 那么就要用到按鍵來(lái)改變標(biāo)志位的值,這里我采用了外部中斷來(lái)控制。
- <font color="rgb(79, 79, 79)"><font face="-apple-system, ""><font style="font-size: 16px">/*************左搖桿按鍵*****菜單 確認(rèn)按鍵**********************/
- if(DISABLE == KEY_Rocker_Left)
- {
- //當(dāng)按下菜單鍵時(shí),判斷當(dāng)前界面
- /************判斷當(dāng)前界面為主界面***********************/
- if(Main_Interface == Mark_Sign.Interface_Mark)
- {
- /**************進(jìn)入菜單界面*************/
- Mark_Sign.Interface_Mark = Menu_Interface;
- }
- /************判斷當(dāng)前界面為菜單界面*******************/
- else if(Menu_Interface == Mark_Sign.Interface_Mark)
- {
- /***************進(jìn)入任務(wù)界面************/
- Mark_Sign.Interface_Mark = Task_Interface;
- /**************進(jìn)入指定的功能任務(wù)*******/
- switch(Mark_Sign.Task_Mark)
- {
- /**************開始運(yùn)行2.4G任務(wù)*******/
- case NRF24L01_Task:
- Mark_Sign.Run_Task = NRF24L01_Task;
- break;
- /**************開始運(yùn)行藍(lán)牙任務(wù)*******/
- case Bluetooth_Task:
- Mark_Sign.Run_Task = Bluetooth_Task;
- break;
- /**************開始運(yùn)行WIFI任務(wù)*******/
- case WIFI_Task:
- Mark_Sign.Run_Task = WIFI_Task;
- break;
- /**************開始運(yùn)行USB任務(wù)*******/
- case USB_Task:
- Mark_Sign.Run_Task = USB_Task;
- break;
- /**************開始運(yùn)行設(shè)置任務(wù)*******/
- case Set_Task:
- Mark_Sign.Run_Task = Set_Task;
- break;
- default:
- break;
- }
- }
- /************判斷當(dāng)前界面為任務(wù)界面******************/
- else if(Task_Interface == Mark_Sign.Interface_Mark)
- {
- /*******判斷當(dāng)前正在運(yùn)行的任務(wù)*******/
- switch(Mark_Sign.Run_Task)
- {
- /*當(dāng)前正在運(yùn)行 2.4G任務(wù)*/
- case NRF24L01_Task:
- break;
- /*當(dāng)前正在運(yùn)行 2.4G任務(wù)*/
- case Bluetooth_Task:
- break;
- /*當(dāng)前正在運(yùn)行 2.4G任務(wù)*/
- case WIFI_Task:
- break;
- /*當(dāng)前正在運(yùn)行 2.4G任務(wù)*/
- case USB_Task:
- break;
- /*當(dāng)前正在運(yùn)行 2.4G任務(wù)*/
- case Set_Task:
-
- break;
- default:
- break;
- }
- }
- }
- </font></font></font>
復(fù)制代碼
上面這段代功能
- <font color="rgb(79, 79, 79)"><font face="-apple-system, ""><font style="font-size: 16px">/*
- * 1,檢測(cè)當(dāng)前按下的按鍵為確認(rèn)鍵
- * 2,檢測(cè)當(dāng)前的界面
- * (1)如果是主界面,則進(jìn)入菜單界面
- * (2)如果是菜單界面,則進(jìn)入任務(wù)界面
- * (3)如果是任務(wù)界面,則開執(zhí)行被選中的任務(wù)
- */
- </font></font></font>
復(fù)制代碼
那么可以從主界面進(jìn)入,那怎么退出呢?
同樣這里采用外部中斷來(lái)控制
- <font color="rgb(79, 79, 79)"><font face="-apple-system, ""><font style="font-size: 16px">/****************右搖桿按鍵****返回按鍵*************************/
- if(DISABLE == KEY_Rocker_Right)
- {
- //當(dāng)按下返回鍵時(shí),判斷當(dāng)前界面
- /************判斷當(dāng)前界面為菜單界面*******************/
- if(Menu_Interface == Mark_Sign.Interface_Mark)
- {
- /*******退出菜單界面***進(jìn)入主界面**/
- Mark_Sign.Interface_Mark = Main_Interface;
- }
- /************判斷當(dāng)前界面為任務(wù)界面******************/
- else if(Task_Interface == Mark_Sign.Interface_Mark)
- {
- /***退出正在運(yùn)行的任務(wù)***/
- Mark_Sign.Run_Task = Stop;
- /*******退出任務(wù)界面*****/
- Mark_Sign.Interface_Mark = Menu_Interface;
- }
- </font></font></font>
復(fù)制代碼
上面這段代碼的功能
- <font color="rgb(79, 79, 79)"><font face="-apple-system, ""><font style="font-size: 16px">/*
- * 1,檢測(cè)當(dāng)前按下的按鍵為返回鍵
- * 2,檢測(cè)當(dāng)前的界面
- * (1)如果是任務(wù)界面,則停止正在運(yùn)行的任務(wù),返回到菜單界面
- * (2)如果是菜單界面,則返回到主界面
- */</font></font></font>
復(fù)制代碼
1.png (98.88 KB, 下載次數(shù): 150)
下載附件
2018-10-3 21:40 上傳
好
通過(guò)確認(rèn)按鍵控制從主界面到菜單界面到任務(wù)界面的切換。
通過(guò)返回按鍵控制從任務(wù)界面到菜單界面到主界面的切換。 以上就是菜單界面的內(nèi)容,不管你是小白還是正在學(xué)習(xí)STM32的你,根據(jù)這套框架你一樣可以寫出霸氣的菜單界面,如果你們還有更好的寫法,歡迎一起討論。
|