个人认为问题出在你的延时上,delay(10)最多按1200个指令周期计算,即使你是51的单片机12T的,用12mhz的晶振的话,delay(10)才1.2ms,这个时间过于短,起不到消抖的作用,因为你按一下按键怎么也得300ms左右吧,你的key_scanf就工作了不知道多少次,也就造成了每次不一定蹦几个数的现象,有一个办法,
int key_scanf(uint s)
{
if(s==1)
{
if(key1==1&&key==1)
{
delay(1000);
if(key1==1&&key2==1)s=0;
}
}
if(s==0&&key1==0)
{
delay(10);
if(key1==0)
{
s=1;
if(aa==0)
aa=9999; //四位数,如果到了0,到最大
else aa--; //否则,减一
}
}
if(s==0&&key2==0)
{
delay(10);
if(key2==0)
{
s=1;
if(aa==9999)
aa=0; //四位数,如果到了最大,归零
else aa++; //否则,加一
}
}
}if(key1==0)
{
delay(10);
if(key1==0)
{
if(aa==0)
aa=9999; //四位数,如果到了0,到最大
else aa--; //否则,减一
}
return s;
}
void main()
{
uint s=0;
while(1)
{
qian=aa/1000;
bai=aa%1000/100;
shi=aa%1000%100/10;
ge=aa%1000%100%10;
s=key_scanf(s); //调用按键函数
display(); //显示
}
}