键盘扫描问题

bluecrane   2008-7-31 20:47 楼主
#include
#include
#define  uchar  unsigned  char
#define  unit  unsigned  int
void  delays(void)
uchar kbscan(void)
  uchar main (void)
{uchar key;
while(1)
{key=kbscan();//键盘扫描函数
   delays();//消抖延时函数
  }
}
//消抖延时函数
void delays(void)
{uchar i;
for(i=300;i>0;i--);
}
//kbscan(void)键盘扫描函数
uchar kbscan(void)
{uchar sccode,recode;
  P1=0xf0;//发全0行扫描码,列线输入
if((P1&0xf0)!=0xf0)//若有键按下
{delays();//消抖延时
if((P1&0xf0)!=0xf0)//确实有键盘按下
{sccode=0xfe;//逐行扫描初值
while((sccode&0x10)!=0)//判断是否是最后一行
{P1=sccode;//输出行扫描码
if((P1&0xf0)!=0xf0)//本行有键盘按下
{recode=(P1&0xf0)10x0f;
return((~sccode)+(~recode));//返回特征字节码
}else sccode=(sccode<<1)10x01;//行扫描左移一位
}
}
}return(0);//无键盘按下,返回0
}

1、while((sccode&0x10)!=0)这句怎么理解啊   为什么行扫描设定初值后下条语句就是判断是否最后一行了  这个问题真的不甚理解啊
搞了我好几天啦  

回复评论 (6)

其实它是一个判断语句,while()里面(sccode&0x10)!=0是判断语句,sccode&0x10

即scode与10000000每位相与,只有最高位为1有效,但是不代表它就是判断最后一行,

那要看你的具体电路是怎么连的,比如这里也可以(sccode&0x01)!=0,你可能是这样写

才觉得是在扫描第一行吧,其实这两个道理是一样的,只不过一个从高位开始接,一个从

低位开始接,你再结合实际电路看看吧
点赞  2008-7-31 21:10
其实它是一个判断语句,while()里面(sccode&0x10)!=0是判断语句,sccode&0x10

即scode与10000000每位相与,只有最高位为1有效,但是不代表它就是判断最后一行,

那要看你的具体电路是怎么连的,比如这里也可以(sccode&0x01)!=0,你可能是这样写

才觉得是在扫描第一行吧,其实这两个道理是一样的,只不过一个从高位开始接,一个从

低位开始接,你再结合实际电路看看吧
点赞  2008-7-31 21:10
"P1=0xf0;//发全0行扫描码,列线输入
if((P1&0xf0)!=0xf0)//若有键按下 "

P1=0xf0什么意思呀?
点赞  2008-7-31 23:41
你这是4*4的键盘吧。
P1=0xf0的意思是p1.4-P1.7设置为输入,P1.0-P1.3为输出0。
然后读P1口,判断P1的高4位看是否有键。
有键的话,再P1.0-P1.3依次输出0,回读P1口。就可以判断是哪个键按下了。
只不过这个按键程序太差了。没有一个编程的结构。
它判断最后一行明显是功能键的判断。就像PC键盘的Ctrl、Shift等。
点赞  2008-8-1 12:02
low-key
点赞  2008-8-1 12:54
0x10等于10000000吗二进制

它判断最后一行明显是功能键的判断。为什么是这样
我不懂
点赞  2008-8-1 17:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复