記錄整理一下,關於一個單片機菜單系統的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()
}
嗯,就這樣