矩阵键盘检测,求解,程序自己写的,按键没反应。

#include<reg52.h>
#include<74hc595.h>
#include<boardinit.h>
#include<delay.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^6;
sbit dula=P2^5;
uchar num,temp;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

void display(uchar aa)
{
dula=1;
P0=table[aa];
dula=0;
}

void keycan()
{
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 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;
}
display(num);

}
}

P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(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;
}
display(num);

}
}

P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(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;
}
display(num);

}
}

P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(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;
}
display(num);

}
}
}

void main()
{
boardinit();
dula=1;
P0=0xff;
dula=0;
P0=0x00;
wela=1;
wela=0xff;
wela=0;

while(1)
{
keycan();
}
}

第1个回答  2014-02-07
/*试试这个我自己写的现在还在用*/
#include<AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
sbit we=P1^3;//一位数码管显示
unsigned char codesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
void delay_50us(uintt)
{
uint j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void main()
{
uchar key_1,key_h;
uchar key;
while(1)
{
we=0;//
P0=0;
P2=0xf0;//11110000
key_1=P2;
key_1=key_1&0xf0;
if(key_1!=0xf0)
{
delay_50us(100);//延时
if(key_1!=0xf0)
{
key_1=P2&0xf0;//11100000
key_1=key_1|0xf0;//11101111
P2=key_1;
key_h=P2;
key_h=key_h&0x0f;//00001110
key_1=key_1&0xf0;//11100000
key=key_h+key_1; //11101110
}
}
}
switch (key)
{
case 0xee:P0=smg_du[0];break;
case 0xde:P0=smg_du[1];break;
case 0xbe:P0=smg_du[2];break;
case 0x7e:P0=smg_du[3];break;
case 0xed:P0=smg_du[4];break;
case 0xdd:P0=smg_du[5];break;
case 0xbd:P0=smg_du[6];break;
case 0x7d:P0=smg_du[7];break;
case 0xeb:P0=smg_du[8];break;
case 0xdb:P0=smg_du[9];break;
case 0xbb:P0=smg_du[10];break;
case 0x7b:P0=smg_du[11];break;
case 0xe7:P0=smg_du[12];break;
case 0xd7:P0=smg_du[13];break;
case 0xb7:P0=smg_du[14];break;
case 0x77:P0=smg_du[15];break;
}

}

#include"AT89X52.H"//头文件
#define uint unsignedint//定义uint型延时子函数
#define bianliangunsigned char//定义bianliang=char型变量
bianliang num;aa;//定义变量num,temp
sbit wela=P1^3;//定义个位
bianliang codeshuoma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0xc6};
void yanshi(uintz);//声明延时子函数
void main()//进入主程序
{
P0=0xc0;
wela=0;
while(1)
{
P2=0xfe;//定义键盘第1行
aa=P2;//变量temp=P2口
aa=aa&0xf0;//用于temp和temp&0xf0向于
while(aa!=0xf0)//判断是否有键按下(temp!不等于=0xf0)
{
yanshi(5);//延时5毫秒
aa=P2;//temp=P2
aa=aa&0xf0;//再次//用于temp和temp&0xf0向于
while(aa!=0xf0)//再次//用于temp和temp&0xf0向于
{
aa=P2;//temp=P2
switch(aa)//temp!不等于=0xf0判断(temp)=是否=2,3,4,11
{
case0xee:num=2;//数码管段选第2位
break;//退出
case0xde:num=3;//数码管段选第3位
break;//退出
case0xbe:num=4;//数码管段选第4位
break;//退出
case0x7e:num=11;//数码管段选第11位
break;//退出
}
while(aa!=0xf0)//再次//判断是否有键按下(temp!不等于=0xf0)
{ // while(temp!=0xf0)用于条跳到2行
aa=P2;//temp=P2
aa=aa&0xf0;//再次//用于temp和temp&0xf0向于
}
P0=shuoma[num-1];//数码管段选-1位
}

}

P2=0xfd;//定义键盘第2行
aa=P2;
aa=aa&0xf0;
while(aa!=0xf0)
{
yanshi(5);
aa=P2;
aa=aa&0xf0;
while(aa!=0xf0)
{
aa=P2;
switch(aa)
{
case0xed:num=5;
break;
case0xdd:num=6;
break;
case0xbd:num=7;
break;
case0x7d:num=11;
break;
}
while(aa!=0xf0)
{
aa=P2;
aa=aa&0xf0;
}
P0=shuoma[num-1];
}

}

P2=0xfb;//定义键盘第3行
aa=P2;
aa=aa&0xf0;
while(aa!=0xf0)
{
yanshi(5);
aa=P2;
aa=aa&0xf0;
while(aa!=0xf0)
{
aa=P2;
switch(aa)
{
case0xeb:num=8;
break;
case0xdb:num=9;
break;
case0xbb:num=10;
break;
case0x7b:num=11;
break;
}
while(aa!=0xf0)
{
aa=P2;
aa=aa&0xf0;
}
P0=shuoma[num-1];
}

}

P2=0xf7;//定义键盘第4行
aa=P2;
aa=aa&0xf0;
while(aa!=0xf0)
{
yanshi(5);
aa=P2;
aa=aa&0xf0;
while(aa!=0xf0)
{
aa=P2;
switch(aa)
{
case0xe7:num=11;
break;
case0xd7:num=1;
break;
case0xb7:num=11;
break;
case0x77:num=11;
break;
}
while(aa!=0xf0)
{
aa=P2;
aa=aa&0xf0;
}
P0=shuoma[num-1];
}

}

}

}
void yanshi(uint z)//延时子函数
{
uint x,y;//延时定义
for(x=z;x>0;x--)
for(y=123;y>0;y--);//延时
}本回答被提问者采纳
第2个回答  2014-02-04
把头文件代码发出来看看
第3个回答  2014-02-04
boardinit();???追问

