1. 程式人生 > >微控制器LCD簡單多級選單實現

微控制器LCD簡單多級選單實現

微控制器簡單多級選單實現

多年以前,我寫過一篇12864lcd顯示屏多級選單程式碼實現 部落格,當時草率的實現了一個選單畫面,然並沒有實際用處,因為作為選單的選取響應動作並沒有在其中實現。多年以後,接手的專案恰恰需要選單,前人已經實現了一個選單畫面,只是簡單的畫面並沒有選單的實質功能,修修補補了好幾次之後終於受不了了,決定重新實現,就在這前一篇程式碼基礎上。

介面顯示相關資料結構

typedef void (* interface_f) (void); /* 介面互動顯示函式 */
typedef void (* draw_label_f) (void); /* 介面初始顯示畫面 */

typedef struct _interface {
    draw_label_f label;
    interface_f interface;
} interface_t;

interface_t display_set(interface_t faceFunc); /* 介面互動函式設定*/
void display_load(void); /* 介面顯示,在主迴圈函式(while)中呼叫 */

型別為interface_t 的變數就是一個顯示介面,這個介面可以有按鍵互動,畫面更新等動作。函式display_set(interface_t faceFunc)主要功能實現為設定當前的顯示介面,並呼叫interface_t

資料結構中的 draw_label_f成員函式用以繪製介面初始畫面。函式display_load()功能就是在主while迴圈中呼叫interface_t資料結構中的interface_f 成員函式,該成員函式用於實時更新畫面。

如定義矩陣主顯示介面為:

interface_t interface_main = {NULL , main_interface };

相關函式實現如下:

void main_interface(void)
{
#ifdef INTWDG 
ActiveWatchDog(); 
#endif
if(display_update_flag == 'Y')
{
    display_update_flag = 'N';
    main_draw_f();
}

ProcessKeyData();
}

與介面顯示相關的main()函式程式碼實現如下:

display_set(interface_main);

while( 1 )
{
    display_load();
}

選單互動相關資料結構

選單顯示介面定義如下:

interface_t interface_menu = {reflash_lcd, menu_main};

當按鍵設定按下,呼叫display_set(interface_menu)觸發切換顯示介面為 interface_menu,這樣介面顯示變為選單介面了。