2860|4

9717

帖子

24

TA的资源

版主

楼主
 

新写了一个LCD多级菜单的程序 [复制链接]

本帖最后由 littleshrimp 于 2014-7-25 16:10 编辑

代码调试完也,还没有接LCD实际实测,个人觉得逻辑上设计的还可以,但字模声明的地方觉得还是不够灵活,高手有空请帮忙指点优化。

eeworld.com.code @LCD多级菜单 @2014-7-25 @V1.0 - 副本.rar (56.5 KB, 下载次数: 38)
  1. /**
  2. 通用LCD多级菜单代码
  3. littleshrimp
  4. 2014-7-25
  5. **/
  6. #include <stdint.h>

  7. #define NULL          0


  8. struct MenuItem
  9. {
  10.     uint8_t parentIndex;   
  11.     uint8_t index;   
  12.     uint8_t *DisplayString;
  13.     void (*Fuc)();
  14. }  MenuItem;
  15. //菜单路径
  16. uint8_t currentMenuItemIndex = 0;//当前菜单的索引
  17. //菜单字串 对应字模数据
  18. const uint8_t ms1[2][2] = {{1,0xff},{0xff,0xff}};//根
  19. const uint8_t ms2[2][2] = {{2,0xff},{0xff,0xff}};//查看
  20. const uint8_t ms3[2][2] = {{3,0xff},{0xff,0xff}};//控制
  21. const uint8_t ms4[2][2] = {{4,0xff},{0xff,0xff}};//设置
  22. const uint8_t ms5[2][2] = {{5,0xff},{0xff,0xff}};//关机
  23. const uint8_t ms6[2][2] = {{6,0xff},{0xff,0xff}};//查看-时间
  24. const uint8_t ms7[2][2] = {{7,0xff},{0xff,0xff}};//查看-手机号
  25. const uint8_t ms8[2][2] = {{8,0xff},{0xff,0xff}};//查看-电量
  26. const uint8_t ms9[2][2] = {{9,0xff},{0xff,0xff}};//查看-历史记录
  27. const uint8_t ms10[2][2] = {{10,0xff},{0xff,0xff}};//控制-加热
  28. const uint8_t ms11[2][2] = {{11,0xff},{0xff,0xff}};//控制-通风
  29. const uint8_t ms12[2][2] = {{12,0xff},{0xff,0xff}};//设置-时间
  30. const uint8_t ms13[2][2] = {{13,0xff},{0xff,0xff}};//关机-关机
  31. const uint8_t ms14[2][2] = {{14,0xff},{0xff,0xff}};//关机-重启
  32. const uint8_t ms15[2][2] = {{15,0xff},{0xff,0xff}};//关机-重启-立即重启


  33. //菜单函数定义
  34. void viewItme(void);//查看-时间
  35. void viewNumber(void);//查看-手机号
  36. void viewCharge(void);//查看-电量
  37. void viewHistory(void);//查看-历史记录
  38. void controHeat(void);//控制-加热
  39. void contrlFan(void);//控制-通风
  40. void setTime(void);//设置-时间
  41. void powerOff(void);//关机-关机
  42. void resetSystem(void);//关机-重启-立即重启

  43. #define MENU_ITEMS_COUNT                sizeof(menuItems)/sizeof(menuItems[0])
  44. #define menu(parent,index,fuc)                {parent,##index##,(uint8_t *)ms##index##,fuc}
  45. struct MenuItem menuItems[]=
  46. {
  47.         //menu(父ID,ID,功能函数)
  48.          menu(0,1,NULL),//根
  49.          menu(1,2,NULL),//查看
  50.          menu(1,3,NULL),//控制
  51.          menu(1,4,NULL),//设置
  52.          menu(1,5,NULL),//关机
  53.          menu(2,6,NULL),//查看-时间
  54.          menu(2,7,NULL),//查看-手机号
  55.          menu(2,8,NULL),//查看-电量
  56.          menu(2,9,NULL),//查看-历史记录
  57.          menu(3,10,controHeat),//控制-加热
  58.          menu(3,11,NULL),//控制-通风
  59.          menu(4,12,NULL),//设置-时间
  60.          menu(5,13,NULL),//关机-关机
  61.          menu(5,14,NULL),//关机-重启
  62.          menu(14,15,NULL)//关机-重启-立即重启
  63. };
  64. /**
  65. 获得此菜单的下一级菜单列表
  66. **/
  67. uint8_t getChilerenMenuItems(uint8_t index,struct MenuItem *buf)
  68. {
  69.         uint8_t i,menuItemsIndex = 0;
  70.         uint8_t compIndex = index;//用于比较的索引
  71.         for(i=0;i<MENU_ITEMS_COUNT;i++)
  72.         {
  73.                 if(menuItems[i].parentIndex == compIndex)//比较父级ID是否为此菜单ID
  74.                 {
  75.                         buf[menuItemsIndex++] = menuItems[i];
  76.                 }
  77.         }
  78.         return menuItemsIndex;
  79. }
  80. /**
  81. 获得同级菜单列表
  82. **/
  83. uint8_t getPeerMenuItems(uint8_t index,struct MenuItem *buf)
  84. {
  85.         uint8_t i,menuItemsIndex = 0;
  86.         uint8_t compIndex = (index == 0 ? 0 : menuItems[index-1].parentIndex);//用于比较的索引
  87.         for(i=0;i<MENU_ITEMS_COUNT;i++)
  88.         {
  89.                 if(menuItems[i].parentIndex == compIndex)//比较父级ID是否与本菜单父级ID相同
  90.                 {
  91.                         buf[menuItemsIndex++] = menuItems[i];
  92.                 }
  93.         }
  94.         return menuItemsIndex;
  95. }
  96. /**
  97. 获得父级菜单的同级列表
  98. **/
  99. uint8_t getUpperMenuItems(uint8_t index,struct MenuItem *buf)
  100. {
  101.         uint8_t i,menuItemsIndex = 0;
  102.         uint8_t compIndex;//用于比较的索引
  103.         if(index == 0 || menuItems[index-1].parentIndex == 0)//如果父级ID为零表示已经是根
  104.         {
  105.                 compIndex = 0;//比较ID为0返回根菜单(通常为一个,也可设置为多个父级为0的根菜单)
  106.         }
  107.         else
  108.         {
  109.                 compIndex = menuItems[menuItems[index-1].parentIndex-1].parentIndex;//父级菜单的父ID
  110.         }
  111.         for(i=0;i<MENU_ITEMS_COUNT;i++)
  112.         {
  113.                 if(menuItems[i].parentIndex == compIndex)
  114.                 {
  115.                         buf[menuItemsIndex++] = menuItems[i];
  116.                 }
  117.         }
  118.         return menuItemsIndex;
  119. }
  120. /**
  121. 函数实现
  122. **/
  123. void controHeat(void)
  124. {
  125.         __nop();
  126. }
  127. void SystemInit(void)
  128. {
  129.         
  130. }

  131. struct MenuItem disMenuItems[20];
  132. uint8_t disMenuCount;
  133. int main(void)
  134. {
  135.         disMenuCount = sizeof(menuItems)/sizeof(menuItems[0]);
  136.         /**
  137.          menu(0,1,0),//根
  138.         **/
  139.         disMenuCount = getChilerenMenuItems(0,disMenuItems);//获得根菜单
  140.         /**
  141.          menu(1,2,0),//查看
  142.          menu(1,3,0),//控制
  143.          menu(1,4,0),//设置
  144.          menu(1,5,0),//关机
  145.         **/
  146.         disMenuCount = getChilerenMenuItems(1,disMenuItems);//获得根的下一级菜单 显示4个
  147.         /**
  148.          menu(3,6,0),//查看-时间
  149.          menu(3,7,0),//查看-手机号
  150.          menu(3,8,0),//查看-电量
  151.          menu(3,9,0),//查看-历史记录
  152.         **/
  153.         disMenuCount = getChilerenMenuItems(2,disMenuItems);//获得"查看"的下一级菜
  154.         /**
  155.          menu(0,1,0),//根
  156.         **/
  157.         disMenuCount = getPeerMenuItems(0,disMenuItems);//显示根的同极
  158.         /**        
  159.          menu(1,2,0),//查看
  160.          menu(1,3,0),//控制
  161.          menu(1,4,0),//设置
  162.          menu(1,5,0),//关机
  163.         **/
  164.         disMenuCount = getPeerMenuItems(2,disMenuItems);//获得"查看"的同级菜单
  165.         /**
  166.          menu(0,1,0),//根
  167.         **/
  168.         disMenuCount = getUpperMenuItems(1,disMenuItems);//显示根的父极
  169.         /**
  170.          menu(0,1,0),//根
  171.         **/
  172.         disMenuCount = getUpperMenuItems(2,disMenuItems);//显示"查看"的父极列表
  173.         /**        
  174.          menu(1,2,0),//查看
  175.          menu(1,3,0),//控制
  176.          menu(1,4,0),//设置
  177.          menu(1,5,0),//关机
  178.         **/
  179.         disMenuCount = getUpperMenuItems(6,disMenuItems);//显示"查看-时间"的父极列表
  180.         
  181.         menuItems[9].Fuc();//控制通
  182.         __nop();
  183. }
复制代码
参考文献:
《C语​言​菜​单​界​面​的​实​现​方》



此帖出自单片机论坛

最新回复

可以再1602屏上用吗  详情 回复 发表于 2014-9-25 15:18
点赞 关注(2)
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复
举报

577

帖子

9

TA的资源

纯净的硅(中级)

沙发
 
感觉很不错,用LCD测试了么?
此帖出自单片机论坛
 
个人签名哈喽,我是卡索KaSuo~~
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
太好了 正在学习
此帖出自单片机论坛
 
 
 

回复

15

帖子

1

TA的资源

一粒金砂(初级)

4
 
可以再1602屏上用吗
此帖出自单片机论坛

点评

可以。  详情 回复 发表于 2014-9-25 16:48
 
 
 

回复

9717

帖子

24

TA的资源

版主

5
 
861067771 发表于 2014-9-25 15:18
可以再1602屏上用吗

可以。

此帖出自单片机论坛
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表