新建工程参考前面两篇帖子。
这里有两种方法使用中断,第一种较为通用,几乎每个引脚都可以做中断,但是精确到一组,在里面要做判断;第二种跟普通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);
}