刚入手一个单片机开发板,遇到不懂得地方,求大神帮忙解答。问题在下面程序的旁边#include<reg52.h>
#include"bstv51.h"
uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
0x5e , 0x79 , 0x71 , 0x00};
void delay(uint xms) //Ñó3ùxms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
DU=1;
DU=0;
}
void keyscan4x4()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)----------------------------------------------------这句是什么意思啊,看不懂,是在判断什么呢?
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)--------------------------------------上面都判断了,为什么这里还要判断。
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)-------------------------------还有这句什么意思,
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
此帖出自
小平头技术问答
按你的程序,应该是低4位拉低,读高4位的值。不能一下子全部拉低,所以先拉一行,判断列得一个值,
按此方法拉第二行低电平,再第三,第四行。所以低4位是什么值,对检测列数据来说,是无用的,检测列
数据,只要高4位。temp=P3就是把P3口读回来; temp=temp&0xf0就是把P3口的值与上0xf0,结果是只要P3口的高4位,如果没键按下,那与完的值就是0xf0,如果有键按下,列数据肯定会变化,那就肯定不是0xf0;下一句程序 if(temp!=0xf0),就是判断是否有键按下,如果没有,则不执行下面语句,继续判断。当按下时,为真,就往下执行,第2次判断就要先延时去抖动,所以延时后写第二次,再次判断仍为真,则有键按下。此时,再读回P3口的值,看等于多少,就相应按了什么键,你可以看着图来对比 switch语句就容易弄懂了。你问的第3次是一个松手检测,就是你按了一次,如果没有松手检测,可能程序执行好几次了,你如果写程序按一次数据管加1,就会发现没有松手检测,按1次可能就从1变成8或9什么的了,不确定的,只要加了松手检测,才能按一次实现一个功能。是这样的:switch语句前又把P3口读回来给temp了,此时temp不等于0xf0,进入 while语句,再读回来与上0xf0后,temp就是0xf0,如果不等于,那就是还有键按下,就一直在 while中直到当键按下松手后,P3口又回到全1,与上0xf0后仍为0xf0,temp!=0xf0就为假,就退出while语句。这就是一个过程,这样,第一行按下的4个键就出来了。在并列位置,把第2行拉低,继续判断出5、6、7、8,依次下去把4行都扫描完,16个键哪个按下就出来了,记录好每个键,程序中指定哪个键执行什么内容就可以了。
一周热门 更多>