文档库 最新最全的文档下载
当前位置:文档库 › 三种键盘扫描方法

三种键盘扫描方法


*********************根据程序要求选择不同的键盘扫描函数***********************

==============================================================================
=====此函数只获得键盘键值,还应加switch(value)判断键值 执行键盘对应的程序=====
==============================================================================

uchar keypro(void)
{
uchar scanl,scanh,i;
P1=0xf0;//先将所有行线拉低
if((P1&0xf0)!=0xf0) //如果列线有变化
{
delay();//延迟一段时间。
if((P1&0xf0)!=0xf0)//如果此时此刻列线还有变化,说明确实有按键按下
{
scanl=0xfe;//用变量保存下第一次发送的扫描码1111,1110
while((scanl&0x10)!=0)//如果四个行线被完整扫描一次还没有完成,就进入循环,继续扫描下一行
{
P1=scanl; //给P1口赋扫描码,每次只拉低一行
if((P1&0xf0)!=0xf0) //如果判断为真,则说明找到了按键按下的行
{
scanh=(P1&0xf0)|0x0f; //计算识别码
return (~scanh)+(~scanl); //返回识别码,识别码是根据上一条语句的算法计算好的,每个识别码对应一个按键,一共有16个识别码。
}
else scanl=(scanl<<1)|0x01; //否则依次将第二,第三,第四行拉低
/*
else {scanl=(scanl<<1)|0x01;i++;}
if(i==4) while((scanl&0x10)!=0);
*/
}
}
}
return 0;//没有按键 按下 返回0
}

==============================================================================
=====此函数只获得键盘键值,还应加switch(value)判断键值 执行键盘对应的程序=====
==============================================================================
uchar keyscan()
{
uchar temp,value;
P1=0xf0;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //行扫描
{
case 0x70:
value=0;break;
case 0xb0:
value=4;break;
case 0xd0:
value=8;break;
case 0xe0:
value=12;break;
}
}
P1=0x0f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp) //列扫描
{
case 0x70:
value+=0;break;
case 0xb0:
value+=1;break;
case 0xd0:
value+=2;break;
case 0xe0:
value+=3;break;
}
}
delay(10);
}
return value;
}


==============================================================================
==================即可获得键盘键值,也可以执行键盘映射的程序段================
==============================================================================

uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num

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

P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}


P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}


P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;

}

相关文档
相关文档 最新文档