單片機菜單系統 - 想法記錄整理

  記錄整理一下,關於一個單片機菜單系統的idea,偶然翻到,怕流失,在此記錄,爲那美好青春,哈哈哈

  首先不是完整系統,只有能找到的代碼段,這是上課沒認真聽講,別人玩手機,自己亂想,寫下了一些片段。不過還是有些思想值得學習。

  大致想法是,每個界面被看成是一個文件,添加了一些已有的結構成員,界面切換,通過全局變量RUN,只需要把要加載的文件給到全局變量即可。

  文件結構體

typedef struct stFile
{
    char* name;//名字
    char* ico;//圖標

    uint8_t son;//當前選擇的item,
    uint8_t sonTotal;//該文件的總共item
    struct stFile* sonFile;//兒子文件,這裏該文件被視爲一個文件夾
    struct stFile* fatherFile;//父親文件

    //
    void (*open)();//open 初始化
    void (*close)();//關閉
    void (*run)(uint8_t key);//run程序執行(main)
} file;

  全局變量RUN

typedef struct stRun
{
    uint8_t refresh;
    folder *file;
} run;

  還有一些其他片段代碼

  這是初始化?

file son[]=
{
    {
        .name = "1",
    },
    {
        .name = "2",
    },
    {
        .name = "3",
    }
};

  這裏就比較亂了,估計只有自己願意看,哈哈

void main(void)
{
    int i = 0;
    menu.name = "4";
    menu.sonNumber = 3;
    menu.sonFloder = (struct stFolder *)&son[0];

    for(i = 0; i < menu.sonNumber; i++)
    {
    printf("%d name %s \n", i, (menu.sonFloder + i)->name);
    }
    
    Key = KeyScan();
    switch(Key){
        case Key_Left:{ // close
            keyInitPtr = run.file->close;//close self open father
            (*keyInitPtr)();
            break;
        }
        case Key_Right:{ // open
            keyInitPtr = run.file->open;//open son close self
            (keyInitPtr)();
            break;
        }
        case Key_1:
        case Key_2:
        case Key_3:
        case Key_4:
        case Key_5:
        case Key_6:
        case Key_7:
        case Key_8:
        case Key_9:
            keyRunPtr = run.file->run;
            (*keyRunPtr)(key);
            break;
            
    if(run.refresh){
        run.refresh = 0;
        keyRunPtr = run.file->run;
        (*keyRunPtr)(key);
     }
    }
}

  這裏是顯示文件(文件夾)

void show(file *f)
{
    uint8_t x_validNum, y_validNum;
    
    //f->son / f.sonTotal
    startPos = f->son > y_validNum ? (f->son - y_validNum) : 0;
    endPos = startPos + y_validNum;
    endPos = f.sonTotal > endPos ?  endPos : f.sonTotal;
    scale = f.sonTotal > y_validNum ? (float)(endPos / f.sonTotal) : 1;

    for(i = startPos; i < endPos; i++)
    {
        if(f->son == i)
        {
            //高亮
        }
        else
        {
            lcdStringShow(0, i, (f->sonFile + i)->name);
        }
    }
    //右側進度條顯示
    bar()
}

嗯,就這樣

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章