你的程序里for是嵌套循环,所以这个会一直循环到j=4,i=4,为止,又数码管显示的数组就0~15个,则for循环最后出来的value一直是等于15的,所以一直显示F
……
if (P1=buf[j]) --这里,是等号?
if里面,是不是应该写双等号? 大于等于...,也行。
{
P1=0X0F;
……
uchar buf[]={0x08,0x04,0x02,0x01};
uchar buf2[]={0x80,0x40,0x20,0x10};
uchar Keyscan()
{ uchar value;
uchar i,j;
for(j=0;j<4;j++)
{
P1=buf[j];
for (i=0;i<4;i++)
{
if ((P1&0xf0)==buf2[i])
value=4*j+i;
}
}
return value;
}
这样方法不好做,可以试试反转法。
思路:
第一次送F0,读取回来保存;
第二次送0F,读取回来保存;
把一次和二次读回来的数据相或就对应了按键的值,再根据此值查表就得到键码了。
参考一下这个,仿真实例 试试