单片机矩阵键盘扫描程序 没看懂求解释

main: mov p1,#0f0h 令行为低电平,全扫描字P1.0-P1.3,列为输入方式
mov r7,#0ffh 设置计数常数
key:djnz r7,key 延时
mov a,p1 读取P1口列值 问题1
anl a,#0f0h 判别有键按下吗? 问题2
cpl a 求反后,有高电平就有键按下 问题2
jz ekey 无键按下退出

问题一,读取P1口好像八个口全读了,不只四个列口啊。无键按下时读到的应该是0F0H啊
问题二,无键按下时,逻辑与得到结果还是0F0H啊,取反后0FH,一样有高电平啊,没看懂求解时。
各位高手帮忙时请举下例子解释
得到答案再加分
主要是第二个问题,无论按键与否,A中都不可能全为0,那么最后一步就无效了。求解释

楼主的疑问是正确的,程序需要修改:
main:
mov p1, #0f0h ;在P1.0~P1.3输出低电平.

mov r7, #0ffh ;
key:djnz r7, key ;延时.

mov a, p1 ;读P1,如有按键,高四位将有0

cpl a ;求反,有按键时,高四位将有1

anl a, #0f0h ;低四位置为0,高四位不变.

jz ekey ;全0就是没有按键,退出.
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-24
首先无按键按下时P1=0xf0;0xf0&0xf0,a还是0xf0,所以你这部anl a,#0f0h改为ORL a,#00fh才符合你下面的要求 求反后,有高电平就有键按下修改后无按键按下,P1=0xf0;0xf0|0x0f,a=0xff,取反后0x00;有按键按下,如P1=01110000,则01110000|00001111,a等于0111111,取反10000000追问

这个程序不是我编的,是北航李朝青编的书上写的。

第2个回答  2011-07-24
我自己学的一个,你看看吧
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//sbit dula=P2^6;
sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
void delayms(uint);
void main()
{

a=0;
b=0;
c=0;

while(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{

delayms(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7e:num=0;
break;

case 0xbe:num=1;
break;

case 0xde:num=2;
break;

case 0xee:num=3;
break;
}

while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}

}
}

P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{

delayms(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7d:num=4;
break;

case 0xbd:num=5;
break;

case 0xdd:num=6;
break;

case 0xed:num=7;
break;
}

while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}

}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{

delayms(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7b:num=8;
break;

case 0xbb:num=9;
break;

case 0xdb:num=10;
break;

case 0xeb:num=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}

}
}

P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{

delayms(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x77:num=12;

break;

case 0xb7:num=13;

break;

case 0xd7:num=14;

break;

case 0xe7:num=15;

break;

}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}

}
}

dula=1;
P0=table[num];
dula=0;

}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);

}
第3个回答  2011-07-24
四列四行共八个。先行全部置低,通过列的高低判断按下的键值。
F0即11110000,当按下一个键值是即变为11100000,或11010000,或10110000,或0111000即可得到相应键值。追问

你这是第一个问题,第二个呢?逻辑与后呢,A的结果可能是11110000,11100000,11010000,10110000,01110000,无论怎样取反,A都有高电平,最后一步就无效了。

51单片机键盘矩阵扫描代码的理解
MOV P2,A 是把扫描码赋给P2口,其实是赋给P2口的低四位,进行扫描;MOV A,P2 是读取P2口的值,后面一句把低四位屏蔽了,最终还是读取了高四位

矩阵键盘扫描程序分析
矩形键盘扫描程序分析如下:1、在键盘中按键数量较多时,通常将按键排列成矩阵形式,在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接;2、一个端口就可构成16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键...

C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!
1、首先判断整个键盘有无按下键,只要行扫描线输入不为全1,(1111)即有键按下;P1 = 0xf0;if((P1&0xf0)!=0xf0) 如果无按键按下,全1,则返回return -1;如果有键按下则延时,再次判断有无按键按下,Delay();if((P1&0xf0)!=0xf0)如果无按键按下则返回return -1。有键按下则继续,...

单片机4×4矩阵键盘扫描编程问题(里面详细,欢迎高手)
扫描第一行,就是将第一行电平置为低电平,其他的都为高,扫描哪一行就让哪一行的电平置零,其他行为高电平。这就是第一个问题。在没有键按下的时候,列线全部是高电平,有第一行的键按下的时候,相应的列线就为低电平了,n=P1;n&=0xf0;if(n!=0xf0)这几句就是判断有没有键按下。在第...

单片机高手,帮我看看这个反转发循环扫描矩阵键盘程序,帮我详细的解释哈...
以S10被按下为例说明:uchar keyscan(void) \/\/键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;\/\/行列值中间变量 P3=0x0f; \/\/行线输出全为0 cord_h=P3&0x0f; \/\/读入列线值 if(cord_h!=0x0f) \/\/先检测有无按键按下,如果cord_h=0x0f说明无键按下 { delay(...

有木有大神啊,这是51单片机矩阵键盘的一个程序,其中的那个松手检测没...
单片机默认都是1。按键都是0。所以按下去单片机自然就是0。如果你检测是1的话。那你的按键就没有按下去。

求单片机大神讲解一下程序啊 ,组合按键值为什么要取反
1.拉高列线,拉低行线 假设为0xf0,此时扫描列线,若按键按下,则对应的列线被拉低了,此时我们可以确定列线,但不清楚对应哪个行线 2.拉高行线,拉低列线(相反),此时扫描可以得出具体行线,在将行列组合,就能得出对应按键 case 0x11. (由于按键检测是低电平,所以需要取反)实际上应该是...

51单片机矩阵键盘扫描程序,怎样判断当前按键式第几行的?
p3=fe就是扫描第一行,然后&上f0就是屏蔽低位高位不等于f0则有建按下,后面你那个12345678……就是第几个建,如你的例子,=ed的时候是发生在p3=fd的程序,fd是第二行手机打字欢迎追问

单片机矩阵键盘反转扫描问题
1、A&B|B=(A&B)|B&(A|NOT A)=A&B)|(A&B)|notA & B =B 2、由于单片机的计算速度是微妙级的,所以在执行 while((KeyPort&0xf0)!=0xf0);之前可以认为按键都是被按下的,这样的话,由于被按下,即使人为的给KeyPort复值,他的有效周期大约只有一条语句的时间,之后便会被硬件还原 如...

单片机矩阵键盘检测的疑问
temp=temp&0xf0;\/\/这三句跟上面重复,功能是软件消抖 while(temp!=0xf0) \/\/延时一段时间后判断还有按键按下,说明是真有按键按下,进入按键扫描与键值的判断,否则可能是意外抖动引起的,就不进行按键扫描。{ temp=P3;switch(temp)...我想注释完应该能读懂,关键是要理解矩阵键盘的扫描原理。

相似回答