可以将延时函数放在中断中……方法解释一下?

if(P1_0 == 0)
{
Delay(10);//问题就在这里,你让CPU在这里空转?
if(P1_0 == 0)
{
//...add your code here.
}
}
进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。有什么办法吗?呵呵,那是肯定的。
解决方法大致有如下2种:
1.将延时函数放在中断中,在中断里查询延时的标志位。/*不仅仅用于键盘识别,亦可以用于其他的延时代码.
2.直接在中断中查询按键的标志位.

这两种解决方法我没看懂,
举个例解释一下,用定时器中断就能不浪费单片机内部资源吗?噢噢~~用中断的时候单片机可以做其他事情?百度是可以得到例子,但是要能解释清楚。谢谢。
还有~
什么叫查询按键的标志位?
什么叫查询延时的标志位?

炎炎设计
浏览 205回答 2
2回答

慕勒3428872

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;elseif(MyTimer - LastTimer > 100){your code}}else{pressed = 0;}当然你的代码里要处理状态复位,清零,停止判别P1_1等具体事情,而MyTimer-LastTimer也要处理时间反卷等具体细节了。

郎朗坤

进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。----这方法,适合于简单的、单任务的情况。利用定时(如 10ms)中断,就可以轮流检测各个按键以及其它需要处理的任务的标志。某一个条件满足了,就执行对应处理程序。这样就可以实现:多任务操作。轮流检测,就包括了:“查询按键的标志位”、“查询延时的标志位”。就是说,检测到按键按下,还不应该立即处理,应该继续查询:它按了多少个10ms。以此来判断:短按、长按、双击等等。一般,还要检测到按键释放,再执行该键短按、长按、双击所对应的程序。
打开App,查看更多内容
随时随地看视频慕课网APP