表驱动法在STM32中的应用( 二 )

这年头谁还把流水灯搞的这么花里胡哨的啊,那么就举例在串口解析中的应用,之前的文章推送过《回调函数在命令解析中的应用》,下面只贴一下代码
typedef struct{rt_uint8_t CMD;rt_uint8_t (*callback_func)(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len);} _FUNCCALLBACK;_FUNCCALLBACK callback_list[] ={{cmd1, func_callback1},{cmd2, func_callback2},{cmd3, func_callback3},{cmd4, func_callback41},...};void poll_task(rt_uint8_t cmd, rt_uint8_t *msg, uint8_t len){int cmd_indexmax = sizeof(callback_list) / sizeof(_FUNCCALLBACK);int cmd_index = 0;for (cmd_index = 0; cmd_index < cmd_indexmax; cmd_index++){if (callback_list[cmd_index].CMD == cmd){if (callback_list[cmd_index]){/* 处理逻辑*/callback_list[cmd_index].callback_func(cmd, msg, len);}}}}除上述例子,表驱动法在UI界面中也有良好的应用,如下
结构体封装
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[] = {//operateIndexUpDownLeftRight{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},};定义两个变量保存当前场景和上一个场景
char current_stage=stage1;char prev_stage=current_stage;按下Up按键 跳转到指定场景current_stage的值根据映射表改变
current_stage =stage_tab[current_stage].Up;场景改变后 根据映射表执行相应的函数Handler
if(current_stage!=prev_stage){stage_tab[current_stage].current_operate();prev_stage=current_stage;}这是一个简单的菜单操作,结合了表驱动法 。在MCU中表驱动法有很多很多用处,本文的例子已经过多了,如果在通勤路上用手机看到这里,已经很难了 。关于UI操作,大神figght在github开源了zBitsView仓库,单片机实现屏幕界面,多层菜单 。很牛,很优秀的代码,有兴趣的同学可以学习一下 。https://github.com/figght/zBitsView
4、后记这篇文章我也看到网上一遍表驱动法的后总结的笔记,可能也有很多同学和我一样,在自己的项目中熟练应用了这种“技巧”,但今天才知道名字:表驱动法 。
这篇文章多数都是代码示例,实在因为表驱动法大家应该都熟练应用了,这篇文章算是总结一下吧 。
学习知识,可以像在学校从概念一点点学习,也可以在工作中慢慢积累,然后总结记录,回归最初的概念,丰富自己的知识框架 。
祝大家变得更强!
点击查看:C语言进阶专辑

经验总结扩展阅读