51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续

51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续加减功能?

第1个回答  2019-05-14
你好,我也遇到这样的问题,经过一周的研究,问之前的前辈得出结果,希望对你有帮助
char scan_k(char k)
{
int i=0;//定义一个变量用来累计长按的时间
if((KEY1&&KEY2&&KEY3&&KEY4&&KEY5&&KEY6)==0)//如果有按键按下
{
while(!KEY1)//如果按键1按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=11;//按键1长按
}
else
{
k=1;//按键1短按
}

}
i=0;
while(!KEY2)//如果按键2按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=21;//按键2长按
}
else
{
k=2;//按键2短按
}

}
i=0;//在下一个按键按下之前清空i的值
while(!KEY3)//如果按键3按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=31;//按键3长按
}
else
{
k=3;//按键3短按
}

}
i=0;
while(!KEY4)//如果按键4按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=41;//按键4长按
}
else
{
k=4;//按键4短按
}

}
i=0;
while(!KEY5)//如果按键5按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=51;//按键5长按
}
else
{
k=5;//按键5短按
}

}
i=0;
while(!KEY6)//如果按键6按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=61;//按键6长按
}
else
{
k=6;//按键6短按
}

}
i=0;

}
return k;//返回按键的值
}
以上代码,不带操作系统,不包含中断,请根据实际情况调整你想要的长按时间,按键按下的时候,如果你的消抖时间太长,数码管会有明显的闪烁或者变暗,请根据自己的需求进行调整
第2个回答  推荐于2018-05-09
不要检测按键是否抬起即可,但为了防止连续加得太快,所以程序里还是要加延时,这样造成
数码管显示闪烁,且这个延时和闪烁是一个矛盾
if(key==0)
{
delay_ms(20);//加大延时,连续加的速度降低,但数码管可能闪烁
//如果减小延时,数码管不闪烁,但数字变化太快,人眼根本无法分辨
if(key==0)
{
num++;
}
}
display(num);

当然也好可以将延时函数换成显示函数,即显示又延时,配合好的话可以两者兼顾
f(key==0)
{
display(num);
if(key==0)
{
num++;
}
}
display(num);display(num);本回答被网友采纳
相似回答