在进行键盘扫描的时候,我把矩阵键盘和独立键盘同时扫描,结果,按下矩阵键盘没有出错,但按下独立键盘则出错了,每次按下独立健得到的值都不一样,请教解决方法
#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}; //0-9&A-F&“不显示” 字型码
void delay(uint xms) //延迟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 keyscan()
{
uchar temp,key;
////////////////////////第一行扫描///////////////
P3=0xfe;//1111 1110,让P3.0口输出低电平
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee://1110 1110
key=7;
// flag_num=1;//数字键标记置1
break;
case 0xde:
key=8;//1101 1110
// flag_num=1;
break;
case 0xbe:
key=9;//1011 1110
// flag_num=1;
break;
case 0x7e:
key=11;//代表加法,0111 1110
// flag_jia1=1;//第一个加法标记位置1
// flag_first_yunshuanjian=1;//第一个运算键存在标记置1
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
//FM=0;
}
//FM=1;
}
}
/////////////////////////////第二行扫描//////////////////
P3=0xfd;//111 1101
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed://1110 1101
key=4;
// flag_num=1;
break;
case 0xdd://1101 1101
key=5;
// flag_num=1;
break;
case 0xbd://1011 1101
key=6;
// flag_num=1;
break;
case 0x7d://0111 1101
key=12;//代表减法
// flag_jian1=1;
// flag_first_yunshuanjian=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
// FM=0;
}
// FM=1;
}
}
///////////////////////第三行扫描/////////////////////////////////
P3=0xfb;//1111 1011
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb://1110 1011
key=1; //突然想到这里key是字符型
// flag_num=1;
break;
case 0xdb://1101 1011
key=2;
// flag_num=1;
break;
case 0xbb://1011 1011
key=3;
// flag_num=1;
break;
case 0x7b://0111 1011
key=13;//代表乘法
// flag_cheng1=1;
// flag_first_yunshuanjian=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
// FM=0;
}
//FM=1;
}
}
/////////////////////////第四行扫描///////////////////////////////
P3=0xf7;//1111 0111
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=15;//代表清零
// flag_clear=1;//清零标记位置1
break;
case 0xd7:
key=0;
// flag_num=1;
break;
case 0xb7:
key=16;//代表等号
// flag_deng=1;//等号标记位置1
break;
case 0x77:
key=14;//代表除号
// flag_chu1=1;
// flag_first_yunshuanjian=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
// FM=0;
}
// FM=1;
}
}
/////////////////////////独立键盘扫描/////////////////////
/*temp=P3;//读取P3的状态存进temp
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
//temp=P3;
switch(temp)
{
case 0xe0://1110 0000
key=1;//代表独立键盘k1键
// flag_k1=1;
break;
case 0xd0://1101 0000
key=2;//代表独立键盘k2键
// flag_k2=1;
break;
case 0xb0://1011 0000
key=3;//代表独立键盘k3键
// flag_k3=1;
break;//0111 0000
case 0x70:
key=4;//代表独立键盘k4键
// flag_k4=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
FM=0;
}
FM=1;
}
}*/
temp=P3&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3&0xf0;
if(temp!=0xf0)
{ //temp=P3
switch(temp)
{
case 0xe0://1110 0000
key=1;//代表独立键盘k1键
// flag_k1=1;
break;
case 0xd0://1101 0000
key=2;//代表独立键盘k2键
// flag_k2=1;
break;
case 0xb0://1011 0000
key=3;//代表独立键盘k3键
// flag_k3=1;
break;//0111 0000
case 0x70:
key=4;//代表独立键盘k4键
// flag_k4=1;
break;
}
}
}
display(key);
}
void main()
{
bstv51_init(); //学习板初始化
P0=0; //位选 锁存为8位同时显示
WE=1;
WE=0;
while(1)
{
keyscan();
}
}