|
本帖最后由 qinjunquan 于 2009-6-1 14:41 编辑
我的实验板是用P2口控制4*4的矩阵键盘的,横向为P2^7-P2^4,纵向为P2^4-P2^0,不知道为什么下载进去的程序按1、5、9、13键的时候没有显示,其它就都可以,为什么会这样的呢?我注释了其它三行的程序,只测试第一行键盘的时候按第一个按键按下去可以显示0,但是全部都写进去就不可以了????点解啊????
uchar keyscan()
{
P2=0xf7; //让P2^3为0,既P2=11110111为开始扫描第一行键盘做准备
temp=P2;
temp=temp&0xf0; //temp与1111 0000相与
while(temp!=0xf0) //让temp与11110000相与,如果第一行有键盘按下的话P2的高四位会有一个不为1,既进入while循环
{
delay(1);//延迟,消除抖动
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2; //把P2的值再次赋给temp
switch(temp) //通过判断temp的值来判定是哪个键被按下
{
case 0x77:num=1; //temp=0111 0111(高四位的第一个0表示第一个键被按下),num值是作为返回值用的。
break;
case 0xb7:num=2; //temp=1011 0111(高四位第二位是0表示第二个键盘被按下)
break;
case 0xd7:num=3; //下面同上
break;
case 0xe7:num=4;
break;
}
while(temp!=0xf0)//松手检测,松手时temp=0xf0,跳出循环
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfb; //给P2赋值1111 1011,开始检测第二行键盘,同上
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7b:num=5;
break;
case 0xbb:num=6;
break;
case 0xdb:num=7;
break;
case 0xeb:num=8;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7d:num=9;
break;
case 0xbd:num=10;
break;
case 0xdd:num=11;
break;
case 0xed:num=12;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfe;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7e:num=13;
break;
case 0xbe:num=14;
break;
case 0xde:num=15;
break;
case 0xee:num=16;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
return num;
} |
|