这是我十三年前读研究生的时候写的系列文章《c语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向对象,把lcd上面菜单,对象化的例子。
菜单操作无数人为之绞尽脑汁的问题终于出现了,在这一节里,我们将看到,在c语言中哪怕用到一丁点的面向对象思想,软件结构将会有何等的改观!笔者曾经是个笨蛋,被菜单搞晕了,给出这样的一个系统:
要求以键盘上的← →键切换菜单焦点,当用户在焦点处于某菜单时,若敲击键盘上的ok、cancel键则调用该焦点菜单对应之处理函数。我曾经傻傻地这样做着:
/* 按下ok键 */void onokkey(){ /* 判断在什么焦点菜单上按下ok键,调用相应处理函数 */ switch(currentfocus) {case menu1: menu1onok(); break;case menu2: menu2onok(); break;… }}/* 按下cancel键 */void oncancelkey(){ /* 判断在什么焦点菜单上按下cancel键,调用相应处理函数 */ switch(currentfocus) {case menu1: menu1oncancel(); break;case menu2: menu2oncancel(); break;… }}
终于有一天,我这样做了:
/* 将菜单的属性和操作封装在一起 */typedef struct tagsysmenu{ char *text; /* 菜单的文本 */ byte xpos; /* 菜单在lcd上的x坐标 */ byte ypos; /* 菜单在lcd上的y坐标 */ void (*onokfun)(); /* 在该菜单上按下ok键的处理函数指针 */ void (*oncancelfun)(); /* 在该菜单上按下cancel键的处理函数指针 */}sysmenu, *lpsysmenu;
当我定义菜单时,只需要这样:
static sysmenu menu[menu_num] ={ {menu1, 0, 48, menu1onok, menu1oncancel } , { menu2, 7, 48, menu2onok, menu2oncancel } , { menu3, 7, 48, menu3onok, menu3oncancel } , { menu4, 7, 48, menu4onok, menu4oncancel } …};
ok键和cancel键的处理变成:
/* 按下ok键 */void onokkey(){ menu[currentfocusmenu].onokfun();}/* 按下cancel键 */void oncancelkey(){ menu[currentfocusmenu].oncancelfun();}
程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。面向对象,真神了!
2021芯动力人才计划集成电路产业碳中和研讨会即将盛大开幕
为什么恒流源也有交流通路?它的电流不是恒定的吗?
900M-T-B烙铁头介绍
PCB线路板优劣的判断方法
无线充电简单可靠
C语言lcd上创建菜单的对象化实例分享
电磁兼容仪器校准件在实验室期间核查中的应用
关于昀通科技在UVLED固化机散热领域的探索
Taproot协议的升级将会对比特币网络造成什么影响
国产手机自主芯片阵队浮现 海思、米果、展讯走在前列
电工电子电气产品WF2防腐蚀等级试验是什么,WF2防腐蚀试验怎么办理
基于Zynq-7000的图像拼接技术的系统设计构架与实现效果
为什么说ADAS为商用车而生
求单字节十六进制无符号数据块的平均值
日本最大VR线下体验店新宿·VRZONE将于3月31日结束营业
药丸自动分配器的制作教程
荣耀手表GS Pro秘境星空版重磅发布
荣耀V40硬件参数曝光
汽车未来化离不开无线充电模块,推荐几款车载支架无线充
如何解决BGP路由黑洞问题