流年 发表于 2023-6-28 11:17:26

求请教!!STC32的IO口中断处理

void main(void)
{
      //u8 key;
      CKCON =0x00;    //设置外部总线最快
      EAXFR = 1; //使能访问
      WTST=0x00;//设置代码等待参数
                                    //赋值为0.可将CPU执行程序的熟读设置为最快

      P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口    0000 1111 0x00      P0M1 |= 0x0F;   P0M0 |= 0x00;
      P0M1 |= 0x0F;   P0M0 |= 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;   //
    P2M1 = 0x00;   P2M0 = 0x00;   //
      P2M1 |= 0xFC;   P2M0 |= 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;   //
    P4M1 = 0x00;   P4M0 = 0x00;   //
      P4M1 |= 0x60;   P4M0 |= 0x00;    //0110 0000
    P5M1 = 0x00;   P5M0 = 0x00;   //

      UART4_config(0);    //选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
      
      P0IM0 |= 0xFF;            //高电平中断    0000 1111
      P0IM1 |= 0xFF;
      P0INTE |= 0xFF;      //使能P3口中断
      
      P2IM0 |= 0xFC;            //高电平中断    1111 1100
      P2IM1 |= 0xFC;
      P2INTE |= 0xFC;      //使能P2口中断
      
      P4IM0 |= 0x60;            //高电平中断    0110 0000
      P4IM1 |= 0x60;
      P4INTE |= 0x60;      //使能P4口中断
      
      EA=1;
      while(1);
}
//中断处理

void common_isr() interrupt 13
{
    u8 intf0;
    u8 intf2;
    u8 intf4;
    intf0 =P0INTF ;
    intf2 =P2INTF ;
    intf4 =P4INTF;
   
    if(intf0)
    {
      P0INTF = 0x00;
      P2INTF = 0x00;
      P4INTF = 0x00;
      if(intf0 & 0x01)    //P00 -->fire1
      {
                  FIRE1_Flag = 1;
      }
      if(intf0 & 0x02)    //P01 -->fire2
      {
                  FIRE2_Flag = 1;
      }
      if(intf0 & 0x04)    //P02 -->fire3
      {
                FIRE3_Flag = 1;
      }
   }
}

//ISR.ASM
//将下面的代码保存到相同的ISR.ASM,然后将文件添加到项目中即可

CSEG AT 0133H ;P1 口中断入口地址
    JMP P0INT_ISR
CSEG AT 013BH ;P2 口中断入口地址
    JMP P2INT_ISR   
CSEG AT 014BH ;P4口中断入口地址   
    JMP P4INT_ISR

PXINT_ISR:
JMP 006BH ;借用 13 号中断的入口地址
END
整个程序实现IO口的高电平中断,中断好像都没有进去,求请教一下!!



流年 发表于 2023-6-28 11:30:55

//ISR.ASM
//将下面的代码保存到相同的ISR.ASM,然后将文件添加到项目中即可

CSEG AT 0133H ;P1 口中断入口地址
        JMP PXINT_ISR
CSEG AT 013BH ;P2 口中断入口地址
        JMP PXINT_ISR       
CSEG AT 014BH ;P4口中断入口地址       
        JMP PXINT_ISR

PXINT_ISR:
JMP 006BH ;借用 13 号中断的入口地址
END


这部分有错已经修改

乘风飞扬 发表于 2023-6-29 10:22:43

参考附件例程,设置P0口高电平中断,IO口中断函数里判断中断源翻转对应的P2口。
在主循环里翻转P00,通过示波器可以看到,P00为高电平时,会不断产生中断反复触发P20翻转。
P00为低电平时不产生中断,P20不再翻转。


流年 发表于 2023-7-3 16:38:30

乘风飞扬 发表于 2023-6-29 10:22
参考附件例程,设置P0口高电平中断,IO口中断函数里判断中断源翻转对应的P2口。
在主循环里翻转P00,通过示 ...

请问STC32可以同时检测同一端口的上升沿和下降沿吗
下面是我的代码:
P2IM0 = 0xff|0x3C;//上升沿中断和下降沿中断                //0011 1100
                P2IM1 = 0;
                P2INTE = 0xff; //使能 P2 口中断
                P2WKUE = 0xff; //使能 P2 口中断唤醒


        if(intf2)
        {
                P2INTF = 0x00;
                P2_IO_INTERRUPT=1;
                if(flag == 0)//默认是上升沿中断
                {
                        flag = 1;
                        P2IM0 = 0x00;//设置为下降沿中断
                  P2IM1 = 0;
                }
                else if(flag == 1)
                {
                        flag =0;
                        P2IM0 = 0xff;//设置为上升沿中断
                  P2IM1 = 0;                        
                }

检测一个开关的两种状态,开关默认关闭,打开和关闭各发送一个数据包

乘风飞扬 发表于 2023-7-3 18:32:56

IO口中断只支持以下四种模式:



可以在中断里进行切换。例如脚位是低电平时设置上升沿中断,脚位电平变高后触发上升沿中断,在中断里切换为下降沿产生中断,这样脚位电平变低时会再次触发中断。
页: [1]
查看完整版本: 求请教!!STC32的IO口中断处理