[讨论] 占用资源小的简单GUI的实现~~(转)

fish001   2009-12-22 09:52 楼主
对于类似51资源有限的单片机和点陈LCD比较实用

1.jpg

2.jpg

3.jpg



源码:
lwGUI.rar (22.95 KB)
(下载次数: 215, 2009-12-22 09:52 上传)

回复评论 (6)

移植:将GUI_hw.c 中接口函数替换即可.

功能:其它画线就不用讲了,菜单编程简单说明一下.程序亮点也在此(自认为)

  1. //----------------------------------------------------------------------------------
  2. //菜单结构
  3. typedef struct
  4. {
  5. INT8U x; //菜单框架左上角X坐标
  6. INT8U y; //菜单框架左上角Y坐标
  7. INT8U width; //菜单框架宽度
  8. INT8U height; //菜单框架高度

  9. INT8U itemTop; //显示菜单框中最上面项
  10. INT8U sItem; //当前选择项
  11. INT8U itemMax; //最大顶数

  12. const char *title; //菜单标题
  13. const BMP **pbmp; //菜单项位图列表
  14. const char ***ptext; //菜单项文本列表

  15. void(*Paint)(void); //重绘菜单
  16. void(*MegProc)(INT8U); //消息处理
  17. }MENU;

  18. 1.每个菜单项都有一个重绘菜单函数void(*Paint)(void); 通过它可画出想要的任何菜单样式。源码中画了大图标菜单和选择条菜单样式。每个菜单都有一个消息响应函数void(*MegProc)(INT8U); 传入消息如上页下页返回等操作。
  19. 2.定义菜单中的项采用分开方式编程,可读性强如:
  20. //==================================================================================
  21. //定义菜单字符串
  22. const char *sCtrl = "控制";
  23. const char *sSet = "设置";
  24. const char *sGame = "游戏";
  25. const char *sHelp = "帮助";

  26. const char *sCtrl2 = "智能插座 ";
  27. const char *sCtrl3 = "浴缸 ";
  28. const char *sCtrl4 = "脸盆 ";
  29. const char *sCtrl5 = "空调 ";
  30. //==================================================================================
  31. //定义菜单文本
  32. const char **MMenuText[] ={&sCtrl,&sSet,&sGame,&sHelp};
  33. const char **SCtrlText[] ={&sCtrl2,&sCtrl3,&sCtrl4,&sCtrl5};
  34. //==================================================================================
  35. //定义菜单位图列表
  36. const BMP *MMenuBmp[] ={&ctrl,&set,&game,&help};
  37. //==================================================================================
  38. //声明菜单消息处理事件
  39. void MMegProc(INT8U meg);
  40. void SCtrlMegProc(INT8U meg);
  41. //==================================================================================
  42. //定义菜单项
  43. MENU MMenu=
  44. {
  45. 0,
  46. 0,
  47. 128,
  48. 48,
  49. 0,
  50. 0,
  51. 4,
  52. "Main menu",
  53. MMenuBmp,
  54. MMenuText,
  55. GUI_MenuBmpPaint,
  56. MMegProc
  57. };
  58. MENU SCtrl=
  59. {
  60. 0,
  61. 0,
  62. 128,
  63. 48,
  64. 0,
  65. 0,
  66. 4,
  67. "控制",
  68. 0,
  69. SCtrlText,
  70. GUI_MenuPaint,
  71. SCtrlMegProc
  72. };
  73. //----------------------------------------------------------------------------------
  74. // 主菜单消息处理
  75. //描述: 处理主菜单消息
  76. //参数:meg :消息
  77. //返回: 无
  78. //----------------------------------------------------------------------------------
  79. void MMegProc(INT8U meg)
  80. {
  81. if(meg==KEY_UP)
  82. {
  83. if(MMenu.sItem>0)
  84. MMenu.sItem--;
  85. else
  86. MMenu.sItem = MMenu.itemMax-1;
  87. }
  88. else if(meg==KEY_DOWN)
  89. {
  90. if(MMenu.sItem<(MMenu.itemMax-1))
  91. MMenu.sItem++;

  92. else
  93. MMenu.sItem = 0;
  94. }
  95. else if(meg==KEY_EN)
  96. {
  97. if(MMenu.sItem==0)
  98. {
  99. pCMenu=&SCtrl;
  100. GUI_Clear();
  101. }
  102. if(MMenu.sItem==2)
  103. {
  104. TetrisMain();
  105. GUI_Clear();
  106. BuzzerOn;
  107. OSTimeDly(5);
  108. BuzzerOff;
  109. }
  110. }
  111. else if(meg==KEY_CLR)
  112. {
  113. GUI_Clear();
  114. pCMenu = 0;
  115. return;
  116. }
  117. pCMenu->Paint();
  118. }
  119. //----------------------------------------------------------------------------------
  120. // 控制菜单消息处理
  121. //描述: 处理控制菜单菜单消息
  122. //参数:meg :消息
  123. //返回: 无
  124. //----------------------------------------------------------------------------------
  125. void SCtrlMegProc(INT8U meg)
  126. {
  127. if(meg==KEY_UP)
  128. {
  129. if(SCtrl.sItem>0)
  130. SCtrl.sItem--;
  131. else
  132. SCtrl.sItem = SCtrl.itemMax-1;

  133. if(SCtrl.sItem
  134. SCtrl.itemTop--;
  135. if(SCtrl.sItem>SCtrl.itemTop+1)
  136. SCtrl.itemTop= SCtrl.sItem-1;
  137. pCMenu->Paint();
  138. }
  139. else if(meg==KEY_DOWN)
  140. {
  141. if(SCtrl.sItem<(SCtrl.itemMax-1))
  142. SCtrl.sItem++;

  143. else
  144. SCtrl.sItem = 0;

  145. if(SCtrl.sItem>1)
  146. SCtrl.itemTop=SCtrl.sItem-1;
  147. else
  148. SCtrl.itemTop=0;
  149. pCMenu->Paint();
  150. }
  151. else if(meg==KEY_CLR)
  152. {
  153. pCMenu=&MMenu;
  154. GUI_Clear();
  155. pCMenu->Paint();
  156. }
  157. else LCD_Refresh();
  158. }
  159. //==================================================================================
点赞  2009-12-22 09:54
很早就想写一个51的GUI,一直没能实施,看下你的构思。凑下热闹
点赞  2009-12-23 22:38
6666,感谢
点赞  2019-11-21 09:02
非常不错!!!!
点赞  2020-8-10 18:27
正是急需的资料
点赞  2020-9-24 10:36

看看思路

点赞  2021-7-21 14:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复