#include<reg52.h>
#define KEY P2
#define uchar unsigned char
#define uint unsigned int
uchar k;
uchar code led_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar code key_code[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,
0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
uchar dis[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
uchar code act[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{for(j=0;j<121;j++);}
}
uchar keyscan()
{
uchar X,Y,Z,j;
KEY=0xff;
KEY=0x0f;//先对KEY置数,行扫描
if(KEY!=0x0f)//判断是否有键按下
{
delay(10);//延时,软件去抖动(干扰)
if(KEY!=0x0f)//确认按键按下
{
X=KEY;//保存行扫描时有键按下的状态
KEY=0xf0;//列扫描
Y=KEY;//保存列扫描有键按下的状态
Z=X|Y;//取出键值
for(j=0;j<=15;j++)
{
if(Z==key_code[j])//查表得键值
{ k=j;
dis[5]=dis[4];
dis[4]=dis[3];
dis[3]=dis[2];
dis[2]=dis[1];
dis[1]=dis[0];
dis[0]=led_data[k];
if(KEY!=0x0f)
display();
return(k);}
}
}
}
else KEY=0xff;
return(16);
}
display()
{
P0=dis[5];P1=act[5];delay(1);
P0=dis[4];P1=act[4];delay(1);
P0=dis[3];P1=act[3];delay(1);
P0=dis[2];P1=act[2];delay(1);
P0=dis[1];P1=act[1];delay(1);
P0=dis[0];P1=act[0];delay(1);
}
void main()
{
while(1)
{
keyscan();
display();
}
}