您的位置 首页 报告

C言语嵌入式体系编程修炼之五:键盘操作!

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

处理功能键

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


图1 主画面

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


图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),很显然,假如你”通晓”了这三种言语,其它言语你应该是能够很快”了解”的,不然你就没有”通晓”它们.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/260216.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部