这是我13年前创作和发表在互联网上的文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。
全文目录:
C语言嵌入式系统编程修炼之道——背景篇
C语言嵌入式系统编程修炼之道——软件架构篇
1.模块划分
2.多任务还是单任务
3.单任务程序典型架构
4.中断服务程序
5.硬件驱动模块
6.C的面向对象化
总结
C语言嵌入式系统编程修炼之道——内存操作篇
1.数据指针
2.函数指针
3.数组vs.动态申请
4.关键字const
5.关键字volatile
6.CPU字长与存储器位宽不一致处理
总结
C语言嵌入式系统编程修炼之道——屏幕操作篇
1.汉字处理
2.系统时间显示
3.动画显示
4.菜单操作
5.模拟MessageBox函数
总结
C语言嵌入式系统编程修炼之道——键盘操作篇
1.处理功能键
2.处理数字键
3.整理用户输入
总结
C语言嵌入式系统编程修炼之道——性能优化篇
1.使用宏定义
2.使用寄存器变量
3.内嵌汇编
4.利用硬件特性
5.活用位操作
总结
C语言嵌入式系统编程修炼之键盘操作
处理功能键
功能键的问题在于,用户界面并非固定的,用户功能键的选择将使屏幕画面处于不同的显示状态下。例如,主画面如图1:
当用户在设置XX上按下Enter键之后,画面就切换到了设置XX的界面,如图2:
程序如何判断用户处于哪一画面,并在该画面的程序状态下调用对应的功能键处理函数,而且保证良好的结构,是一个值得思考的问题。
让我们来看看WIN32编程中用到的"窗口"概念,当消息(message)被发送给不同窗口的时候,该窗口的消息处理函数(是一个callback函数)最终被调用,而在该窗口的消息处理函数中,又根据消息的类型调用了该窗口中的对应处理函数。通过这种方式,WIN32有效的组织了不同的窗口,并处理不同窗口情况下的消息。
我们从中学习到的就是:
(1)将不同的画面类比为WIN32中不同的窗口,将窗口中的各种元素(菜单、按钮等)包含在窗口之中;
(2)给各个画面提供一个功能键"消息"处理函数,该函数接收按键信息为参数;
(3)在各画面的功能键"消息"处理函数中,判断按键类型和当前焦点元素,并调用对应元素的按键处理函数。
在窗口的消息处理函数中调用相应元素按键函数的过程类似于"消息映射",这是我们从WIN32编程中学习到的。编程到了一个境界,很多东西都是相通的了。其它地方的思想可以拿过来为我所用,是为编程中的"拿来主义"。
在这个例子中,如果我们还想玩得更大一点,我们可以借鉴MFC中处理MESSAGE_MAP的方法,我们也可以学习MFC定义几个精妙的宏来实现"消息映射"。
处理数字键
用户输入数字时是一位一位输入的,每一位的输入都对应着屏幕上的一个显示位置(x坐标,y坐标)。此外,程序还需要记录该位置输入的值,所以有效组织用户数字输入的最佳方式是定义一个结构体,将坐标和数值捆绑在一起:
那么接收用户输入就可以定义一个结构体数组,用数组中的各位组成一个完整的数字:
将数字每一位输入的坐标和输入值捆绑后,在数字键处理函数中就可以较有结构的组织程序,使程序显得很紧凑。
整理用户输入
继续第2节的例子,在第2节的onNumKey函数中,只是获取了数字的每一位,因而我们需要将其转化为有效数据,譬如要转化为有效的XXX数据,其方法是:
反之,我们也可能需要在屏幕上显示那些有效的数据位,因为我们也需要能够反向转化:
当然在上面的例子中,因为数据是2进制的,用power函数不是很好的选择,直接用">"移位操作效率更高,我们仅是为了说明问题的方便。试想,如果用户输入是十进制的,power函数或许是唯一的选择了。
总结
本篇给出了键盘操作所涉及的各个方面:功能键处理、数字键处理及用户输入整理,基本上提供了一个全套的按键处理方案。对于功能键处理方法,将LCD屏幕与Windows窗口进行类比,提出了较新颖地解决屏幕、键盘繁杂交互问题的方案。
计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的。我们最多需要"精通"三种语言(精通,一个在如今的求职简历里泛滥成灾的词语),最佳拍档是汇编、C、C++(或JAVA),很显然,如果你"精通"了这三种语言,其它语言你应该是可以很快"熟悉"的,否则你就没有"精通"它们。
本系列文章未完待续
领取专属 10元无门槛券
私享最新 技术干货