51单片机矩阵键盘问题
ucharkeyscan(){ucharscan1,scan2,keycode,j;P1=0xf0;scan1=P1;if((scan1&0xf0)!=0xf0)//判键...
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判键是否按下 这个地方为什么要用(scan1&0xf0)!=0xf0 直接scan1!=0xf0 不行么
{
delay1ms(20); //延时20ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P1=0x0f; //线反转法的核心
scan2=P1;
keycode=scan1|scan2; //组合成键编码
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
key=j;
return(key);
}
}
}
}
else
P1=0xff; //P1口写1 输入状态
return (16);//"-"
}
难道scan1&0xf0 有什么特殊作用 展开
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0) //判键是否按下 这个地方为什么要用(scan1&0xf0)!=0xf0 直接scan1!=0xf0 不行么
{
delay1ms(20); //延时20ms
scan1=P1;
if((scan1&0xf0)!=0xf0) //二次判键是否按下
{
P1=0x0f; //线反转法的核心
scan2=P1;
keycode=scan1|scan2; //组合成键编码
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得键值
{
key=j;
return(key);
}
}
}
}
else
P1=0xff; //P1口写1 输入状态
return (16);//"-"
}
难道scan1&0xf0 有什么特殊作用 展开
4个回答
展开全部
这问题问得还是可以,scan1&0xf0 就是为了防止其他因素干扰了P1的低四位,用你说的scan1!=0xf0 程序就会认为有按键按下,实际则没有。只不过在不严格要求下用 scan1!=0xf0 也是可以的。顺便提醒你一下,程序改了,实践下就知道了
追问
一般有什么干扰因素呢?
追答
你这样想,现在你的程序只有矩阵键盘,如果给你加了其它许多程序,且其它程序中用到了你的矩阵键盘中的低四位IO口,也就是IO口复用了,如果你在检测按键时,这样会产生错误的结果的。再说句,很多开发板用的都是P3口,你应该知道一般都用P3口的第二功能吧!
展开全部
在这里SCAN1就是P1口,而P1口接了矩阵式键盘,四行四列。在这条语句之前已经通过P1口送出了四个低电平:P1=0xf0.
这条语句P1&0xf0就是屏蔽先送出去的低四位的四个低电平。然后再通过(P1&0xf0)!=0xf0来判断是不是有键按下。
这条语句P1&0xf0就是屏蔽先送出去的低四位的四个低电平。然后再通过(P1&0xf0)!=0xf0来判断是不是有键按下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
scan1&0xf0 应该是用来屏蔽低四位用的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是的,P口也包括其他输入口的读取,如果不是用全部位都需要这样来处理,因为你不知道其他位处于什么状态,所以需要把不要得位屏蔽掉。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询