#include <reg51.h>
unsigned char key=0xff;
unsigned int _tt1=0;
unsigned char _tt2=0;
unsigned char _tt3=0;
unsigned char p1reg=0xff;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
sbit p37=P3^7;
/*TO中断服务子程序 */
void timer0(void) interrupt 1 using 2
{
TH0=-2000/256;
TL0=-2000%256;
_tt2++;
_tt3++;
if((P1^p1reg)&&(P1!=0xff)) /*下降沿*/
{
_tt1++;
key=P1;
key=~key;
if(_tt1>10000)
{ _tt1=10000;
if((P1^p1reg)&&(P1!=0xff))
{ if (_tt3>50)
{ switch(key)
{ case 1:p20=!p20;break;
case 2:p21=!p21;break;
case 4:p22=!p22;break;
case 8:p23=!p23;break;
default :break;
}
_tt3=0;
}
}
}
else if(_tt1==20)
{ _tt1=20;
switch(key)
{ case 1:p20=!p20;break;
case 2:p21=!p21;break;
case 4:p22=!p22;break;
case 8:p23=!p23;break;
default :break;
}
}
}
else _tt1=0;
if (P1==0xff) p1reg=P1;
}
/*T0中断设置 2ms*/
void sett0()
{
TH0=-2000/256;
TL0=-2000%256;
TMOD=0x01; /*T0方式1*/
EA=1;
ET0=1;
TR0=1; /*启动订时器T0*/
}
/*指示灯子程序*/
void led()
{
if(_tt2>100)
{ p37=!p37;
_tt2=0;
}
}
/* 调用子程序*/
void main()
{
P1=0xff;
P2=0xff;
p37=1 ;
sett0();
while(1) led();
}