1.中断函数概念
上一讲里,当赋值IT0为1时,P3.2遇到下降沿,IE0被置1,要想使IE0自动清零,我们引用中断函数就可以了。
我们可能已经习惯了都是在main函数里阅读分析代码,其实还有另一种函数需要我们认识的,那就是中断函数。所谓中断函数就是当它满足一定的条件时就会暂停主函数的执行内容,转而去执行中断函数。关于这个概念网上很多说法都已经讲解的很详细了,这里点一下即可。
因为我们擅长的是从实践中领悟真理,所以后面我们尽量用例程去理解中断函数。
2.中断函数的书写
中断函数与其他我们封装过的子函数的写法不同,有个区分标志“interrupt”。
至于后面为什么会有个数字0我们以后再讲。
当然函数名我们可以随意取,只要不跟以前封装定义好的函数名冲突就行。这里我们取“EXTI0_IRQHandler”作为函数名是模仿STM32单片机的写法。
3.EX0和EA
我们说过要想进入中断函数,必须满足它的一些前提条件。这里的EX0(IE^0)和EA(IE^7)要初始化赋值给1才能进入的了中断函数去执行任务。
EA叫做总中断开关,EX0是针对P3.2的外部中断的开关。
也就是要想进入中断函数必须满足两个开关都要闭合(都为1)。
4.实战
同样像上一讲那样拔插杜邦线观察现象,可以看到程序中IE0的身影不再出现但实现功能也都是一样的
#include <reg52.h>
#include <function.h>//详见第六章第8讲
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
LED_Init();
while (1);
}
void EXTI0_IRQHandler() interrupt 0
{
LED2=!LED2;
}
|
所以看起来主函数什么内容也没有,但是在拔插杜邦线的过程中触发了中断函数,所以LED2被执行跳变,这就是中断函数的作用。
即使主函数一直执行“while(1);”,中断函数还是能执行的了的。
大家把“EX0=1;”改为“EX0=0;”,或者把“EA=1;”改为“EA=0;”再编译下载进去拔插杜邦线发现LED2没有反应,因为这样做已经不满足触发中断函数响应了。
|