||
人机界面设计方法
1、 结构体内容定义
typedef struct
{
u8 MeunIndex;
u8 EscFlag;
u8 UpFlag;
u8 DownFlag;
u8 LeftFlag;
u8 RightFlag;
u8 AddFlag;
u8 DecFlag;
u8 EnterFlag;
u8 Modify;
u8 DataMax;
u8 MoveMax;
void (*CurrentOperate)();
}MEUNSTRUCT;
结构内容 | 说明 | 备注 |
MeunIndex | 菜单索引 | 要求唯一 |
EscFlag | 返回索引 | |
UpFlag | 向上索引 | |
DownFlag | 向下索引 | |
LeftFlag | 向左索引 | |
RightFlag | 向右索引 | |
AddFlag | 增加索引 | |
DecFlag | 减小索引 | |
EnterFlag | 确认索引 | |
Modify | 修改样式 | 0:菜单切换 1:金手指切换 2:密码菜单 3:数据修改菜单 |
DataMax | 子菜单/数据个数 | |
MoveMax | 移动最大位数 | |
CurrentOperate | 执行函数指针 |
2、 使用细节介绍
//定义菜单数量为N
#define MaxIndex N
//定义函数指针
static void (*KeyFuncPtr)(void);
//函数声明
Void MeunNo1(void);
Void MeunNo2(void);
Void MeunNo3(void);
Void MeunNo10(void);
Void MeunNo20(void);
Void MeunNo30(void);
//菜单索引0保留给开机界面使用
//结构体赋值
const MEUNSTRUCT MeunStruct[MaxIndex] =
{
//中文定义
{ 1, 1, 3, 2, 1, 1, 1, 1, 10, 0, 3,6, MeunNo1},
{ 2, 1, 3, 2, 2, 2, 2, 2, 20, 0, 3,6, MeunNo2},
{ 3, 1, 3, 2, 3, 3, 3, 3, 30, 0, 3,6, MeunNo3},
…//略
{ 10, 1, 3, 2, 0, 0, 0, 0, 10, 1, 3,6, MeunNo10},
…//略
{ 20, 2, 3, 2, 0, 0, 0, 0, 20, 2, 3,6, MeunNo20},
…//略
{ 30, 3, 3, 2, 0, 0, 0, 0, 30, 3, 3,6, MeunNo30},
//英文定义
{ 31, 31, 33, 32, 31, 31, 31, 31, 40, 0, 3,6, MeunNo1},
{ 32, 31, 33, 32, 32, 32, 32, 32, 50, 0, 3,6, MeunNo2},
{ 33, 31, 33, 32, 33, 33, 33, 33, 60, 0, 3,6, MeunNo3},
…//略
{ 40, 31, 3, 2, 0, 0, 0, 0, 40, 1, 3,6, MeunNo10},
.//略
{ 50, 32, 3, 2, 0, 0, 0, 0, 50, 2, 3,6, MeunNo20},
…//略
{ 60, 33, 3, 2, 0, 0, 0, 0, 60, 3, 3,6, MeunNo30},
};
//函数定义
Void MeunNo1(void)
{
…
}
Void MeunNo2(void)
{
…
}
Void MeunNo3(void)
{
…
}
Void MeunNo10(void)
{
…
}
Void MeunNo20(void)
{
…
}
Void MeunNo30(void)
{
…
}
//使用处理
void KeyService(void)
{
//定义索引号
Static u8 Index;
//根据菜单的修改样式执行相应操作
Switch(MeunStruct[Index-1].Modify)
{
Case 0 ://界面切换
Switch(KeyVal)
{
Case F1: Index = MeunStruct[Index-1].EscFlag; break;
Case F2: Index = MeunStruct[Index-1].UpFlag; break;
...
Default: break;
}
Case 1 :// 金手指切换
Case 2 ://密码菜单
Case 3 ://数据修改菜单
Default: break;
}
//取当前函数地址
KeyFuncPtr=MeunStruct[Index-1].CurrentOperate;
//执行函数
(*KeyFuncPtr)();
//清指针
KeyFuncPtr = NULL;
//清键值
KeyVal = 0;
}
备注:在中英文切换时只修改菜单索引偏移量即可,
金手指切换:是指子菜单选择