解析结构元素

菜单构建的基本单元是游标和目录数组。
游标具有4个移动属性的结构体:上、下、进入、退出

typedef struct
{
    uint8 current;
    uint8 up;
    uint8 down;
//    uint8 left;           //左右键控制参数值的增大或者减小,这里我们不将它纳入菜单属性
//    uint8 right;  
    uint8 enter;
    uint8 back;
    void (*current_operation)();
}key_table;

通过改变游标,到达对应索引值的目录
游标定义为全局变量。

uint8 func_index=0;

处于不同索引值,运行对应的函数(oled显示函数或是运行函数,一般来说调参函数将依附于显示函数)

void (*current_operation_index)();

下面是索引目录:
142以后可能会费用,在此不做解释
索引函数,前五个值的含义:【当前目录索引】、【游标上移指向的目录索引】、【游标下移指向的目录索引】、【游标进入指向的目录索引】、【游标退出指向的目录索引】

key_table table[174]=
{
    
    {0,141,1,2,0,(*fun0)},// 第1层 【camera】
    {1,0,19,4,1,(*fun1)},// 第1层 【machine】
    {2,32,3,8,0,(*fun2)},// 第2层 【camera】->【live picture】
    {3,2,30,9,0,(*fun3)},// 第2层 【camera】->【tuning】       调参
    {4,29,5,4,1,(*fun4)},// 第2层 【machine】->【setpoint】(sPID)
    {5,4,6,5,1,(*fun5)},// 第2层【machine】->【KP】(sPID)
    {6,5,7,6,1,(*fun6)},// 第2层【machine】->【KI】(sPID)
    {7,6,15,7,1,(*fun7)},// 第2层【machine】->【KD】(sPID)
    {8,8,8,8,2,(*fun8)},// 第3层【camera】->【live picture】的具体实现
    {9,17,10,9,3,(*fun9)},// 第3层【camera】->【tuning】->【AUTO_EXP】
    {10,9,11,10,3,(*fun10)},// 第3层【camera】->【tuning】->【EXP_TIME】
    {11,10,12,11,3,(*fun11)},// 第3层【camera】->【tuning】->【FPS】
    {12,12,13,12,3,(*fun12)},// 第3层【camera】->【tuning】->【LR_OFFSET】
    {13,12,14,13,3,(*fun13)},// 第3层【camera】->【tuning】->【UD_OFFSET】
    {14,13,17,14,3,(*fun14)},// 第3层【camera】->【tuning】->【GAIN】
    {15,7,16,15,1,(*fun15)},// 第2层 【machine】->【setpoint】(wPID)
    {16,15,20,16,1,(*fun16)},// 第2层【machine】->【KP】(wPID)
    {17,14,9,18,3,(*fun17)},// 第3层【camera】->【tuning】->【Threshold_mode】
    {18,18,18,18,17,(*fun18)},  //第4层【camera】->【tuning】->若【Threshold_mode】为人为修改模式,可以进入到阈值赋值界面
    {19,1,34,19,19,(*fun19)},     //调节补线的模式【mode1】:最小二乘法补线【mode2】:利用左右线偏移量补线 【mode3】:利用上一行左右线补线(废弃!!!!)
    {20,16,21,20,1,(*fun20)},// 第2层【machine】->【KI】(wPID)
    {21,20,22,21,1,(*fun21)},// 第2层【machine】->【KD】(wPID)
    {22,21,23,22,1,(*fun22)},// 第2层【machine】->max_hight
    {23,22,24,23,1,(*fun23)},// 第2层【machine】->max_low
    {24,23,25,24,1,(*fun24)},// 第2层【machine】->max_middle
    {25,24,26,25,1,(*fun25)},// 第2层【machine】->【setpoint】(small_wPID)
    {26,25,27,26,1,(*fun26)},// 第2层【machine】->【KP】(small_wPID)
    {27,26,28,27,1,(*fun27)},// 第2层【machine】->【KI】(small_wPID)
    {28,27,29,28,1,(*fun28)},// 第2层【machine】->【KD】(small_wPID)
    {29,28,4,29,1,(*fun29)},// 第2层【machine】->k调节差速
    {30,3,32,31,0,(*fun30)},// 第2层 【camera】->【read picture】
    {31,31,31,31,30,(*fun31)},// 第2层 【camera】->【read picture】具体实现
    {32,30,2,33,0,(*fun32)},// 第2层 【camera】->【load picture】
    {33,33,33,33,32,(*fun33)},// 第2层 【camera】->【load picture】具体实现
    {34,19,37,35,34,(*fun34)},// 第1层 【wenhao】
    {35,47,36,35,34,(*fun35)},// 第2层 【wenhao】【KP】
    {36,35,47,36,34,(*fun36)},// 第2层 【wenhao】【KD】
    {37,34,40,38,37,(*fun37)},//第1层 【middle s】
    {38,46,39,38,37,(*fun38)},//第2层 【middle s】【KP】
    {39,38,46,39,37,(*fun39)},//第2层 【middle s】【KD】
    {40,37,48,41,40,(*fun40)},//第1层 【coder】
    {41,51,42,41,40,(*fun41)},//第2层 【coder】【LP】
    {42,41,43,42,40,(*fun42)},//第2层 【coder】->【LI】
    {43,42,44,43,40,(*fun43)},//第2层 【coder】【LD】
    {44,43,45,44,40,(*fun44)},//第2层 【coder】【RP】
    {45,44,51,45,40,(*fun45)},//第2层 【coder】->【RI】
    //{46,45,41,46,40,(*fun46)},//第2层 【coder】【RD】
    {46,39,38,46,37,(*fun46)},//第2层 【middle s】【目标值】
    {47,36,35,47,34,(*fun47)},//第2层 【wenhao】【目标值】
    {48,40,52,49,48,(*fun48)},//第1层 【flash】
    {49,50,50,49,48,(*fun49)},//第1层 【flash】-【if save】   //左右按键控制yes or no
    {50,49,49,50,48,(*fun50)},//第1层 【flash】-【if read】
    {51,45,41,51,40,(*fun51)},//第2层 【coder】->【RD】
    {52,48,59,53,52,(*fun52)},//第1层 【huandao50】舵机pd   //入环和在环和出环
    {53,69,54,53,52,(*fun53)},//第2层 【入环 speed】(50)   
    {54,53,55,54,52,(*fun54)},//第2层 【在环 speed】(50)
    {55,54,56,55,52,(*fun55)},//第2层 【出环 speed】(50)
    {56,55,57,56,52,(*fun56)},//第2层 【入环】舵机p(50)
    {57,56,58,57,52,(*fun57)},//第2层 【入环】舵机d(50)
    {58,57,67,58,52,(*fun58)},//第2层 【在环】舵机p(50)
    {59,52,70,60,59,(*fun59)},//第1层 【打脚行】
    {60,66,61,60,59,(*fun60)},//第2层 【打脚行-直到】
    {61,60,62,61,59,(*fun61)},//第2层 【打脚行-弯道】
    {62,61,63,62,59,(*fun62)},//第2层 【打脚行-小s】
    {63,62,64,63,59,(*fun63)},//第2层 【打脚行-中s】
    {64,63,65,64,59,(*fun64)},//第2层 【打脚行-环岛-入环】
    {65,64,66,65,59,(*fun65)},//第2层 【打脚行-环岛-在环】
    {66,65,60,66,59,(*fun66)},//第2层 【打脚行-环岛-出环】
    {67,58,68,67,52,(*fun67)},//第2层 【在环】舵机d(50)
    {68,67,69,68,52,(*fun68)},//第2层 【出环】舵机p(50)
    {69,68,53,69,52,(*fun69)},//第2层 【出环】舵机d (50)
    {70,59,71,75,70,(*fun70)},//第1层 【huandao_60】舵机pd   //入环和在环和出环
    {71,70,72,84,71,(*fun71)},//第1层 【huandao_70】舵机pd   //入环和在环和出环
    {72,71,73,93,72,(*fun72)},//第1层 【huandao_80】舵机pd   //入环和在环和出环
    {73,72,74,102,73,(*fun73)},//第1层 【huandao_90】舵机pd   //入环和在环和出环
    {74,73,120,111,74,(*fun74)},//第1层 【huandao_100】舵机pd   //入环和在环和出环
    {75,83,76,75,70,(*fun75)},//第2层 【入环 speed】 (60)  
    {76,75,77,76,70,(*fun76)},//第2层 【在环 speed】(60)
    {77,76,78,77,70,(*fun77)},//第2层 【出环 speed】(60)
    {78,77,79,78,70,(*fun78)},//第2层 【入环】舵机p (60)
    {79,78,80,79,70,(*fun79)},//第2层 【入环】舵机d (60)
    {80,79,81,80,70,(*fun80)},//第2层 【在环】舵机p (60)
    {81,80,82,81,70,(*fun81)},//第2层 【在环】舵机d (60)
    {82,81,83,82,70,(*fun82)},//第2层 【出环】舵机p (60)
    {83,82,75,83,70,(*fun83)},//第2层 【出环】舵机d (60)
    {84,92,85,84,71,(*fun84)},//第2层 【入环 speed】(70)  
    {85,84,86,85,71,(*fun85)},//第2层 【在环 speed】(70)
    {86,85,87,86,71,(*fun86)},//第2层 【出环 speed】(70)
    {87,86,88,87,71,(*fun87)},//第2层 【入环】舵机p (70)
    {88,87,89,88,71,(*fun88)},//第2层 【入环】舵机d (70)
    {89,88,90,89,71,(*fun89)},//第2层 【在环】舵机p (70)
    {90,89,91,90,71,(*fun90)},//第2层 【在环】舵机d (70)
    {91,90,92,91,71,(*fun91)},//第2层 【出环】舵机p (70)
    {92,91,84,92,71,(*fun92)},//第2层 【出环】舵机d (70)
    {93,102,94,93,72,(*fun93)},//第2层 【入环 speed】(80)  
    {94,93,95,94,72,(*fun94)},//第2层 【在环 speed】(80)
    {95,94,96,95,72,(*fun95)},//第2层 【出环 speed】(80)
    {96,95,97,96,72,(*fun96)},//第2层 【入环】舵机p (80)
    {97,96,98,97,72,(*fun97)},//第2层 【入环】舵机d (80)
    {98,97,99,98,72,(*fun98)},//第2层 【在环】舵机p (80)
    {99,98,100,99,72,(*fun99)},//第2层 【在环】舵机d (80)
    {100,99,101,100,72,(*fun100)},//第2层 【出环】舵机p (80)
    {101,100,93,101,72,(*fun101)},//第2层 【出环】舵机d (80)
    {102,110,103,102,73,(*fun102)},//第2层 【入环 speed】(90)  
    {103,102,104,103,73,(*fun103)},//第2层 【在环 speed】(90)
    {104,103,105,104,73,(*fun104)},//第2层 【出环 speed】(90)
    {105,104,106,105,73,(*fun105)},//第2层 【入环】舵机p (90)
    {106,105,107,106,73,(*fun106)},//第2层 【入环】舵机d (90)
    {107,106,108,107,73,(*fun107)},//第2层 【在环】舵机p (90)
    {108,107,109,108,73,(*fun108)},//第2层 【在环】舵机d (90)
    {109,108,110,109,73,(*fun109)},//第2层 【出环】舵机p (90)
    {110,109,102,110,73,(*fun110)},//第2层 【出环】舵机d (90)
    {111,119,112,111,74,(*fun111)},//第2层 【入环 speed】(100)  
    {112,111,113,112,74,(*fun112)},//第2层 【在环 speed】(100)
    {113,112,114,113,74,(*fun113)},//第2层 【出环 speed】(100)
    {114,113,115,114,74,(*fun114)},//第2层 【入环】舵机p (100)
    {115,114,116,115,74,(*fun115)},//第2层 【入环】舵机d (100)
    {116,115,117,116,74,(*fun116)},//第2层 【在环】舵机p (100)
    {117,116,118,117,74,(*fun117)},//第2层 【在环】舵机d (100)
    {118,117,119,118,74,(*fun118)},//第2层 【出环】舵机p (100)
    {119,118,111,119,74,(*fun119)},//第2层 【出环】舵机d (100)
    {120,74,129,121,120,(*fun120)},//第1层 【选择环岛1-8的大小】
    {121,128,122,121,120,(*fun121)},//第2层 【选择环岛1的大小】
    {122,121,123,122,120,(*fun122)},//第2层 【选择环岛2的大小】
    {123,122,124,123,120,(*fun123)},//第2层 【选择环岛3的大小】
    {124,123,125,124,120,(*fun124)},//第2层 【选择环岛4的大小】
    {125,124,126,125,120,(*fun125)},//第2层 【选择环岛5的大小】
    {126,125,127,126,120,(*fun126)},//第2层 【选择环岛6的大小】
    {127,126,128,127,120,(*fun127)},//第2层 【选择环岛7的大小】
    {128,127,121,128,120,(*fun128)},//第2层 【选择环岛8的大小】
    {129,120,138,130,129,(*fun129)},//第1层 【选择差速的大小】
    {130,137,131,130,129,(*fun130)},//第2层 【小S差速】
    {131,130,132,131,129,(*fun131)},//第2层 【中S差速】
    {132,131,133,132,129,(*fun132)},//第2层 【huan50差速】
    {133,132,134,133,129,(*fun133)},//第2层 【huan60差速】
    {134,133,135,134,129,(*fun134)},//第2层 【huan70差速】
    {135,134,136,135,129,(*fun135)},//第2层 【huan80差速】
    {136,135,137,136,129,(*fun136)},//第2层 【huan90差速】
    {137,136,130,137,129,(*fun137)},//第2层 【huan100差速】
    {138,129,139,142,138,(*fun138)},//第1层 【deltaP_max】
    {139,138,140,150,139,(*fun139)},//第1层 【deltaP_min】
    {140,139,141,158,140,(*fun140)},//第1层 【deltaD_max】
    {141,140,0,166,141,(*fun141)},//第1层 【deltaD_max】
    {142,149,143,142,138,(*fun142)},//第2层 【0】
    {143,142,144,143,138,(*fun143)},//第2层 【1】
    {144,143,145,144,138,(*fun144)},//第2层 【2】
    {145,144,146,145,138,(*fun145)},//第2层 【3】
    {146,145,147,146,138,(*fun146)},//第2层 【4】
    {147,146,148,147,138,(*fun147)},//第2层 【5】
    {148,147,149,148,138,(*fun148)},//第2层 【6】
    {149,148,142,149,138,(*fun149)},//第2层 【7】
    {150,157,151,150,139,(*fun150)},//第2层 【0】
    {151,150,152,151,139,(*fun151)},//第2层 【1】
    {152,151,153,152,139,(*fun152)},//第2层 【2】
    {153,152,154,153,139,(*fun153)},//第2层 【3】
    {154,153,155,154,139,(*fun154)},//第2层 【4】
    {155,154,156,155,139,(*fun155)},//第2层 【5】
    {156,155,157,156,139,(*fun156)},//第2层 【6】
    {157,156,150,157,139,(*fun157)},//第2层 【7】
    {158,165,159,158,140,(*fun158)},//第2层 【0】
    {159,158,160,159,140,(*fun159)},//第2层 【1】
    {160,159,161,160,140,(*fun160)},//第2层 【2】
    {161,160,162,161,140,(*fun161)},//第2层 【3】
    {162,161,163,162,140,(*fun162)},//第2层 【4】
    {163,162,164,163,140,(*fun163)},//第2层 【5】
    {164,163,165,164,140,(*fun164)},//第2层 【6】
    {165,164,158,165,140,(*fun165)},//第2层 【7】
    {166,173,167,166,141,(*fun166)},//第2层 【0】
    {167,166,168,167,141,(*fun167)},//第2层 【1】
    {168,167,169,168,141,(*fun168)},//第2层 【2】
    {169,168,170,169,141,(*fun169)},//第2层 【3】
    {170,169,171,170,141,(*fun170)},//第2层 【4】
    {171,170,172,171,141,(*fun171)},//第2层 【5】
    {172,171,173,172,141,(*fun172)},//第2层 【6】
    {173,172,166,173,141,(*fun173)},//第2层 【7】

};

菜单图示

描述

菜单缺点:

1、当有些目录没有用处想删除时,不易删除,需要改动所有的索引值,因为一旦游标指向不存在的索引值将会导致栈溢出.
2、框架一旦定下,修改及其困难,在目录逐渐扩大时,这种弊端体现地越发明显。