求助!stm8S外部中断?

2019-07-19 21:54发布

各位大哥,小弟最近用槽型光耦做个多通道计数器,用下降沿触发中断,用的STM8S105K4 32引脚,准备用20个IO用来中断,可以实现吗? 现在测的一个IO没有问题,但是多个的时候,貌似从PB_IDR读的数据有问题,或者程序错了,结果不是期望的,下面请各位评评程序: void Exti_Init(void)
{
  //PB0 上拉输入
  B_DDR &= (CLRBIT0|CLRBIT1|CLRBIT2|CLRBIT3|CLRBIT4|CLRBIT5|CLRBIT6|CLRBIT7);
  B_CR1 |= (SETBIT0|SETBIT1|SETBIT2|SETBIT3|SETBIT4|SETBIT5|SETBIT6|SETBIT7);
  //下降沿触发
  EXTI_CR1 |= SETBIT3;
  EXTI_CR1 &= CLRBIT2;
  //开启端口中断
  B_CR2 |= (SETBIT0|SETBIT1|SETBIT2|SETBIT3|SETBIT4|SETBIT5|SETBIT6|SETBIT7);
  //PB_ODR=0x00;
}   @far @interrupt void EXTI0_PB_IRQHandler (void)//Port B 01234567
{
 _asm("sim");    //关总中断
  //在此添加case代码 判断外部中断具体引脚   及对应的服务函数
/* switch(PB_IDR)
{
 case 0x01:  Uart2_Pchar('0'); break;
 case 0x02:  Uart2_Pchar('1'); break;
 case 0x03:  Uart2_Pchar('2'); break;
 case 0x08:  Uart2_Pchar('3'); break;
 case 0x10:  Uart2_Pchar('4'); break;
 case 0x20:  Uart2_Pchar('5'); break;
 case 0x40:  Uart2_Pchar('6'); break;
 case 0x80:  Uart2_Pchar('7'); break;
}*/
 if(!(PB_IDR&0X01))
 {   
  Uart2_Pchar('0');
 }
 if(!(PB_IDR&0X02))
 {   
  Uart2_Pchar('1');
 }
 if(!(PB_IDR&0X04))
 {   
  Uart2_Pchar('2');
 }
 if(!(PB_IDR&0X08))
 {   
  Uart2_Pchar('3');
 }
 if(!(PB_IDR&0X10))
 {   
  Uart2_Pchar('4');
 }
 if(!(PB_IDR&0X20))
 {   
  Uart2_Pchar('5');
 }
 if(!(PB_IDR&0X40))
 {   
  Uart2_Pchar('6');
 }
 if(!(PB_IDR&0X80))
 {   
  Uart2_Pchar('7');
 }  _asm("rim");    //开总中断 }   比如现在将线接在PB4上,其他悬空,串口应该只输出 4 但是一直输出47 接在其他引脚上后面都带个7 还有好像PB6 7 不能中断,但手册上没有找到为什么?  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。