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 有什么特殊作用
展开
 我来答
百度网友ec066aa
2011-10-14
知道答主
回答量:28
采纳率:0%
帮助的人:31.5万
展开全部
这问题问得还是可以,scan1&0xf0 就是为了防止其他因素干扰了P1的低四位,用你说的scan1!=0xf0 程序就会认为有按键按下,实际则没有。只不过在不严格要求下用 scan1!=0xf0 也是可以的。顺便提醒你一下,程序改了,实践下就知道了
追问
一般有什么干扰因素呢?
追答
你这样想,现在你的程序只有矩阵键盘,如果给你加了其它许多程序,且其它程序中用到了你的矩阵键盘中的低四位IO口,也就是IO口复用了,如果你在检测按键时,这样会产生错误的结果的。再说句,很多开发板用的都是P3口,你应该知道一般都用P3口的第二功能吧!
生活如歌_
2011-10-14 · TA获得超过1.5万个赞
知道大有可为答主
回答量:7398
采纳率:78%
帮助的人:2071万
展开全部
在这里SCAN1就是P1口,而P1口接了矩阵式键盘,四行四列。在这条语句之前已经通过P1口送出了四个低电平:P1=0xf0.
这条语句P1&0xf0就是屏蔽先送出去的低四位的四个低电平。然后再通过(P1&0xf0)!=0xf0来判断是不是有键按下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ppdyhappy
2011-10-14 · 超过19用户采纳过TA的回答
知道答主
回答量:101
采纳率:0%
帮助的人:46.3万
展开全部
scan1&0xf0 应该是用来屏蔽低四位用的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2011-10-14 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38369
国家科技进步奖

向TA提问 私信TA
展开全部
是的,P口也包括其他输入口的读取,如果不是用全部位都需要这样来处理,因为你不知道其他位处于什么状态,所以需要把不要得位屏蔽掉。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式