6、外部中断
这里主要编写外部中断0和1的边沿触发,通过LED状态显示。
外部中断0
外部中断我们要知道的是:①如何触发?上升沿、下降沿还是高低电平;②外部中断使能;③中断服务函数的编写。
AVR提供了3个外部中断0/1/2,对应的Pin脚是PD2/PD3/PB2,其中外部中断0是所有中断中优先级最高,响应最快的。
①MCUCR:SM2,SE,SM1,SM0,ISC11,ISC10,ISC01,ISC00
MCUCR寄存器的低2位用于控制INT0中断的触发方式,具体如下图:
这里我们选择上升沿触发产生中断请求。
②GICR:INT1,INT0,INT2,Dummy4,Dummy3,Dummy2,IVSEL,IVCE
中断使能位为GICR的第6位,默认初始值=0,赋值为1使能。
③编写初始化函数和中断函数,具体程序如下:
当然别忘了,对应中断引脚设置为上拉输入。
外部中断1
外部中断1与0类似,其设置触发方式的寄存器与INT0一致,但具体是第2和3位来设置。
同理这里还是设置为上升沿触发。
然后使能位是GICR寄存器的最高位,赋值1即可。
具体编程如下:
主函数如下:LED2正常闪烁时,等待外部中断0和1触发。
/**
******************************************************************************
* @file main.c
* @author Alex——小白
* @version V1.0
* @date 2021.1.20
* @brief 外部中断,按键控制LED亮灭
* @store Proteus仿真店子——公众号
* @Link https://shop484534014.taobao.com/
* @Email 844545015@qq.com
******************************************************************************
* @attention All Rights Reserved
**/
#include <main.h>
void main(void)
{
LED.LED_Init(0x07);
EXIT.EXIT0_Init();
EXIT.EXIT1_Init();
while(1)
{
LED.LED_Reverse(2);
Delay.Delay_ms(500);
}
}
如需Proteus和IAR安装包以及AVR编程参考手册,请关注公众号:
Proteus仿真店子
可通过查看历史记录,查看源码和仿真工程
(若需Proteus和IAR安装包以及AVR编程参考手册,后台回复:AVR;若需其它设计,后台回复:AVR设计)