当你持续按住一个键,整个单片机就像断电了一样(或者叫短路了)
所以,按键一般都需要延迟(还有一个作用是防止按键抖动)
还有,代码里没有指定TMOD的值,这个习惯不好
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。但不知,你这提问是想帮你写程序昵,还是帮你分析中断程序的写法。
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也要处理时间反卷等具体细节了。
你问题里的原文不用看了,有诸多问题。而我写的这个是多年经验总结实践而来。虽然写的简单,原理是相当正确的。你可以参考
时间触发嵌入式系统设计模式 一书,里面针对这种问题讲的非常深入。作者是Pont Michael J.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)