怎么在中断中实现一个按键第一次按键之后,立刻切换到一个循环状态。
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题的提出:怎么在中断中实现一个按键第一次按键之后,立刻切换到一个循环状态,然后同一个按键第二次按下时结束循环,回到中断入口?
疑难点:
1.中断是实时扫描的,但是中断中改变的状态量在主函数中却不能实时读取,这样不能达到立刻切换的目的。
2.如果把循环子函数放在中断中,那么仅仅用一个状态变量的话,是不可能时刻改变它的值的,因为在C中状态变量相当于一个存储器。
例子说明解答方法:
例子:想中断按键按下时,循环执行Led子函数,再次按下时,停止循环,回到主函数继续执行。
很多人是这样写的:
void int0(void)interrupt 0
{
if (k1==0)
{
delay_ms(10);
if(k1==0)
{
m=!m;
while(!k1);
while(m) Led();
}
}
}
这样写为什么不行呢?因为m状态量改变一次之后,若m==1,则进入while()循环,此后即使中断改变了m的值,但是while(m) Led();一直在进行while(1)循环,所以m即使再怎么改变,按键都不能复位到初始化状态。下面提出这样一串代码:
void int0(void)interrupt 0
{
if (k1==0)
{
delay_ms(10);
if(k1==0)
{
m=!m;
while(!k1);
while(k1&&m) Led();
}
}
}
这样因为K1按键弹出后立刻变为1,而k1它属于口线,并不是变量,所以实时改变,一旦按键再次按下时,K1变0,即可从while()中挑出,则程序会再次去读出m,此时将m值激活,则可达到再次按键初始化问题,并且反应比起在主函数中扫描要灵敏N倍。