热卖开发板:
  • 51单片机开发板
  • USB开发板
  • AVR单片机开发板
  • [单片机教程]第七课 按键处理

      第七课  按键处理
        通过之前的六课学习,我们对单片机已经有了初步的了解,并且我们已经从汇编、C两方面学习了编程,这一课开始,我们就会以C为主,展开来学习,把我们的实验板上的资源都编写出程序来。我们先来看看按键处理。

       

      这是实验板的电路图,这里的按键设计稍微有点不同,一般来说,按键是一端接在单片机的IO口上,另一端接地的,当按下时,IO口就可以检测到低电平,从而来判断是否有按下。而在我们的实验板里,采用了矩阵的接法,把多个按键(接在P20~P23)的接地端连在一起,分别接在P24、P25上面,这种复用的设计方法可缩减IO口的使用量,这里占用6个IO口可以得到8个按键,如果再增加两列,变成4×4的设计,则只用8个IO口就有16个按键。我们一般称P20~P23为行,而P24~P25为列。这里,我们来讲讲程序编写的思路。
        首先,我们先把P20~P23的行线写成高电平,然后,把其中一列写成低电平,再读取P20~P23的值,如果有按键被按下,则可以在P20~P23读到相应的低电平。同理,当我们再把另一列写成低电平再读取的时候也可以得到另外四个按键的情况。
        我们具体看看程序如何读取,并且把按键的情况保留在一个变量KeyValue中。

       

      为了方便使用STC上的一些资源,我们这课开始,不再使用at89x51.h,而是使用STC89C51RC_RD_PLUS.H头文件,大家下载后,解压放在Keil\C51\INC目录下,即可正常使用。
        这里重点讲解一下部分语句。
        KeyValue=KeyPort|0xf0;这里把P2口上的低四位值与0xF0进行“按位或”操作后,存入到KeyValue里,假设,我们P20上读到低电平(K7按键被按下),那么得到的键值就是0xFE。
        KeyValue=_crol_(KeyPort|0xf0,4);因为我们K1、K3、K7、K8这一列的值都保存在KeyValue的低四位了,那么,K2、K4、K5、K6这一列就要保存在高四位。这个运算有点复杂,呵呵,在汇编里只要SWAP A就可以了,C里麻烦一点,呵呵。往下看……
        先执行KeyPort|0xf0,将低四位的值取出来,比如仍是P20检测为低电平(K5被按下),运算后可以得到值为0xFE,然后再进行一个循环左移4位的操作,将数值移到高四位,得到键值为0xEF。_crol_()是一个循环左移的子函数,使用它必须在程序头加上#include "intrins.h"。
        上面的语句理解起来很好懂,但并不精简,用这一语句KeyValue=~((~(KeyPort|0xf0))<<4);代替得到的代码可以更少,这个语句编译后反汇编里用了SWAP A,相对上面的语句要精简4个字节的代码量,这个留给大家自己去分析原理。
        KeyProc()按键处理子函数的作用,就是将KeyValue的值送到P0口上的LED显示出来,这个应该很好理解了,这样程序执行后,按下相应的按键,就能看到对应的LED亮起来。
        好了,这一课讲到这里,大家课后想想:为什么同时按下2个按键,有时可以同时亮2个灯,而有时不行,同时可以最多亮多少个灯呢?想想为什么,如何通过修改程序来使得只能有一个按键有效呢?

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