3244|6

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【R7F0C809】HMI屏菜单设计 [复制链接]

本帖最后由 ljj3166 于 2015-9-5 20:59 编辑

今次是第一回动手设计显示屏的菜单
基本上没有什么经验
刚开始蒙头尝试了几下
发现会自己玩死自己的
还是借鉴一下前人的经验吧
于是找到了这篇《单片机C语言下LCD多级菜单的一种实现方法》: 单片机C语言下LCD多级菜单的一种实现方法.pdf (149.49 KB, 下载次数: 45)

看了看代码的流程
基本上有点状态机的感觉在里面
先是定义一个结构体,子成员包括三大类:当前菜单状态、键值的下一个状态和对应的执行函数
再通过按键扫描获取按键值,通过按键值判断菜单状态的跳变
跳变后执行相关的功能函数即可
简单易懂,蛮受用
就拿这个试一下了
使用的按键是三向按键,上、下和中
看看代码
  1. typedef struct //定义个结构体,包含当前按键状态、向上键跳变状态、向下键跳变状态和指向执行函数的指针函数
  2. {
  3.         uint8_t KeyState;
  4.         uint8_t KeyUpState;
  5.         uint8_t KeyDnState;
  6.         uint8_t KeyEnState;
  7.         void (*CurrentOp)();
  8. }        KeyTabStruct;
  9. KeyTabStruct  KeyTab[]=//状态集合以及跳变规则
  10. {
  11.         {0,0,0,1,(*LCD_WR_pagemain)},
  12.         {1,7,3,0,(*LCD_WR_pagecontrol)},
  13.         {2,7,3,0,(*LCD_WR_icon0)},
  14.         {3,2,4,10,(*LCD_WR_icon1)},
  15.         {4,3,5,0,(*LCD_WR_icon2)},
  16.         {5,4,6,9,(*LCD_WR_icon3)},
  17.         {6,5,7,0,(*LCD_WR_icon4)},
  18.         {7,6,2,8,(*LCD_WR_icon5)},
  19.         {8,8,8,1,(*LCD_WR_pageabout)},
  20.         {9,4,6,9,(*CH1Control)},
  21.         {10,11,12,1,(*LCD_WR_pagebacklight)},
  22.         {11,11,12,1,(*LCD_WR_backlightUp)},
  23.         {12,11,12,1,(*LCD_WR_backlightDn)}
  24. };
复制代码
完成上面的定义,下面对键值进行操作就好了
记得按键消抖哈,转轮按键太需要消抖了
  1. void Get_Key(void)
  2. {
  3.         switch(Key_Value)
  4.         {
  5.                 case 0x10U:
  6.                         KeyFunc = KeyTab[KeyFunc].KeyEnState;//获取确认键的下一个状态
  7.                         Fresh_flag = 0;
  8.                         break;
  9.                 case 0x40U:
  10.                         KeyFunc = KeyTab[KeyFunc].KeyDnState;//获取向下键下一个状态
  11.                         break;
  12.                 case 0x20U:
  13.                         KeyFunc = KeyTab[KeyFunc].KeyUpState;//获取向上键下一个状态
  14.                         break;
  15.                 default: return;
  16.         }
  17.         KeyFuncPtr = KeyTab[KeyFunc].CurrentOp;//获取次态后,取其函数指针
  18.         KeyFuncPtr();//运行指向的函数
  19.         Key_Value = 0U;
  20. }
复制代码

看看楼主的消抖吧
  1. __interrupt void KEY_Interrupt()//2ms中断服务程序
  2. {
  3.         Key_flag = 1;
  4.         inttm00counter_old = inttm00counter;//进按键中断,记录一个时间
  5. }

  6. __interrupt void R_TAU0_Channel0_Interrupt(void)
  7. {
  8.         TDR00H = 0x9CU;         
  9.         TDR00L = 0x3FU;
  10.         inttm00counter++;
  11.         if(Key_flag)
  12.         {
  13.                 if(inttm00counter - inttm00counter_old == 100)//200ms后再读键值,滑轮啊滑轮
  14.                         {
  15.                         inttm00counter_old = 0;
  16.                         Key_flag = 0;
  17.                         Key_Value = KRF;
  18.                         KRF = 0U;
  19.                         if(Key_Value == 0x10U)
  20.                         {key_manu_falg++;Fresh_flag =0 ;}
  21.                         if(Key_Value == 0x20U)
  22.                         {if(key_count>0)
  23.                           { key_count--;}
  24.                           else{key_count = 5;}
  25.                         P0.0=~P0.0;}
  26.                         if(Key_Value == 0x40U)
  27.                         {key_count++;P0.1=~P0.1;}
  28.                         if(key_count == 6){key_count=0;}
  29.                         
  30.                         HMI_flag = 0;
  31.                         }
  32.                 else {}
  33.         }
  34. }
复制代码



搞清楚流程后
菜单设计一下子变得很轻松
上个视频

目前代码中实现了3级菜单
功能实现返回主界面、调整背光、关于、通道1充电控制
后面再慢慢完善吧

最新回复

记号留下   详情 回复 发表于 2019-8-25 00:20
点赞 关注(4)
个人签名

So TM what......?


回复
举报

862

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
恩,状态机设计的很好,留个记号,以备以后参考
 
个人签名水不撩不知深浅 人不拼怎知输赢
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
期待楼主完善。
 
个人签名山中方七日,世上已千年。
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

4
 
当年我用12864也参考的这篇
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

受用!

 
 
 

回复

1万

帖子

16

TA的资源

版主

6
 

谢谢分享

 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

137

帖子

0

TA的资源

一粒金砂(中级)

7
 

记号留下

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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