1. 程式人生 > >基於STM32之OLED選單介面框架搭建

基於STM32之OLED選單介面框架搭建

基於STM32驅動OLED屏顯示三級選單介面框架搭建

個人總結的一些經驗,寫的不好勿噴。

  1. 硬體要求 (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的你,根據這套框架你一樣可以寫出霸氣的選單介面,如果你們還有更好的寫法,歡迎一起討論。