#include
#define uint unsigned int
#define uchar unsigned char
sbit key3=P3^2;//外部中断0的引脚接口
sbit led=P1^0;
uchar num,temp;
uchar keyscan();
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Int0Init()
{
IT0=1;//下降沿触发
//IE0=0;请求标志位,无触发,或响应中断后,硬件自动置0
EX0=1;//外部中断0允许标志
EA=1;//打开总终端
}
void LedRever() interrupt 0 //0是外部中断的中断号
{
delay(500);
if(key3==0xdb)
{
delay(8);
if(key3==0xdb)
{
led=~led;
while(key3==0xdb);
}
}
}
void main()
{
num=16;
while(1)
{
Int0Init();
keyscan();
}
}
uchar keyscan()
{
P3=0xef;
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f) //确认是否按下
{
delay(5);
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xee:num=0;
break;
case 0xed:num=1;
break;
case 0xeb:num=2;
break;
case 0xe7:num=3;
break;
}
while(temp!=0x0f) //松手检测
{
temp=P3;
temp=temp&0x0f;
}
}
}
P3=0xdf;
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xde:num=4;
break;
case 0xdd:num=5;
break;
case 0xdb:num=6;
break;
case 0xd7:num=7;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P3=0xbf;
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P3;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P3;
switch(temp)
{
case 0xbe:num=8;
break;
case 0xbd:num=9;
break;
case 0xbb:num=10;
break;
case 0xb7:num=11;
break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
}
}
P2=0x7f;
temp=P2;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P2;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P2;
switch(temp)
{
case 0x7e:num=12;
break;
case 0x7d:num=13;
break;
case 0x7b:num=14;
break;
case 0x77:num=15;
break;
}
while(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
}
}
}
return num;
}