计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的。我们最多需要"精通 "三种语言,最佳拍档是汇编、C、C++(或JAVA),很显然,如果你"精通"了这三种语言,其它语言你应该是可以很快"熟悉"的,否则你就没有"精通 "它们。

内容要点:

·处理功能键

·处理数字键

·整理用户输入

处理功能键

功能键的问题在于,用户界面并非固定的,用户功能键的选择将使屏幕画面处于不同的显示状态下。例如,主画面如图1:

当用户在设置XX上按下Enter键之后,画面就切换到了设置XX的界面,如图2:

程序如何判断用户处于哪一画面,并在该画面的程序状态下调用对应的功能键处理函数,而且保证良好的结构,是一个值得思考的问题。

让我们来看看WIN32编程中用到的"窗口"概念,当消息(message)被发送给不同窗口的时候,该窗口的消息处理函数(是一个callback函数)最终被调用,而在该窗口的消息处理函数中,又根据消息的类型调用了该窗口中的对应处理函数。通过这种方式,WIN32有效的组织了不同的窗口,并处理不同窗口情况下的消息。

我们从中学习到的就是:

(1)将不同的画面类比为WIN32中不同的窗口,将窗口中的各种元素(菜单、按钮等)包含在窗口之中;

(2)给各个画面提供一个功能键"消息"处理函数,该函数接收按键信息为参数;

(3)在各画面的功能键"消息"处理函数中,判断按键类型和当前焦点元素,并调用对应元素的按键处理函数。

/* 将窗口元素、消息处理函数封装在窗口中 */

struct windows

{

BYTE currentFocus;

ELEMENT element[ELEMENT_NUM];

void (*messageFun) (BYTE keyvalue);

};

/* 消息处理函数 */

void messageFunction(BYTE keyvalue)

{

BYTE i = 0;

/* 获得焦点元素 */

while ( (element [i].ID!= currentFocus)&& (i < ELEMENT_NUM) )

{

i++;

}

/* "消息映射" */

if(i < ELEMENT_NUM)

{

switch(keyvalue)

{

case OK:

element[i].OnOk();

break;

}

}

}

在窗口的消息处理函数中调用相应元素按键函数的过程类似于"消息映射",这是我们从WIN32编程中学习到的。编程到了一个境界,很多东西都是相通的了。其它地方的思想可以拿过来为我所用,是为编程中的"拿来主义"。

在这个例子中,如果我们还想玩得更大一点,我们可以借鉴MFC中处理MESSAGE_MAP的方法,我们也可以学习MFC定义几个精妙的宏来实现"消息映射"。

处理数字键

用户输入数字时是一位一位输入的,每一位的输入都对应着屏幕上的一个显示位置(x坐标,y坐标)。此外,程序还需要记录该位置输入的值,所以有效组织用户数字输入的最佳方式是定义一个结构体,将坐标和数值捆绑在一起:

/* 用户数字输入结构体 */

typedef struct tagInputNum

{

BYTE byNum; /* 接收用户输入赋值 */

BYTE xPos; /* 数字输入在屏幕上的显示位置x坐标 */

BYTE yPos; /* 数字输入在屏幕上的显示位置y坐标 */

}InputNum, *LPInputNum;

那么接收用户输入就可以定义一个结构体数组,用数组中的各位组成一个完整的数字:

InputNum inputElement[NUM_LENGTH]; /* 接收用户数字输入的数组 */

/* 数字按键处理函数 */

extern void onNumKey(BYTE num)

{

if(num==0|| num==1) /* 只接收二进制输入 */

{

/* 在屏幕上显示用户输入 */

DrawText(inputElement[currentElementInputPlace].xPos, inputElement[currentElementInputPlace].yPos, "%1d", num);

/* 将输入赋值给数组元素 */

inputElement[currentElementInputPlace].byNum = num;

/* 焦点及光标右移 */

moveToRight();

}

}

将数字每一位输入的坐标和输入值捆绑后,在数字键处理函数中就可以较有结构的组织程序,使程序显得很紧凑。

整理用户输入

继续第2节的例子,在第2节的onNumKey函数中,只是获取了数字的每一位,因而我们需要将其转化为有效数据,譬如要转化为有效的XXX数据,其方法是:

/* 从2进制数据位转化为有效数据:XXX */

void convertToXXX()

{

BYTE i;

XXX = 0;

for (i = 0; i < NUM_LENGTH; i++)

{

XXX += inputElement[i].byNum*power(2, NUM_LENGTH - i - 1);

}

}

反之,我们也可能需要在屏幕上显示那些有效的数据位,因为我们也需要能够反向转化:

/* 从有效数据转化为2进制数据位:XXX */

