打印
[51单片机]

矩阵键盘行列反转问题求助大师

[复制链接]
1510|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

程序如下:
/*------------------------------------------------
          按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
KeyPort=0x0f;            //行线输出全为0
cord_h=KeyPort&0x0f;     //读入列线值
if(cord_h!=0x0f)    //先检测有无按键按下
{
  DelayMs(10);        //去抖
  if((KeyPort&0x0f)!=0x0f)
  {
    cord_h=KeyPort&0x0f;  //读入列线值
    KeyPort=cord_h|0xf0;  //输出当前列线值
    cord_l=KeyPort&0xf0;  //读入行线值

    while((KeyPort&0xf0)!=0xf0);//等待松开并输出
    return(cord_h+cord_l);//键盘最后组合码值
   }
  }return(0xff);     //返回该值
}
我想问的是:
1、KeyPort=0x0f;            //行线输出全为0
cord_h=KeyPort&0x0f;     //读入列线值
if(cord_h!=0x0f)    //先检测有无按键按下
  KeyPort刚赋初值0x0f就与0x0f相与位操作,能及时反映出按键按下状态吗?
2、cord_h=KeyPort&0x0f;  //读入列线值
    KeyPort=cord_h|0xf0;  //输出当前列线值
    cord_l=KeyPort&0xf0;  //读入行线值
    第二个问题中,KeyPort在第二个语句中,高四位已全部变为1,第三句还能得到想要的结果吗?
3、请大师指点一下,行列反转用意何在?谢谢!

相关帖子

沙发
16777216| | 2013-8-28 09:09 | 只看该作者
行列反转 取得键码  keyport 应该是P端口吧 ,那么即使上一句置位1 在下一句指令的时候也会读取正确的端口 是高还是低

keyport = 0xff;
keyport 再读取的时候 不是0xff 而是当前P口子的值  置位0xff只是为了读取成功

建议看一下矩阵键盘的一些文档即可

使用特权

评论回复
板凳
ayb_ice| | 2013-8-28 10:18 | 只看该作者
1: 如果CPU很快,确实有必要增加些延时
2:算法有些不同而已,第二次扫描时不是完全反转,(没有太仔细看,可能不对)
3:反转法速度快

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

198

帖子

0

粉丝