引脚 n 控制寄存器 (PINnCTRL) 可用于使能相应引脚的外部中断。
该寄存器的位 [2:0] 用于输入/检测配置。我们可以将中断设置为触发上升沿、下降沿或两个沿。
我将为下降沿配置中断,因此只要按下按钮,中断就会触发。
PORTC.DIR = 0x01; // PC5->input, PC0->output
PORTC.PIN5CTRL |= 0x2; // falling sense
sei();
在这里,在设置引脚的方向后,我为引脚 PC5 配置了下降沿中断触发器。然后使用函数 sei() 来启用全局中断。
默认情况下,引脚PC5处于HIGH状态。按下按钮后,销将被拉低到地面,并且中断将触发下降沿。
我们将编写一个中断服务例程 (ISR) 来处理此中断。ISR 的参数应该是需要处理的中断向量。
您可以在器件数据表中找到相应的中断向量,如下所示。
中断标志寄存器 (INTFLAGS) 可用于检查和清除相应的外部中断。
我们将使用此寄存器首先检查中断是否由引脚 PC5 触发,然后使用它来清除中断标志。
ISR(PORTC_PORT_vect)
{
uint8_t flag = PORTC.INTFLAGS;
if (((flag>>5)&0x01) == 1) // if the interrupt is triggered by the pin PC5
{
PORTC.OUTTGL = (1<<0); // toggle the LED
PORTC.INTFLAGS |= (1<<5); // clear the interrupt flag
}
}
在 ISR 内部,我们将检查中断是否由引脚 PC5 触发。我们将通过监视 INTFLAGS 寄存器的第 5 位来检查这一点。
如果中断是由 PC5 触发的,我们将切换 LED,然后通过写入 INTFLAGS 寄存器的第 5 位来清除中断标志。
|