|
本帖最后由 ljj3166 于 2015-9-5 20:59 编辑
今次是第一回动手设计显示屏的菜单
基本上没有什么经验
刚开始蒙头尝试了几下
发现会自己玩死自己的
还是借鉴一下前人的经验吧
于是找到了这篇《单片机C语言下LCD多级菜单的一种实现方法》:
单片机C语言下LCD多级菜单的一种实现方法.pdf
(149.49 KB, 下载次数: 45)
看了看代码的流程
基本上有点状态机的感觉在里面
先是定义一个结构体,子成员包括三大类:当前菜单状态、键值的下一个状态和对应的执行函数
再通过按键扫描获取按键值,通过按键值判断菜单状态的跳变
跳变后执行相关的功能函数即可
简单易懂,蛮受用
就拿这个试一下了
使用的按键是三向按键,上、下和中
看看代码
- typedef struct //定义个结构体,包含当前按键状态、向上键跳变状态、向下键跳变状态和指向执行函数的指针函数
- {
- uint8_t KeyState;
- uint8_t KeyUpState;
- uint8_t KeyDnState;
- uint8_t KeyEnState;
- void (*CurrentOp)();
- } KeyTabStruct;
- KeyTabStruct KeyTab[]=//状态集合以及跳变规则
- {
- {0,0,0,1,(*LCD_WR_pagemain)},
- {1,7,3,0,(*LCD_WR_pagecontrol)},
- {2,7,3,0,(*LCD_WR_icon0)},
- {3,2,4,10,(*LCD_WR_icon1)},
- {4,3,5,0,(*LCD_WR_icon2)},
- {5,4,6,9,(*LCD_WR_icon3)},
- {6,5,7,0,(*LCD_WR_icon4)},
- {7,6,2,8,(*LCD_WR_icon5)},
- {8,8,8,1,(*LCD_WR_pageabout)},
- {9,4,6,9,(*CH1Control)},
- {10,11,12,1,(*LCD_WR_pagebacklight)},
- {11,11,12,1,(*LCD_WR_backlightUp)},
- {12,11,12,1,(*LCD_WR_backlightDn)}
- };
复制代码 完成上面的定义,下面对键值进行操作就好了
记得按键消抖哈,转轮按键太需要消抖了
- void Get_Key(void)
- {
- switch(Key_Value)
- {
- case 0x10U:
- KeyFunc = KeyTab[KeyFunc].KeyEnState;//获取确认键的下一个状态
- Fresh_flag = 0;
- break;
- case 0x40U:
- KeyFunc = KeyTab[KeyFunc].KeyDnState;//获取向下键下一个状态
- break;
- case 0x20U:
- KeyFunc = KeyTab[KeyFunc].KeyUpState;//获取向上键下一个状态
- break;
- default: return;
- }
- KeyFuncPtr = KeyTab[KeyFunc].CurrentOp;//获取次态后,取其函数指针
- KeyFuncPtr();//运行指向的函数
- Key_Value = 0U;
- }
复制代码
看看楼主的消抖吧
- __interrupt void KEY_Interrupt()//2ms中断服务程序
- {
- Key_flag = 1;
- inttm00counter_old = inttm00counter;//进按键中断,记录一个时间
- }
- __interrupt void R_TAU0_Channel0_Interrupt(void)
- {
- TDR00H = 0x9CU;
- TDR00L = 0x3FU;
- inttm00counter++;
- if(Key_flag)
- {
- if(inttm00counter - inttm00counter_old == 100)//200ms后再读键值,滑轮啊滑轮
- {
- inttm00counter_old = 0;
- Key_flag = 0;
- Key_Value = KRF;
- KRF = 0U;
- if(Key_Value == 0x10U)
- {key_manu_falg++;Fresh_flag =0 ;}
- if(Key_Value == 0x20U)
- {if(key_count>0)
- { key_count--;}
- else{key_count = 5;}
- P0.0=~P0.0;}
- if(Key_Value == 0x40U)
- {key_count++;P0.1=~P0.1;}
- if(key_count == 6){key_count=0;}
-
- HMI_flag = 0;
- }
- else {}
- }
- }
复制代码
搞清楚流程后
菜单设计一下子变得很轻松
上个视频
目前代码中实现了3级菜单
功能实现返回主界面、调整背光、关于、通道1充电控制
后面再慢慢完善吧
|
|