这个没错,正确的初始化程序

追答

在你给出的程序里面没有定义

追问

头文件都没问题

追答

变量的初值和运行之后的清零呢

矩阵键盘检测,求解,程序自己写的,按键没反应。
void yanshi(uintz);\/\/声明延时子函数void main()\/\/进入主程序{ P0=0xc0; wela=0; while(1) { P2=0xfe;\/\/定义键盘第1行 aa=P2;\/\/变量temp=P2口 aa=aa&0xf0;\/\/用于temp和temp&0xf0向于 while(aa!=0xf0)\/\/判断是否有键按下(temp!不等于=0xf0) { yanshi(5);\/\/延时5毫秒 aa=P2;\/\/tem...

矩阵键盘按键不灵敏是什么问题?
一般的键盘去抖程序是 检测--延时--检测,第一次检测都可以检测一行或一列,第二次读按键值;如果逻辑正确的话,不应该有哪个按键不响应。先自己查查。没看懂你的程序,全部程序都贴出来看看。

使用如图矩阵键盘,ATMEGA16A单片机,键盘没有反应怎么解决?
一般来说,如图的按键相当于开关,而开关是没有电阻的。你的试验已经说明开关有电阻,这表明开关已经失效。

51单片机矩4X4阵键盘的第一排按键没反应。
你仔细看一下资料就会发现这个问题是开发板的问题,就是他用到的一个芯片会把单片机P3口的某个引脚置高,导致键盘不好使,解决方法是下载完程序之后拔掉下载USB线,只保留供电USB线再做测试

单片机的矩阵键盘检测,扫描程序已经写出来了,怎么显示呢
MOV A,R1 ;R1中是要显示的十进制 MOV DPTR,#TABEL ;使DPTR 指向TABEL(TABEL 中 是10进制对应的16进制表格)MOVC A,@A+DPTR;查表 MOV P2,A ;此时A中即是 16进制 ;---LED的 共阴码表--- TABEL:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0123456789 DB 77H,7CH...

解释一下单片机实验中“抖动”,矩阵键盘实验按键后不能及时响应是不是...
不是抖动,而是 延时!!抖动引起的现象是:①太灵敏,按一下,似乎按了上百次。②误动作,没按,自己就动了。延时引起的现象是:①反应迟钝,按了没反应,或者按久一点才能动。②相互影响,这个的按键按下,其他按键就用不了了。

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

单片机矩形键盘扫描程序那里出问题了?
=0xf0)) delay(10);\/\/检测按键抬起 (b<50)可能是对最长检测时间做限制 但是在所给程序部分没有定义和副初值 所以添加变量定义语句{dis_buf=M; \/\/键值入显示缓存dis_buf=dis_buf&0x0f;}}}\/\/通过循环调用keyscan得到按键信息其实这种键盘,可以先计算出键码码值,再通过查表获取键值,这样...

矩阵键盘的按键识别方法
1、判断键盘中有无键按下 将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键...

矩阵键盘检测求助
while(temp!=0xf0) \/\/等待按键释放 { temp=P3; temp=temp&0xf0; display(bai,shi,ge); \/\/--加上这句 } 等待释放,另外还有几处,每一处,都应该加上显示。

相似回答