基於STM32之OLED選單介面框架搭建
阿新 • • 發佈:2018-12-12
基於STM32驅動OLED屏顯示三級選單介面框架搭建
個人總結的一些經驗,寫的不好勿噴。
- 硬體要求 (1)處理器:STM32F103系列。 (2)OLED屏,SPI或IIC介面都可以。 (3)按鍵,用於控制介面的切換。
一個基本的選單介面最少有有一個主界,所以所有先設計一個主介面。 1.什麼是主介面? /******** 這裡說的主介面是本次需要設計的主介面 ********/ 主介面是電路上電程式啟動完成後螢幕顯示的第一個介面,就是主介面。 主介面根據自己的愛好來設計,比如:
介面中的圖形和文字可自己設計,這裡我設計的就如上圖所示。 主介面設計好後,那麼根據自己的需求來新增多級介面。 我這裡就設計了三級選單介面。
好,那麼對應的介面做好後,就是如何控制介面之間的切換。
/********************************************* * 建立一個結構體 * 存放介面標誌位 */ typedef struct { u8 Interface_Mark; //介面狀態 u8 Task_Mark; //任務狀態 u8 Run_Task; //開始執行任務 } Mark; Mark Mark_Sign;//狀態標誌位 /********************************************* * 建立一個列舉 * 存放介面變數 */ enum { Main_Interface = 0x10, /****主介面*****/ Menu_Interface = 0x20, /****選單介面***/ Task_Interface = 0x30, /****任務介面***/ }; /*******************************************/ switch(Mark_Sign.Interface_Mark) { //狀態標誌位 主介面 case Main_Interface: Main_Interface_APP();//顯示主介面 break; //狀態標誌位 選單介面 case Menu_Interface: Menu_Interface_APP();//顯示選單介面 break; //狀態標誌位 任務介面 case Task_Interface: Function_Menu_APP();//顯示功能介面 break; default: break; }
上面這段程式碼用來判斷是三級中哪一級介面。 裡面建立了一個結構體,通過改變結構體裡面的一個標誌位來控制三級介面之間的切換。
那麼就要用到按鍵來改變標誌位的值,這裡我採用了外部中斷來控制。
/*************左搖桿按鍵*****選單 確認按鍵**********************/ if(DISABLE == KEY_Rocker_Left) { //當按下選單鍵時,判斷當前介面 /************判斷當前介面為主介面***********************/ if(Main_Interface == Mark_Sign.Interface_Mark) { /**************進入選單介面*************/ Mark_Sign.Interface_Mark = Menu_Interface; } /************判斷當前介面為選單介面*******************/ else if(Menu_Interface == Mark_Sign.Interface_Mark) { /***************進入任務介面************/ Mark_Sign.Interface_Mark = Task_Interface; /**************進入指定的功能任務*******/ switch(Mark_Sign.Task_Mark) { /**************開始執行2.4G任務*******/ case NRF24L01_Task: Mark_Sign.Run_Task = NRF24L01_Task; break; /**************開始執行藍芽任務*******/ case Bluetooth_Task: Mark_Sign.Run_Task = Bluetooth_Task; break; /**************開始執行WIFI任務*******/ case WIFI_Task: Mark_Sign.Run_Task = WIFI_Task; break; /**************開始執行USB任務*******/ case USB_Task: Mark_Sign.Run_Task = USB_Task; break; /**************開始執行設定任務*******/ case Set_Task: Mark_Sign.Run_Task = Set_Task; break; default: break; } } /************判斷當前介面為任務介面******************/ else if(Task_Interface == Mark_Sign.Interface_Mark) { /*******判斷當前正在執行的任務*******/ switch(Mark_Sign.Run_Task) { /*當前正在執行 2.4G任務*/ case NRF24L01_Task: break; /*當前正在執行 2.4G任務*/ case Bluetooth_Task: break; /*當前正在執行 2.4G任務*/ case WIFI_Task: break; /*當前正在執行 2.4G任務*/ case USB_Task: break; /*當前正在執行 2.4G任務*/ case Set_Task: break; default: break; } } }
上面這段代功能
/*
* 1,檢測當前按下的按鍵為確認鍵
* 2,檢測當前的介面
* (1)如果是主介面,則進入選單介面
* (2)如果是選單介面,則進入任務介面
* (3)如果是任務介面,則開執行被選中的任務
*/
那麼可以從主介面進入,那怎麼退出呢? 同樣這裡採用外部中斷來控制
/****************右搖桿按鍵****返回按鍵*************************/
if(DISABLE == KEY_Rocker_Right)
{
//當按下返回鍵時,判斷當前介面
/************判斷當前介面為選單介面*******************/
if(Menu_Interface == Mark_Sign.Interface_Mark)
{
/*******退出選單介面***進入主介面**/
Mark_Sign.Interface_Mark = Main_Interface;
}
/************判斷當前介面為任務介面******************/
else if(Task_Interface == Mark_Sign.Interface_Mark)
{
/***退出正在執行的任務***/
Mark_Sign.Run_Task = Stop;
/*******退出任務介面*****/
Mark_Sign.Interface_Mark = Menu_Interface;
}
}
上面這段程式碼的功能
/*
* 1,檢測當前按下的按鍵為返回鍵
* 2,檢測當前的介面
* (1)如果是任務介面,則停止正在執行的任務,返回到選單介面
* (2)如果是選單介面,則返回到主介面
*/
好 通過確認按鍵控制從主介面到選單介面到任務介面的切換。 通過返回按鍵控制從任務介面到選單介面到主介面的切換。
以上就是選單介面的內容,不管你是小白還是正在學習STM32的你,根據這套框架你一樣可以寫出霸氣的選單介面,如果你們還有更好的寫法,歡迎一起討論。