51单片机 矩阵键盘 检测的命令

为何是一下这样。我的问题是1,P3给了0xfe,p3又给temp。再拿temp跟0xf0比较那不是总是拿0xfe与0xf0比较。2,P3=0xfe是什么作用,既然要对比按下键后P3与0xf0,那么直接对比p3与0xf0的值就可以了啊(只要后两句)
while(1) {P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
P3口的低4位接行,高四位接列,忘记说了,不好意思

temp的值会受到按键的影响,例如变成:7e或别的值等。追问

那么P3=0xfe有什么作用?

追答

读取P3口的状态

追问

是不是读取前全部要置1,那写成0xff不还好。

追答

不是的,要有1有0才行,不然,如何知道有键被按下?
当管脚由1变成0表示有键按下的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-07
矩阵键盘它是先给一列置低电平,然后逐行扫描才知道具体是那个键按下!
第2个回答  推荐于2016-12-04
矩阵键盘是通过行和列来确认具体位置的,那个与操作就是来确定行或列的(具体要看硬件电路)。追问

P3口的低4位接行,高四位接列,忘记说了,不好意思

追答

P3=0xfe; //将第一行线置低电平,其余行线全为高电平。
temp=P3; //读取P3口当前状态值赋给临时变量temp,用于后面计算。
temp=temp&0xf0;//将temp与0xf0进行“与”运算,然后再将结果赋值给temp,主要目的是判
断temp的高四位是否有0,如果temp的高四位有0,那么与0xf0”与”运算后结果必然不等于0xf0;如果temp的高四位没有0,那么它与0xf0”与”运算后结果必然等于0xf0。temp的高四位数据线实际上就是矩阵键盘的4个列线,从而我们可以判断temp与0xf0“与”运算后的结果是否为0xf0来判断第一行按键是否有键按下。
while(temp!=0xf0) // 这句话中的temp是P3口数据与oxf0“与”运算后的结果,如果temp不等于0xf0,说明有键按下。

当然后面紧接着要加延时去抖,并需要在判断一次是否有键确实被按下。
这下明白了么?如果还不明白,我也没办法了。

本回答被提问者采纳
第3个回答  2012-02-06
while(1) {P3=0xfe; 给P3口附值为0xfe
temp=P3; 读回P3口的值 看看有没有按键按下 有的话数值就不是0xfe
temp=temp&0xf0;看看有没有按键按下 有的话数值就不是0xfe
while(temp!=0xf0)等待释放按键

看这个说明你应该明白了吧,不过,你这程序写的很差,我给你一个吧

#include<REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code DIS_SEG7[16]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code DIS_BIT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code SKEY[16]={10,11,12,13,3,6,9,14,2,5,8,0,1,4,7,15};
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
//========================
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
//===========================
char scan_key(void)
{
uchar i,j,in,ini,inj;
bit find=0;
for(i=0;i<4;i++)
{
P1=act[i];
delay(10);
in=P1;
in=in>>4;
in=in|0xf0;
for(j=0;j<4;j++)
{
if(act[j]==in)
{find=1;
inj=j;ini=i;
}
}
}
if(find==0)return -1;
return (ini*4+inj);
}
//============================
void main(void)
{ char c;
uchar key_value;
while(1)
{
c=scan_key();
if(c!=-1)key_value=SKEY[c];
P0=DIS_SEG7[key_value];
P2=DIS_BIT[0];
delay(2);
}
}

51单片机 矩阵键盘 检测的命令
temp的值会受到按键的影响,例如变成:7e或别的值等。

求助程序:51单片机矩阵键盘是否按下检测程序
函数功能 : 检测有按键按下并读取键值 输 入 : 无 输 出 : 无 \/ void KeyDown(void){ char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)\/\/读取按键是否按下 { delay(1000);\/\/延时10ms进行消抖 if(GPIO_KEY!=0x0f)\/\/再次检测键盘是否按下 { \/\/测试列 GPIO_KEY=0X0F...

单片机矩阵键盘检测的疑问
temp=temp&0xf0; \/\/temp&1111 0000,0与任何数结果为0,把temp变量的低四位屏蔽了,高四位因为任何数与1等于它本身,所以把高四位对应的端口状态读进来。while(temp!=0xf0) \/\/上步处理后,高四为不全为1,说明有按键按下(结合矩阵键盘的电路结构才能理解,这里不方便上图){ delay(5);temp=P...

一个关于51单片机矩阵键盘的问题。我现在已经能实现矩阵键盘的检测,我 ...
while(temp!=0xf0) \/\/松手检测 { temp=P1;temp=temp&0xf0;display(); \/\/调用显示 } } } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(10);while(temp!=0xf0){ temp=P1;temp=temp&0xf0;switch(temp){ case 0xe0: num=4;break;case 0xd0: num=5;break;...

单片机矩阵键盘怎么进行松手检测?
用位跳转指令,检测到按键后,确定其是有键按下,不是干扰后,就用位跳转指令等待其弹起,再转到相应处理程序处理即可。

51单片机的矩阵键盘检测问题
扫描按键有没有释放,如果释放再加个消抖延时,再扫描有没有释放,如果按键释放则确认已经松手了。我是这么做的,可以用

关于51单片机矩阵键盘的问题。
(1)P3口是准双向IO口(注意与双向IO口的区别),它 的硬件结构决定着,读取之前先写1,再读取,读取的结果才可能是正确的,你可以区域查查书。(2)4X4 矩阵键盘的8根线直接连在IO上,而独立按键有一根线固定是接地的,这就意味着必须采取扫面或者线反转的方法。比如其中一根行线赋0,相当于...

51单片机矩阵键盘检测方面的问题
第一个问题,应该是考虑如果先开锁存器,在那一时刻,P0的值还是上一次给P0赋的值,下在一条语句才将这次的值给P0,这样会造成数码管的余辉,静态显示的时候,因为太快看不到,动态显示时,就会比较明显了。第二个问题他的程序应该检测的是高四位,是否被拉低,因为temp和0xf0与,低四位不管是...

51单片机键盘检测加串口传输的问题
在spi中断程序中没有调用JIANPAN,直接返回了,应该删去JMP ENDD JMP ENDD 删去 这一句 CALL JIANPAN MOV A,R1 MOV SBUF,A OUT: JNB TI,OUT

按键实验
用同样的方法,依次轮流送各列一次低电平,再轮流检测一次各行中是否有低电平。这样就可检测完 所有的按键,也就能判断出被按下的是哪一个键。 当然我们也可将各行线置低电平,然后扫描检测各列线中是否出现低电平, 这就是矩阵键盘检测的原理和方法。include <reg51.h> define uchr unsigned...

相似回答