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

51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续加减功能?... 51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续加减功能? 展开
 我来答
浮珈蓝祎0R
2019-05-14 · TA获得超过906个赞
知道答主
回答量:44
采纳率:80%
帮助的人:7.5万
展开全部
你好,我也遇到这样的问题,经过一周的研究,问之前的前辈得出结果,希望对你有帮助
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;//返回按键的值
}
以上代码,不带操作系统,不包含中断,请根据实际情况调整你想要的长按时间,按键按下的时候,如果你的消抖时间太长,数码管会有明显的闪烁或者变暗,请根据自己的需求进行调整
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
11kxmx
推荐于2018-05-09 · TA获得超过1.4万个赞
知道大有可为答主
回答量:1.2万
采纳率:70%
帮助的人:2482万
展开全部
不要检测按键是否抬起即可,但为了防止连续加得太快,所以程序里还是要加延时,这样造成
数码管显示闪烁,且这个延时和闪烁是一个矛盾
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);
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式