矩阵按键扫描程序的一些不解

矩阵按键扫描程序的一些疑惑
看了郭天祥矩阵键盘的教程,看着程序很冗长,所以就用for语句来实现扫描键盘,程序简洁了不少,但是下载到51后没用! 无论按哪个键都数码管都没有显示(键盘是4x3的),仿真了下,发现所有I0都是高电平,跟没下程序一样。。。。。(经LZ检查板子没问题),检查了很多遍程序也没发现问题,麻烦各位看下矩阵按键扫描程序的一些不解



#include  <reg52.h>
#include  <Myspace.h>

uchar lie[4]={0xef,0xdf,0xbf,0x7f};
uchar hang[3]={0xfd,0xfb,0xf7};
uchar temp,key,i,j;

void disp(uchar x) //显示程序
{
  P0=duan2[x];
  delay(10);
}

void scanf()
{
 for(i=0;i<3;i++)
{
P1=hang[i]; //先将某一行置零
temp=P1;
temp&=0xf0;
if(temp!=0xf0)
{
delay(10); 
temp=P1;
temp&=0xf0;   //确认有按键按下时,确定哪一列
if(temp!=0xf0)
{
temp=P1;
for(j=0;j<4;j++)
if(temp==hang[i]&lie[j]){key=4*i+j+1;break;}
while(temp!=0xf0)   //等待松开按键
{
disp(key);
temp=P1;
temp&=0xf0;
}
}
}
}
}

main()
{
 P2=0x00; //选中所有数码管
while(1)
{
void sacnf();
}
}

------解决方案--------------------
1. 首先,你的IO口方向配置的正确么

2. 其次,你代码这里错了

if(temp==hang[i]&lie[j]){key=4*i+j+1;break;}
应该改成
if(temp==(hang[i]&lie[j])) {key=4*i+j+1;break;}

应该加上括号, 因为与运算符优先级比==优先级低(C语言中说&优先级高的&是取地址不是与运算)
------解决方案--------------------
读取程序的处理方式与键盘电路有关,
准双向IO口接开关的四种情况:
1.按下键时下拉电平,松开时浮空 读取前IO口先置1 低电平为被按下
2.按下键时上拉电平,松开时浮空 读取前IO口先置0 高电平为被按下
3.按下键时下拉电平,松开上拉电平 可直接读IO口 低电平为被按下
4.按下键时上拉电平,松开下拉电平 可直接读IO口 高电平为被按下
依据实际电路情况,改造自己的程序,直接抄来的程序经常不管用的