单片机按键计数程序求助,在网上找了一个按键计数程序,显示操作都正常,只是有时会按一次加2次,请高手帮忙加上按争键防抖。
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
sbit sw1=P3^4;
sbit sw2=P3^5;
sbit sw3=P3^6;
sbit e0=P2^0;
sbit e1=P2^1;
sbit e2=P2^2;
sbit e3=P2^3;
u8 ds[4]={0,0,0,0};
u16 num=0;
u8 code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};
u8 ajsm()
{
static u16 ms;
if(sw3==0)
{
if(++ms==1)
{
return 1;
}
}
else
{
ms=0;
}
return 0;
}
void xs()
{
static u8 a;
a++;
if(a>3)a=0;
e0=1;
e1=1;
e2=1;
e3=1;
P0=table[ds[a]];
switch(a)
{
case 0:
{
e0=0;
e1=1;
e2=1;
e3=1;
}
break;
case 1:
{
e0=1;
e1=0;
e2=1;
e3=1;
}
break;
case 2:
{
e0=1;
e1=1;
e2=0;
e3=1;
}
break;
case 3:
{
e0=1;
e1=1;
e2=1;
e3=0;
}
break;
}
}
void main()
{
TMOD=0x66;
TH0=0xff;
TL0=0xff;
TH1=0xff;
TL1=0xff;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
while(1)
{
ds[0]=num/1000%10;
ds[1]=num/100%10;
ds[2]=num/10%10;
ds[3]=num%10;
xs();
if(ajsm())
{
num=0;
}
}
}
void time0()interrupt 1
{
if(num<9999)num++;
}
void time1()interrupt 3
{
if(num>0)num–;
}