上一讲里,当赋值IT0为1时,P3.2遇到下降沿,IE0被置1,要想使IE0自动清零,我们引用中断函数就可以了。
我们可能已经习惯了都是在main函数里阅读分析代码,其实还有另一种函数需要我们认识的,那就是中断函数。所谓中断函数就是当它满足一定的条件时就会暂停主函数的执行内容,转而去执行中断函数。关于这个概念网上很多说法都已经讲解的很详细了,这里点一下即可。
因为我们擅长的是从实践中领悟真理,所以后面我们尽量用例程去理解中断函数。
中断函数与其他我们封装过的子函数的写法不同,有个区分标志“interrupt”。
至于后面为什么会有个数字0我们以后再讲。
当然函数名我们可以随意取,只要不跟以前封装定义好的函数名冲突就行。这里我们取“EXTI0_IRQHandler”作为函数名是模仿STM32单片机的写法。
我们说过要想进入中断函数,必须满足它的一些前提条件。这里的EX0(IE^0)和EA(IE^7)要初始化赋值给1才能进入的了中断函数去执行任务。
EA叫做总中断开关,EX0是针对P3.2的外部中断的开关。
也就是要想进入中断函数必须满足两个开关都要闭合(都为1)。
同样像上一讲那样拔插杜邦线观察现象,可以看到程序中IE0的身影不再出现但实现功能也都是一样的
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { IT0 = 1; //下降沿触发模式 EX0 = 1; EA = 1; LED_Init(); //初始化LED硬件模块 while(1); //主函数什么事都不做,空循环这条语句 } void EXTI0_IRQHandler() interrupt 0 { LED2=!LED2; }
所以看起来主函数什么内容也没有,但是在拔插杜邦线的过程中触发了中断函数,所以LED2被执行跳变,这就是中断函数的作用。
即使主函数一直执行“while(1);”,中断函数还是能执行的了的。
大家把“EX0=1;”改为“EX0=0;”,或者把“EA=1;”改为“EA=0;”再编译下载进去拔插杜邦线发现LED2没有反应,因为这样做已经不满足触发中断函数响应了。
本文固定URL:https://www.dotcpp.com/course/367
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程