在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2276|回复: 0

[转贴] 【小雨的成长】矩阵式按键扫描

[复制链接]
发表于 2010-6-11 10:46:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
上一篇的一键多控,是独立式按键技术。它的特点是连接方便但是占用的口比较多。
  当按键达到8个以上时,我们一般就不会选择用独立式了。而选用矩阵式键盘扫描方式。
CEPARK 51实验板的按键就是按照这种方式。6个口控制8个按键。

                               
登录/注册后可看大图

                               
登录/注册后可看大图

下载 (24.89 KB)
2008-12-29 21:36


sunhm版主也写过这个方面的帖子。。大家可以去参考下。。它调用了其他的头文件。这里我就没用调用其他的头文件。
这里是链接http://bbs.cepark.com/viewthread.php?tid=713&fromuid=55&extra=page%3D1
    呵呵。。。。

设计思想:

   先将低四位置0,高四位置1,当有按键按下是高四位的P2.4或者P2.5一定有一个被拉为0.通过这个判断是不是有按键按下。
然后给P2口赋值为0xfe,也就是P2.0口为0,再来判断是那个键按下。如果没有按键按下就左移,判断P2.1,一直到P2.3判断完。如此循环下去就能找到是那个按键被按下。通过行号和列号我们得到键值。就可以转到相应的程序去操作了。

具体的程序如下:

/*******************
键盘扫描 本程序适用CEPARK 51实验板
作者:hnrain
时间:2008/12/29
********************/
#i nclude <reg51.h>
#define uint unsigned int
#define uchar unsigned char

sfr LEDport=0x80;
void delay()     //延时程序
{
   uchar i,j;
   for(i=50;i>0;i--)
     for(j=200;j>0;j--);
}
uchar keyscan()   //键盘扫描程序
{
   uchar hangcode,liecode;  //定义两个变量记录行列号。
   P2=0xf0;                      //将P2口低四位置0,高四位置1.
   if((P2&0xf0)!=0xf0)      //判断是否有按键按下。有的话顺序执行。
        {
     delay();                  //去抖动
       if((P2&0xf0)!=0xf0)           //再次判断是否有按键按下
        {
         hangcode=0xfe;             //将P2.0口置0,其他位置1
      while((hangcode&0x10)!=0)    //这一句是低四位循环设置用,和下面的左移指令结合用,当移到P2.4为0时就为假。
      {
       P2=hangcode;      
       if((P2&0xf0)!=0xf0)      
          {
          liecode=((P2&0xf0)|0x0f);   //读取列是哪个键按下。
       return ((~hangcode)+(~liecode));     //通过行号列号确定到底是哪个键按下。并返回键值
       }
        else  hangcode=((hangcode<<1)|0x01);   //这里是左移0x01的作用是,我们左移时系统补在后面的是0,不加这个就会读错
        }
     }
   else return 0;
   }
}
main()
{
  uchar key;
  
  while(1)
  {
  key=keyscan();
  switch(key)                                //通过SWITCH语句执行相应操作。
     {
    case 0x11: LEDport=0xfe;break;
    case 0x12: LEDport=0xef;break;
    case 0x14: LEDport=0xfb;break;
    case 0x18: LEDport=0xf7;break;
    case 0x21: LEDport=0xfd;break;
    case 0x22: LEDport=0xdf;break;
    case 0x24: LEDport=0xbf;break;
    case 0x28: LEDport=0x7f;break;
    }
   
   }
}

    这里是用点亮LED来判断,我们也可以用它在数码管上显示我们想要的数据。。。大家可以自己写写。。!!!
关键是理解这种编程思想。。。。


   小雨将会将他学习单片机过程中的一些程序啊。。心得写出来和大家分享。。。希望能给那些想学单片机而没有好教程的人一点东西。。。。也非常希望那些和我一样在学习单片机的人。。能将自己的心得和大家分享。。。其实我也是新手。


     也希望大家能多多的支持CEPAEK电子园。!!!有你们的支持,我们CEPARK电子园将办的更好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 14:25 , Processed in 0.016409 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表