用单片机控制数码管显示按键次数

/**************数码管显示按键数**************/
# include <REGX51.H>
unsigned char Tab_seg[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char Tab_wei[2] = {0x01,0x02};unsigned char disbuff[2];
sbit Key = P1^0;//unsigned int cnt_key;
void delayms(unsigned int x);void dis_to_change();void KeyScan();void num_to_dis();
void main(){ while(1) {
num_to_dis(); KeyScan(); dis_to_change(); }
}
void delayms(unsigned int x){
char i;
while(x--) for(i=0;i<120;i++) {;}
}
void KeyScan(){
extern unsigned char cnt_key; if(Key==0) { delayms(20);
if(Key==0) {
while(!Key); cnt_key++; if(cnt_key>99) cnt_key = 0;
}
}
}
unsigned char cnt_key;
void dis_to_change(){ disbuff[0] = cnt_key/10; disbuff[1] = cnt_key%10;
}
void num_to_dis(){ char i,j;
for(i=0;i<2;i++) {
P2 = Tab_wei[i]; P0 = ~Tab_seg[disbuff[i]]; delayms(5);// j++;// if(j>20)// j = 0; }
}
各位高手,这个程序为什么每按下一次按键,十位就跳动一下呢(两个连在一起的数码管)?求指教。。。
因为你这是在主函数里面实现的动态显示啊,当没有按键按下时,不用执行按键去抖的20ms时间,所以程序很快就执行完。这时数码管扫描并不会出现问题。

但是,当有按键按下后,要执行20ms的去抖,完成后才往下执行,这20ms的延时,对数码管动态显示来说,是很危险的,会出现显示不正常。

你这个程序,最渣帆好改成用定时器中断扫描,这样就不会产生类似的问题了运历。

你这个程序非要这样写,那你如悄雹在按键扫描里面,也应该放上数码管显示程序,让数码管扫描间隔减小,至少要小于20ms才行。
按键子函数里的防抖delayms(20);使每次按下按键时凳御延时了20ms,这个时间里岁宴不运行显示子函数,所以十位会跳一下(应该个位也跳),只是个位在切换数字,乎粗银感觉不明显。如果你按住热键不放,显示是灭的。
解决办法可以多次调用显示子函数来得到延时时间delayms(20);
键盘扫描好斗时右一个20毫裤袜扮秒的延时,这个程序影响到了显示效果,如果要避免这种想象,可以将显示程序放在定时中断中胡灶。