怎么在中断中实现一个按键第一次按键之后,立刻切换到一个循环状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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倍。

相关文档
最新文档