热卖开发板:
  • 51单片机开发板
  • USB开发板
  • AVR单片机开发板
  • C语言嵌入式系统编程修炼之键盘操作

       


        在窗口的消息处理函数中调用相应元素按键函数的过程类似于"消息映射",这是我们从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),很显然,如果你"精通"了这三种语言,其它语言你应该是可以很快"熟悉"的,否则你就没有"精通"它们。

    声明:CEPARK已尽力确保内容的准确性,但因业务发展和技术服务的需要,有关内容可能会根据实际情况随时更新或者修改,恕不另行通知,不便之处敬请谅解!
      商城推荐
      社区指南
    CEPARK电子园-电子工程师自己的网络家园!
      迷你博客,轻松完成日志发布,管理相册;展示个性自我
      兴趣小组,热点话题,加入您感兴趣的话题讨论小组,一起交流吧
      最新资讯,热门话题与好友一起分享信息,他评论感兴趣的话题
      实名认证,真实交友,还可以轻松快捷的了解好友动态
      邀请您身边的好友,朋友,同事一起加入欢乐圈