我是PIC编程的新手,我正在使用MPLAb。我有关于中断的问题.. 所以我想做什么,当我按下按钮然后我想打开LED 0,如果我释放按钮然后打开LED 1.我认为我写的代码有意义,但它没有用。
以下是发生的事情。假设按下按钮时,中断引脚的初始状态为低(0)。然后LED 0亮,当我松开按钮时,LED 1亮。当我再次按下按钮时,我预计LED 0会亮起,但LED 1会一直亮着,并且永远不会改变状态。
我添加了最后一行来查看中断引脚的状态,一旦中断为高电平,它就永远不会变为低电平。你能告诉我什么是我的误解吗?
提前致谢!
这是我的代码:
void interrupt ISR(void)
{
if(INTCONbits.INTF)
{
nextLED = 1;
LATC = Output_Code_Buffer[nextLED];
__delay_ms(250);
}
else
{
nextLED = 0;
LATC = Output_Code_Buffer[nextLED];
__delay_ms(250);
}
nextLED = INTCONbits.INTF + 2;
LATC = Output_Code_Buffer[nextLED];
__delay_ms(250);
}
// Interrupt Enable settings
INTCONbits.INTE = 1;
INTCONbits.TMR0IE = 1; // Enable TMR0 interrupts
INTCONbits.TMR0IF = 0; // Clear TMR0 interrupt flag
INTCONbits.GIE = 1; // Enable global interrupts
答案 0 :(得分:0)
您需要重置ISR功能中的中断标志,否则它将继续触发。请阅读数据表,如果有必要,应该提及。所以只需添加INTCONbits.INTF = 0;到ISR,它应该按预期工作。
在设置mcu的任何外设或功能时,您应该查看数据表并使用寄存器的说明以及设置它们的内容。您还需要注意模拟端口,模拟端口通常默认为模拟端口而不是数字端口,导致中断不会按预期触发或导致意外中断。最好首先设置MCU配置位,设置TRIS和模拟选择寄存器(ANSELx或ANSELAx等),然后设置要使用的任何外设的寄存器。然后设置中断,始终重置您将用于以已知状态启动的所有中断标志。
您还设置TMR0IE = 1,它将执行相同的操作,触发中断。如果你没有重置TMR0标志,它将继续触发,锁定你的mcu或减慢速度。