void convertFromXXX()

{

BYTE i;

XXX = 0;

for (i = 0; i < NUM_LENGTH; i++)

{

inputElement[i].byNum = XXX / power(2, NUM_LENGTH - i - 1) % 2;

}

}

当然在上面的例子中,因为数据是2进制的,用power函数不是很好的选择,直接用"<< >>"移位操作效率更高,我们仅是为了说明问题的方便。试想,如果用户输入是十进制的,power函数或许是唯一的选择了。

总结

本篇给出了键盘操作所涉及的各个方面:功能键处理、数字键处理及用户输入整理,基本上提供了一个全套的按键处理方案。对于功能键处理方法,将LCD屏幕与Windows窗口进行类比,提出了较新颖地解决屏幕、键盘繁杂交互问题的方案。

计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的。我们最多需要"精通"三种语言(精通,一个在如今的求职简历里泛滥成灾的词语),最佳拍档是汇编、C、C++(或JAVA),很显然,如果你"精通"了这三种语言,其它语言你应该是可以很快"熟悉"的,否则你就没有"精通"它们.

嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇相关推荐

  1. [转]C语言嵌入式系统编程修炼之背景篇

    http://www.2ed.cn/Article-150-21922.shtml 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑, ...

  2. 嵌入式c语言精华,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇

    计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的.我们最多需要"精通 "三种语言,最佳拍档是汇编.C.C++(或JAVA),很显然,如果你&qu ...

  3. C语言嵌入式系统编程修炼(经典中的经典)

    C语言嵌入式系统编程修炼      http://blog.chinaunix.net/u/25764/showart_326589.html转载自这里,真是太经典了. C语言嵌入式系统编程修炼   ...

  4. C语言嵌入式系统编程修炼

    C语言嵌入式系统编程修炼之内存操作篇 数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力.在嵌入式 ...

  5. 编写书籍《C语言嵌入式系统编程修炼之道》序言

    序言        目前,嵌入式系统已经无处不在,遍布于世界的每一个角落.智能家电.手机.PDA.汽车.通信电台等几乎所有的电力.电器与电子产品都包含一个或多个嵌入式系统.有人的地方就有江湖,有电的地 ...

  6. C语言嵌入式系统编程修炼之道——屏幕操作篇

    C语言嵌入式系统编程修炼之道--屏幕操作篇 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 1.汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非 ...

  7. C语言嵌入式系统编程修炼之道——背景篇

    C语言嵌入式系统编程修炼之道--背景篇 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势 ...

  8. java切入式编程显示屏_C语言嵌入式系统编程修炼之四:屏幕操作

    C语言嵌入式系统编程修炼之四:屏幕操作 作者:宋宝华   更新日期:2005-07-22 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要 ...

  9. C语言嵌入式系统编程修炼之(四)屏幕操作

    C语言嵌入式系统编程修炼之屏幕操作 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示 ...

最新文章

  1. ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系
  2. C++ STL中vector用法简要总结
  3. (51)SSDT HOOK 实现进程保护
  4. 洛谷P2746 [USACO5.3]校园网Network of Schools
  5. SAP Commerce Cloud 架构概述
  6. akb48_AKB48偶像毕业后都去做什么了?日本前成员亲述转型艰辛
  7. Android LinearLayout加载Fragment
  8. 每个开发人员都需要学Python?看看大佬是怎么说的!
  9. vue 编辑弹框,编辑页面,列表数据也会跟着变
  10. 使用Docker安装Redis
  11. php弱类型机制,浅析php变量存储结构及弱类型实现机制
  12. 企业需要成熟的云安全进程
  13. Java 基础总结--反射的基本操作
  14. jmeter断言 判断响应数据是否符合预期
  15. 3.jsp页面分页功能(首页、下一页、上一页、末页)
  16. python语言在ansys的应用_Python语言在ANSYS的应用10讲-掌握SCDM脚本封装及ACT向导开发...
  17. python笔记003
  18. 计算机网络常见面试题,一网打尽!
  19. MySQL:创建数据库并插入数据
  20. 不知道天气咋样?一起用Python爬取天气数据分析告诉你

热门文章

  1. Yoda 表示法错在哪里
  2. best wavelet guide
  3. 计划策略的配置参数(1)
  4. 输入记忆功能如何恢复
  5. sap abap在表VBAP和VBAK上增加新字段的标准BAPI
  6. SAP 库存关联表信息
  7. 传统企业如何实现移动化转型?
  8. SAP如何直接往系统中数据库表插入数据
  9. SAP中程序间的相互调用,SUBMIT关键字的用法
  10. SAP 登陆界面菜单文本修改 (Modification of SAP Logon Menu text)