2 回答
TA贡献1848条经验 获得超6个赞
2级,希望你能认真看了并采纳,毕竟这问题挺复杂,说起来麻烦。
原文并没有说的完全对,这么做也是没有大错的。
它两次判别P1-1的状态,中间Delay(10),不过是防抖而已,就是说,第一次检测到按键按下,并且过了一段时间发现还是按下状态,那么就认为是按键动作,而不是干扰造成的。
一般来说这个时间是100ms左右到150ms左右,所以要有这么一段时间被delay做不了事情。但是这种干扰不多,所以大部分时间是跳过的。需要按键触发的程序,100ms左右不做事情也不是什么大事。
但真要求严格了,比如说每50ms必须有些事儿要处理,不能有这种干扰,那么就放在中断里,什么中断?原文没讲清楚,应该是时间中断,比如每隔100ms一次。中断里写
if(P1_0 == 0)
{
if(i == 0)
i = 1;
else{ 你的代码}
}
else
{
i = 0;
}
这样就行了。从初始化到判别,到误判清零都有了,i应该是个全局变量,中断可以访问的,或者是个const的也可以
但是这么做也并不很好,所以更高效的是做一个自己的时间系统,即
中断每1ms一次,有个变量做时间,假设叫做MyTimer,那么中断里
MyTimer ++; 就可以
然后你判别的程序就写成,
if(p1_1 == 0)
{
if(pressed == 0)
LastTime = MyTimer;
else
if(MyTimer - LastTimer > 100)
{
your code
}
}
else{
pressed = 0;
}
当然你的代码里要处理状态复位,清零,停止判别P1_1等具体事情,而MyTimer-LastTimer也要处理时间反卷等具体细节了。
TA贡献1921条经验 获得超9个赞
进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。
----这方法,适合于简单的、单任务的情况。
利用定时(如 10ms)中断,就可以轮流检测各个按键以及其它需要处理的任务的标志。
某一个条件满足了,就执行对应处理程序。
这样就可以实现:多任务操作。
轮流检测,就包括了:“查询按键的标志位”、“查询延时的标志位”。
就是说,检测到按键按下,还不应该立即处理,应该继续查询:它按了多少个10ms。
以此来判断:短按、长按、双击等等。
一般,还要检测到按键释放,再执行该键短按、长按、双击所对应的程序。
- 2 回答
- 0 关注
- 204 浏览
添加回答
举报