【PIC32MZ】按键中断

2019-04-15 12:15发布

新建工程参考前面两篇帖子。
这里有两种方法使用中断,第一种较为通用,几乎每个引脚都可以做中断,但是精确到一组,在里面要做判断;第二种跟普通mcu中断相似,精确到每个引脚,并且可选择上升沿或下降沿。
第一种方式,仅需三步:一是将需要使用的GPIO设为Input;二是勾选ChangeNotify(如果想要设置默认状态,还可以设置上拉或者下拉);三是在system_interrupt中调用中断函数。   以下为示例,按键为RB12,这里是按下按键接地,低电平,包含长按以及短按处理:





 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即可。




触发函数: 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); }