C语言嵌入式系统编程修炼之键盘操纵
当前位置:以往代写 > C/C++ 教程 >C语言嵌入式系统编程修炼之键盘操纵
2019-06-13

C语言嵌入式系统编程修炼之键盘操纵

C语言嵌入式系统编程修炼之键盘操纵

处理惩罚成果键
成果键的问题在于,用户界面并非牢靠的,用户成果键的选择将使屏幕画面处于差异的显示状态下。譬喻,主画面如图1:

C语言嵌入式系统编程修炼之键盘哄骗
图1 主画面

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

C语言嵌入式系统编程修炼之键盘哄骗
图2 切换到配置XX画面

   措施如何判定用户处于哪一画面,并在该画面的措施状态下挪用对应的成果键处理惩罚函数,并且担保精采的布局,是一个值得思考的问题。
   让我们来看看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),很显然,假如你"能干"了这三种语言,其它语言你应该是可以很快"熟悉"的,不然你就没有"能干"它们。

    关键字:

在线提交作业