1.另一个外部中断
前面两讲都是围绕外部中断0(P3.2的功能)来讲解,这里我们也还有一个外部中断1(P3.3的功能)。P3.3要想实现上一讲的功能只需杜邦线接下面的IO端口即可
代码就是把“EX0”改为“EX1”,“IT0”改为“IT1”。
interrupt后面的0要改为2,函数名我们改为“EXTI1_IRQHandler()”
#include <reg52.h>
#include <function.h>//详见第六章第8讲
void
main()
{
IT1 = 1;
//下降沿触发模式
EX1 = 1;
EA = 1;
LED_Init();
//初始化LED硬件模块
while
(1);
}
EXTI1_IRQHandler() interrupt 2
LED2=!LED2;
再次提醒,杜邦线的一头接的是P3.3。
至于interrupt后面的数字为什么要为2,大家先熟悉这张图了解一下先
更多中断知识的概念参考《手把手教你学51单片机》文档6.5节。
2.按键触发中断
我们每次要把P3.2和P3.3外部拉低或释放,都需要拔插杜邦线,这样太麻烦,我们可以用按键来取代这些拔插动作,按键按下不放就相当于一直拉低,跟杜邦线一直插着GND一个效果,松开按键就跟杜邦线没插GND一样。
可是P3.2和P3.3没有直接相连的按键,不过没关系,我们把杜邦线这样接,让P3.3和P2.3一起相连,K4的按键动作可以使P2.3和P3.3同步电平
我们要用到按键,所以别忘了初始化按键模块。
KEY_Init();
//初始化按键功能模块
3.去抖动
按键似乎没能很灵敏的按一下松手LED2就跳变一次亮或灭的效果,那是因为我们没有延时消抖,一个按键动作就存在好几个下降沿了,导致中断函数被执行了几遍。
在中断函数中加延时就可以消除这种失灵现象了,不过在以后编程里不能在中断函数里使用延时,这样会使程序的执行效率大打折扣,我们本次只是作为测试代码才在中断函数里用延时。
//请把P3.3和P2.3用杜邦线连接起来
delay_ms(50);
//去抖动
if
(INT1==0)
//P3.3是否还处于低电平的稳定接触状态,INT1已在“#include <reg52.h>”中定义好了
这样就可以达到按下松手一次,LED2的状态只能取反一次的灵敏效果。如果我们一直按着不放,LED2也只是跳变一次而已,有点像不支持连按功能,这是因为“IT1=1;”的原因。
要是改为“IT1=0;”,这样K4按键就有种支持连按的感觉从而LED2就会不停闪烁了。按键按下一直不放就会不停地进入中断函数。
IT1 = 0;
//低电平状态下触发
//P3.3是否还处于低电平的稳定接触状态