C语言lcd上创建菜单的对象化实例分享

Linuxer 2017-11-14 05:23 次阅读

 这是我十三年前读研究生的时候写的系列文章《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(); }

  程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。  面向对象,真神了!

Linuxer技术专区

原文标题:C语言对象化设计的实例——LCD菜单

文章出处:【微信号:LinuxDev,微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

arduino蓝牙模块主从性问题解析

Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件和软件。由一个欧洲开发团队于200....

发表于 11-23 17:17 次阅读 0条评论
arduino蓝牙模块主从性问题解析

C语言控制寄存器

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储....

发表于 11-23 16:37 次阅读 0条评论
C语言控制寄存器

keil中忽略特定警告的方法

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇....

发表于 11-23 15:36 次阅读 0条评论
keil中忽略特定警告的方法

轻松学好C语言(原因 要求 教程)

C语言是一门基础语言,是学习其他语言的基础。据说java和.Net的底层都是用C语言来编写的,win....

的头像 电子发烧友网工程师 发表于 11-23 15:10 次阅读 0条评论
轻松学好C语言(原因 要求 教程)

NASA的十大编码准则

美国国家航空航天局(NASA)开发人员的工作是编程界最具挑战性的工作之一。他们编写代码并开发关键任务....

发表于 11-23 10:55 次阅读 0条评论
NASA的十大编码准则

基于FPGA的智能高速交易平台的实现

自电子交易问世以来,对速度的追逐无止境,时刻要求搭建速度最快、最智能的交易平台。智能和高速就意味着金....

发表于 11-22 17:09 次阅读 0条评论
基于FPGA的智能高速交易平台的实现

单片机C语言怎样申请固定地址的变量操作步骤解析

C语言中变量与其内存地址对应的入门知识简单讲解,同时这也是掌握指针部分知识的基础,每次我们要使用某变....

发表于 11-22 14:59 次阅读 0条评论
单片机C语言怎样申请固定地址的变量操作步骤解析

三个基本的VivadoHLS工程testbench编写原则

在C程序的设计中,任何一个C程序的顶层都是main()函数。而在vivado HLS的设计中,只要函....

发表于 11-22 14:22 次阅读 0条评论
三个基本的VivadoHLS工程testbench编写原则

基于单片机的温湿度实时监控的程序设计

51单片机STC89C52RC是本方案的选用芯片,以其8位处理和极低的价格来看,是很适合进行本次实验....

发表于 11-22 11:24 次阅读 0条评论
基于单片机的温湿度实时监控的程序设计

matlab和c语言的区别

  matlab和c语言目前已经得到广泛的运用,但是在生活当中人们容易把两者弄混淆,今天我们就来看看....

发表于 11-20 16:05 次阅读 0条评论
matlab和c语言的区别

韩厂退出LCD面板聚焦OLED,国产厂商机遇和挑战并存

韩国LGDisplay继关闭3.5代厂后,近期再关闭五代厂,四代厂也将在年底歇业,全力发展AMOLE....

发表于 11-20 10:35 次阅读 0条评论
韩厂退出LCD面板聚焦OLED,国产厂商机遇和挑战并存

结构体的定义、初始化和赋值

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。 在C语言中,....

发表于 11-20 09:29 次阅读 0条评论
结构体的定义、初始化和赋值

软件工程师也可以做硬件开发:软件工程师使用Vivado HLS的快速入门

进行硬件加速,要先准备好用来生成硬件模块的函数,它需要保存在一个单独的文件里。在创建工程时,指定它做....

发表于 11-18 13:10 次阅读 0条评论
软件工程师也可以做硬件开发:软件工程师使用Vivado HLS的快速入门

基于FPGA处理器的C编译指令

通常基于传统处理器的C是串行执行,本文介绍Xilinx Vivado-HLS基于FPGA与传统处理器....

发表于 11-18 12:23 次阅读 0条评论
基于FPGA处理器的C编译指令

NI嵌入式系统编程教程(FPGA与软件工具)

设计工程师通常使用C等编程语言来开发基于微处理器或微控制器架构的嵌入式系统。 C语言的普及催生了用于....

发表于 11-18 02:09 次阅读 0条评论
NI嵌入式系统编程教程(FPGA与软件工具)

c51特殊功能寄存器定义及作用

单片机C51语言是由C语言继承而来的。和C语言不同的是,C51语言运行于单片机平台,而C语言则运行于....

发表于 11-17 15:31 次阅读 0条评论
c51特殊功能寄存器定义及作用

机器视觉开源代码集合(转载)

特征提取Feature Extraction: SIFT [1] [Demo program][SI....

发表于 11-17 15:03 次阅读 0条评论
机器视觉开源代码集合(转载)

LGD聚焦OLED显示屏,OLED完败LCD

据韩国商报报道,LG最近关闭了位于Gumi(龟尾市)的5代线P4工厂,这是继3.5代线P2工厂后又一....

发表于 11-17 13:48 次阅读 0条评论
LGD聚焦OLED显示屏,OLED完败LCD

C语言设计学习,教你如何将LCD菜单对象化

这是我十三年前读研究生的时候写的系列文章《C语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向....

的头像 Linuxer 发表于 11-17 06:11 次阅读 0条评论
C语言设计学习,教你如何将LCD菜单对象化

51单片机C语言延时函数怎么定义和使用

C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。下面给出一个经典的延时函数。C程序中可使....

发表于 11-16 17:06 次阅读 0条评论
51单片机C语言延时函数怎么定义和使用