【PIC32MZ】按键中断

新建工程参考前面两篇帖子。

这里有两种方法使用中断,第一种较为通用,几乎每个引脚都可以做中断,但是精确到一组,在里面要做判断;第二种跟普通mcu中断相似,精确到每个引脚,并且可选择上升沿或下降沿。

第一种方式,仅需三步:一是将需要使用的GPIO设为Input;二是勾选ChangeNotify(如果想要设置默认状态,还可以设置上拉或者下拉);三是在system_interrupt中调用中断函数。
 
以下为示例,按键为RB12,这里是按下按键接地,低电平,包含长按以及短按处理:



【PIC32MZ】按键中断_第1张图片

【PIC32MZ】按键中断_第2张图片


 
void GPIO_B_Interrupt(void)
{
    //press is low
    bool sw3State = SYS_PORTS_PinRead(PORTS_ID_0,PORT_CHANNEL_B,12);

    Sys_Delay_ms(20); //avoid shake
    if(sw3State!=SYS_PORTS_PinRead(PORTS_ID_0,PORT_CHANNEL_B,12))
        return;
    
    if(!sw3State)  //just get press ,low
    {
        uint8_t j=0;
        for(j=0;j<30;j++)
        {
            if(sw3State!=SYS_PORTS_PinRead(PORTS_ID_0,PORT_CHANNEL_B,12))  //short press
            {
                 PowerSwitchStateChange(false);  //short press
                 return;
            }
            Sys_Delay_ms(300); 
        }
        
        PowerSwitchStateChange(true);  //long press        
    }
 
}

可以在短按函数和长按函数里面添加输出LED显示,输出方法参考前一篇,这里就不赘述了,比较简单。完成后烧入PIC即可。



第二种方式,使用System Service中的Interrupts,选择中断源还有触发方式,然后配置映射引脚,再在system_interrupt.c的对应函数中调用你的Function即可。

【PIC32MZ】按键中断_第3张图片

【PIC32MZ】按键中断_第4张图片

触发函数:
void __ISR(_EXTERNAL_1_VECTOR, IPL1AUTO) _IntHandlerExternalInterruptInstance0(void)
{
    POWER_BUTTON_Interrupt();
    PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_EXTERNAL_1);
}
void __ISR(_EXTERNAL_2_VECTOR, IPL1AUTO) _IntHandlerExternalInterruptInstance1(void)
{
    UP_LIMIT_Interrupt();
    PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_EXTERNAL_2);
}




你可能感兴趣的:(MCU,PIC32MZ开发)