各位大哥,小弟最近用槽型光耦做个多通道计数器,用下降沿触发中断,用的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 不能中断,但手册上没有找到为什么?
|