本帖最后由 yy005566 于 2018-6-6 14:18 编辑
有时按几下才有反应,有时按一次就反应了好多次,不知为何?程序做了按键延时判断,以及while松键判断,求大神救救我?
以下程序:
电平变化中断,唤醒sleep();
IOCBNbits.IOCBN3=1; //RB3下降沿触发,用于下降沿触发唤醒SLEEP()
IOCBNbits.IOCBN4=1; //RB4下降沿触发,用于下降沿触发唤醒SLEEP()
IOCBNbits.IOCBN5=1; //RB5下降沿触发,用于下降沿触发唤醒SLEEP()
INTCONbits.IOCIF=0; //标志位清楚
INTCONbits.IOCIE=1; //使能电平变化中断
INTCONbits.INTE=0;
INTCONbits.INTF=0;
INTCONbits.PEIE=1;
INTCONbits.GIE=1; //总中断
PORTB=PORTB; //读B口
SLEEP(); //休眠
NOP(); //不做任何处理
NOP(); //唤醒
void interrupt ISR(void) //中断
{
if(INTCONbits.IOCIE&&INTCONbits.IOCIF&&IOCBFbits.IOCBF3) //RB3电平下降触发中断
{
PORTBbits.RB3=~PORTBbits.RB3; //读一次RB3
INTCONbits.IOCIF=0;
IOCBFbits.IOCBF3=0;
if(PORTBbits.RB3==0) //RB3按下
{
__delay_ms(20); //延时20ms,再次判断
if(PORTBbits.RB3==0)
{
if(flag2==1||flag3==1) return; //防止按键冲突
flag1++; //flag1标志位
flag1=(flag1==1) ? 1:0;
while(!PORTBbits.RB3); //等待按键松开
}
}
}
}
|