大家写程序的时候是不是在可以的情况下喜欢使用例如if(PORTBbits.RB12 == 0){}之类的句子啊,只说括号里面的内容哈!这里提个醒:在某些情况下是不能这样使用的,附上代码说明:
void __attribute__((interrupt, no_atuo_psv)) _CNInterrupt(void)
{
IFS1bits.CNIF = 0; // 清除外部中断标志位
Exit_Delay();
if((LATB &0x1000) == 0x1000) // RB12
{
KeyValue = 1; // 只有这一句执行得到,因为上面是用的整个寄存器与或实现的
}
// 以下这些用XXXXbits.XXXX的都无法检测到的
else if(LATBbits.LATB13 == 0) // RB13
{
KeyValue = 2;
}
else if(LATBbits.LATB14 == 0)
{
KeyValue = 3;
}
else if(LATBbits.LATB15 == 0)
{
KeyValue = 4;
}
else if(LATFbits.LATF4 == 0)
{
KeyValue = 5;
}
else if(LATFbits.LATF5 == 0)
{
KeyValue = 6;
}
Exit_Delay();
IFS1bits.CNIF = 0; // 清除外部中断标志位
}
不知道是不是我使用的错误,按理说官方文件里面的东西不应该出这样的错啊,再也不相信爱情了……
刚刚一个马虎,判断错误,在这里声明,至少在这个地方不是刚刚说的XXXXbits.XXXX引起的,而是LATX引起的,下面的程序试过是正确的,有没有大侠知道全面点的,麻烦总结一下:
void __attribute__((interrupt, no_atuo_psv)) _CNInterrupt(void)
{
IFS1bits.CNIF = 0; // 清除外部中断标志位
Exit_Delay();
//if((PORTB & 0x1000) == 0x0000) // RB12
if(PORTBbits.RB12 == 0)
{
KeyValue = 1; // ===>这样就可以,看来是用的有问题
}
else if((PORTB &0x2000) == 0x0000) // RB13
{
KeyValue = 2;
}
else if((PORTB &0x4000) == 0x0000)
{
KeyValue = 3;
}
else if((PORTB &0x8000) == 0x0000)
{
KeyValue = 4;
}
else if((PORTF &0x0010) == 0x0000)
{
KeyValue = 5;
}
else if((PORTF &0x0020) == 0x0000)
{
KeyValue = 6;
}
Exit_Delay();
IFS1bits.CNIF = 0; // 清除外部中断标志位
}
我又相信爱情了,但好像对爱情还不是很懂……