#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
uchar data1[]={5,9}; //保存倒计时初始值
sbit a=P1^0; //设置键
sbit b=P1^1; //增一键
sbit c=P1^2; // 减一键
sbit d=P1^3; // 确定键
sbit e=P3^0; //控制LED发光
sbit f=P3^2;
void keyscan();
void display();
void delayms(uint t)
{
uint a,b;
for(a=t;a>0;a--)
for(b=125;b>0;b--);
}
void display() //数码管显示函数
{
uchar i;
P2=0X01;
for(i=0;i<2;i++)
{
P0=table[data1[i]];
P2=~(P2<<i);
delayms(2);
P2=~P2;
}
while(!(data1[1]||data1[0])) //当倒计时到0时点亮LED,停止计时
{
TR0=0;
e=0;
f=0;
P2=0XFC;
P0=0X3F;
}
}
void main()
{
// delayms(1);
TMOD=0x01;
ET0=1;
EA=1;
TH0=0X3C;
TL0=0XB0;
TR0=1;
while(1)
{
keyscan();
display();
}
}
void timer0() interrupt 1 using 0
{
uchar count;
count++;
if(count==20)
{
count=0;
data1[1]--;
if(data1[1]==-1)
{
data1[1]=9;
data1[0]--;
}
}
else
TH0=0X3C;
TL0=0XB0;
}
void keyscan()
{
uchar num;
if(a==0)
{
delayms(10);
if(a==0)
{
TR0=0;
num++;
}
}
while(a==0);//松手检测
if(num==1)
{
if(b==0)
{
delayms(5);
if(b==0)
{
while(!b)
{
display();
}
data1[1]++;
if(data1[1]==10)
{
data1[1]=0;
data1[0]++;
if(data1[0]==6)
data1[0]=1;
}
}
}
if(c==0)
{
delayms(10);
if(c==0)
{
while(!c);
data1[1]--;
if(data1[1]==255)
{
data1[1]=9;
data1[0]--;
}
}
}
}
if(d==0)
{
TR0=1;
num=0;
}
}
当每次按下按键时,左侧数码管都会抖动一次,如何改程序能克服抖动,电路图如下,如果必要的话可以改电路图