为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2022-10-01 17:13:39
if(P1_0 == 0){Delay(10);//问题就在这里,你让CPU在这里空转?if(P1_0 == 0){//...add your code here.}}进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。有什么办法吗?呵呵,那是肯定的。解决方法大致有如下2种:1.将延时函数放在中断中,在中断里查询延时的标志位。/*不仅仅用于键盘识别,亦可以用于其他的延时代码.2.直接在中断中查询按键的标志位.这两种解决方法我没看懂,举个例解释一下,用定时器中断就能不浪费单片机内部资源吗?噢噢~~用中断的时候单片机可以做其他事情?百度是可以得到例子,但是要能解释清楚。谢谢。还有~什么叫查询按键的标志位?什么叫查询延时的标志位?
查看完整描述

2 回答

?
慕勒3428872

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也要处理时间反卷等具体细节了。


查看完整回答
反对 回复 2022-10-06
?
郎朗坤

TA贡献1921条经验 获得超9个赞

进入第1个if判断语句后,就进入了Delay(10);再看Delay函数,完全让CPU执行(;空语句),所以在做大的产品或者代码时,这个是非常耗费单片机内部资源的。

----这方法,适合于简单的、单任务的情况。

利用定时(如 10ms)中断,就可以轮流检测各个按键以及其它需要处理的任务的标志。
某一个条件满足了,就执行对应处理程序。
这样就可以实现:多任务操作。

轮流检测,就包括了:“查询按键的标志位”、“查询延时的标志位”。

就是说,检测到按键按下,还不应该立即处理,应该继续查询:它按了多少个10ms。
以此来判断:短按、长按、双击等等。
一般,还要检测到按键释放,再执行该键短按、长按、双击所对应的程序。


查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信