使用中断功能做按钮
引脚 n 控制寄存器 (PINnCTRL) 可用于使能相应引脚的外部中断。该寄存器的位 用于输入/检测配置。我们可以将中断设置为触发上升沿、下降沿或两个沿。
我将为下降沿配置中断,因此只要按下按钮,中断就会触发。
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 位来清除中断标志。
中断的按钮最好用,不会错过。 用中断有点浪费资源 用中断方式好,实时性较高。 用中断方式需要注意中断的优先级 用中断要注意清除标志位 端口的中断,需要上拉电阻控制,PIC都提供了内置的上拉,可以简化外部电路。
页:
[1]