回复本帖可获得 2 黑币奖励! 每人限 1 次
以前从来没有人教过这些,后来真正做产品的时候慢慢理解了,程序中绝对不用while或delay(),可以想象整个程序就像一个车轮,一直在转圈圈,4ms转一圈,所有功能4ms执行一次,如果中途有while那么车轮就会卡顿卡顿,如果需要延时可以用一个变量进行计数,计数到100次后就执行相应的程序,比如如果是4ms转一圈,那么100次就等于400ms的延时了,这样就不会影响其他程序的执行。
我自己的经验是:在定时里做一个4ms的标志位,主程序里面用这个4ms扫描一次按键,有按下,计数++,无按下计数清零,加一个按下松开标志位,按下计数达到3次(消抖值)后判为成功按下并且按下松开标志位=1,未松开就不做第二次按下计数;写的有点乱,写个伪代码:
定时器中断函数()
{//假设定时中断时间是250us
4ms计数++;
if(4ms计数 >= 16)//4ms/250us=16
{
4ms计数 = 0;
4ms标志位 = 1;
}
}
main()
{
while(1)
{
if(4ms标志位)
{
4ms标志位 = 0;
keypress();
其他功能函数();
}
}
}
void keypress()
{
if(按键io口 == 0)//假设低电平为按下
{
if(按下松开flag == 0)
{
按下计数++;
if(按下计数 >= 5)
{
按下计数 = 0;
按下松开flag = 1;
//按键按下
}
}
}
else
{
按下计数 = 0;
按下松开flag = 0;//松开后标志位清零,可以检测下一次按键
}
}