单片机中映射表在UI设计中的应用

2019-04-15 19:28发布

在实际的单片机项目开发中,会设计到LCD的UI设计。如果我们只用if else语句去完成跳转逻辑,那么编写的代码会显得复杂难懂,如果利用映射表,这种弊端就会得到很好的改善。 假设现在有9个场景,分别对应我们小键盘上的9个数字键,另外还有Up Down Left Right 4个控制键,初始状态是小键盘1,那么通过上下左右,我们的场景会来回切换,用代码表示如下:
# 1.定义数据结构 映射表 typedef enum {
stage1=0, stage2, stage3, stage4, stage5, stage6, stage7, stage8, stage9,
}SCENE;
typedef struct {
void (*current_operate)(); #当前场景的处理函数 SCENE Index;                   #当前场景的标签 SCENE Up;                        #按下Up键跳转的场景 SCENE Down; #按下Down键跳转的场景 SCENE Right; #按下Left键跳转的场景 SCENE Left; #按下Right键跳转的场景
}STAGE_TAB;
STAGE_TAB stage_tab[]={
#.    operate       Index    Up     Down    Left   Right    {Stage1_Handler,  stage1,  stage4,  stage7,  stage3, stage2}, {Stage2_Handler,  stage2,  stage5,  stage8,  stage1, stage3}, {Stage3_Handler,  stage3,  stage6,  stage9,  stage2, stage1}, {Stage4_Handler,  stage4,  stage7,  stage1,  stage6, stage5}, {Stage5_Handler,  stage5,  stage8,  stage2, stage4,  stage6}, {Stage6_Handler,  stage6,  stage9,  stage3, stage5,  stage4}, {Stage7_Handler,  stage7,  stage1,  stage4, stage9,  stage8}, {Stage8_Handler,  stage8,  stage2,  stage5, stage7,  stage9}, {Stage9_Handler,  stage9,  stage3,  stage6, stage8,  stage7},
}; # 2.定义两个变量保存当前场景和上一个场景 char current_stage=stage1; char prev_stage=current_stage; # 3.按下Up按键 跳转到指定场景current_stage的值根据映射表改变 current_stage =stage_tab[current_stage].Up;
# 4.场景改变后 根据映射表执行相应的函数Handler if(current_stage!=prev_stage) {
stage_tab[current_stage].current_operate(); prev_stage=current_stage;
}