|
本帖最后由 littleshrimp 于 2014-7-25 16:10 编辑
代码调试完也,还没有接LCD实际实测,个人觉得逻辑上设计的还可以,但字模声明的地方觉得还是不够灵活,高手有空请帮忙指点优化。
eeworld.com.code @LCD多级菜单 @2014-7-25 @V1.0 - 副本.rar
(56.5 KB, 下载次数: 38)
- /**
- 通用LCD多级菜单代码
- littleshrimp
- 2014-7-25
- **/
- #include <stdint.h>
- #define NULL 0
- struct MenuItem
- {
- uint8_t parentIndex;
- uint8_t index;
- uint8_t *DisplayString;
- void (*Fuc)();
- } MenuItem;
- //菜单路径
- uint8_t currentMenuItemIndex = 0;//当前菜单的索引
- //菜单字串 对应字模数据
- const uint8_t ms1[2][2] = {{1,0xff},{0xff,0xff}};//根
- const uint8_t ms2[2][2] = {{2,0xff},{0xff,0xff}};//查看
- const uint8_t ms3[2][2] = {{3,0xff},{0xff,0xff}};//控制
- const uint8_t ms4[2][2] = {{4,0xff},{0xff,0xff}};//设置
- const uint8_t ms5[2][2] = {{5,0xff},{0xff,0xff}};//关机
- const uint8_t ms6[2][2] = {{6,0xff},{0xff,0xff}};//查看-时间
- const uint8_t ms7[2][2] = {{7,0xff},{0xff,0xff}};//查看-手机号
- const uint8_t ms8[2][2] = {{8,0xff},{0xff,0xff}};//查看-电量
- const uint8_t ms9[2][2] = {{9,0xff},{0xff,0xff}};//查看-历史记录
- const uint8_t ms10[2][2] = {{10,0xff},{0xff,0xff}};//控制-加热
- const uint8_t ms11[2][2] = {{11,0xff},{0xff,0xff}};//控制-通风
- const uint8_t ms12[2][2] = {{12,0xff},{0xff,0xff}};//设置-时间
- const uint8_t ms13[2][2] = {{13,0xff},{0xff,0xff}};//关机-关机
- const uint8_t ms14[2][2] = {{14,0xff},{0xff,0xff}};//关机-重启
- const uint8_t ms15[2][2] = {{15,0xff},{0xff,0xff}};//关机-重启-立即重启
- //菜单函数定义
- void viewItme(void);//查看-时间
- void viewNumber(void);//查看-手机号
- void viewCharge(void);//查看-电量
- void viewHistory(void);//查看-历史记录
- void controHeat(void);//控制-加热
- void contrlFan(void);//控制-通风
- void setTime(void);//设置-时间
- void powerOff(void);//关机-关机
- void resetSystem(void);//关机-重启-立即重启
- #define MENU_ITEMS_COUNT sizeof(menuItems)/sizeof(menuItems[0])
- #define menu(parent,index,fuc) {parent,##index##,(uint8_t *)ms##index##,fuc}
- struct MenuItem menuItems[]=
- {
- //menu(父ID,ID,功能函数)
- menu(0,1,NULL),//根
- menu(1,2,NULL),//查看
- menu(1,3,NULL),//控制
- menu(1,4,NULL),//设置
- menu(1,5,NULL),//关机
- menu(2,6,NULL),//查看-时间
- menu(2,7,NULL),//查看-手机号
- menu(2,8,NULL),//查看-电量
- menu(2,9,NULL),//查看-历史记录
- menu(3,10,controHeat),//控制-加热
- menu(3,11,NULL),//控制-通风
- menu(4,12,NULL),//设置-时间
- menu(5,13,NULL),//关机-关机
- menu(5,14,NULL),//关机-重启
- menu(14,15,NULL)//关机-重启-立即重启
- };
- /**
- 获得此菜单的下一级菜单列表
- **/
- uint8_t getChilerenMenuItems(uint8_t index,struct MenuItem *buf)
- {
- uint8_t i,menuItemsIndex = 0;
- uint8_t compIndex = index;//用于比较的索引
- for(i=0;i<MENU_ITEMS_COUNT;i++)
- {
- if(menuItems[i].parentIndex == compIndex)//比较父级ID是否为此菜单ID
- {
- buf[menuItemsIndex++] = menuItems[i];
- }
- }
- return menuItemsIndex;
- }
- /**
- 获得同级菜单列表
- **/
- uint8_t getPeerMenuItems(uint8_t index,struct MenuItem *buf)
- {
- uint8_t i,menuItemsIndex = 0;
- uint8_t compIndex = (index == 0 ? 0 : menuItems[index-1].parentIndex);//用于比较的索引
- for(i=0;i<MENU_ITEMS_COUNT;i++)
- {
- if(menuItems[i].parentIndex == compIndex)//比较父级ID是否与本菜单父级ID相同
- {
- buf[menuItemsIndex++] = menuItems[i];
- }
- }
- return menuItemsIndex;
- }
- /**
- 获得父级菜单的同级列表
- **/
- uint8_t getUpperMenuItems(uint8_t index,struct MenuItem *buf)
- {
- uint8_t i,menuItemsIndex = 0;
- uint8_t compIndex;//用于比较的索引
- if(index == 0 || menuItems[index-1].parentIndex == 0)//如果父级ID为零表示已经是根
- {
- compIndex = 0;//比较ID为0返回根菜单(通常为一个,也可设置为多个父级为0的根菜单)
- }
- else
- {
- compIndex = menuItems[menuItems[index-1].parentIndex-1].parentIndex;//父级菜单的父ID
- }
- for(i=0;i<MENU_ITEMS_COUNT;i++)
- {
- if(menuItems[i].parentIndex == compIndex)
- {
- buf[menuItemsIndex++] = menuItems[i];
- }
- }
- return menuItemsIndex;
- }
- /**
- 函数实现
- **/
- void controHeat(void)
- {
- __nop();
- }
- void SystemInit(void)
- {
-
- }
- struct MenuItem disMenuItems[20];
- uint8_t disMenuCount;
- int main(void)
- {
- disMenuCount = sizeof(menuItems)/sizeof(menuItems[0]);
- /**
- menu(0,1,0),//根
- **/
- disMenuCount = getChilerenMenuItems(0,disMenuItems);//获得根菜单
- /**
- menu(1,2,0),//查看
- menu(1,3,0),//控制
- menu(1,4,0),//设置
- menu(1,5,0),//关机
- **/
- disMenuCount = getChilerenMenuItems(1,disMenuItems);//获得根的下一级菜单 显示4个
- /**
- menu(3,6,0),//查看-时间
- menu(3,7,0),//查看-手机号
- menu(3,8,0),//查看-电量
- menu(3,9,0),//查看-历史记录
- **/
- disMenuCount = getChilerenMenuItems(2,disMenuItems);//获得"查看"的下一级菜
- /**
- menu(0,1,0),//根
- **/
- disMenuCount = getPeerMenuItems(0,disMenuItems);//显示根的同极
- /**
- menu(1,2,0),//查看
- menu(1,3,0),//控制
- menu(1,4,0),//设置
- menu(1,5,0),//关机
- **/
- disMenuCount = getPeerMenuItems(2,disMenuItems);//获得"查看"的同级菜单
- /**
- menu(0,1,0),//根
- **/
- disMenuCount = getUpperMenuItems(1,disMenuItems);//显示根的父极
- /**
- menu(0,1,0),//根
- **/
- disMenuCount = getUpperMenuItems(2,disMenuItems);//显示"查看"的父极列表
- /**
- menu(1,2,0),//查看
- menu(1,3,0),//控制
- menu(1,4,0),//设置
- menu(1,5,0),//关机
- **/
- disMenuCount = getUpperMenuItems(6,disMenuItems);//显示"查看-时间"的父极列表
-
- menuItems[9].Fuc();//控制通
- __nop();
- }
复制代码参考文献:
《C语言菜单界面的实现方》
|
|