[51单片机] 矩阵键盘行列反转问题求助大师

[复制链接]
1924|2
 楼主| samsunghellome 发表于 2013-8-28 08:53 | 显示全部楼层 |阅读模式

程序如下:
/*------------------------------------------------
          按键扫描函数,返回扫描键值
------------------------------------------------*/
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

粉丝
快速回复 在线客服 返回列表 返回顶部