C51 玄学问题,magic

0x00 问题代码

void int0_isr(void) interrupt 0
{
	num++;
	if (num%2 == 1)
	{
		uint k;
		for(k=0;k<3;k++)
		{
			P1=0x0f;
			delay(500);
			P1=0xf0;
			delay(500);
		}
	}
	else if (num%2 == 0)
	{
		uint m;
		uint n;
		temp=0xfe;
		P1=temp;	//IO口无法直接参与运算,先赋值给字符串再用cror进行二进制移位运算
		for (n=0;n<2;n++)
		{
			for	(m=0;m<7;m++)
			{
				delay(300);
				temp = _crol_(temp,1);
				P1=temp;
			}
			for (m=0;m<7;m++)
			{
				delay(300);
				temp = _cror_(temp,1);
				P1=temp;
			}
		}
	}
}

void int1_isr (void) interrupt 2
{
	P1=0xff;
	delay(3000);
}

0x01 问题剖析

手动分配using 0,using 1导致无法退出中断
手动分配using 1,using 2正常退出并返回主函数
自动分配正常退出并返回主函数

以下纯属猜测,毕竟跟使用哪组寄存器没啥关系
代码中使用电平中断(可能也和使用全局变量有关系?)
在没有清中断标志位的情况下,开启中断后,会产生多个中断信号
每个中断程序都在把他们清零,相互影响,导致很难达到计数终点,程序难以终止

又发现一个问题:using 0,using 1是手动分配中断使用哪组寄存器
但缺省情况下系统自动分配寄存器也是using 0,using 1,正常退出中断

using 0使用第0组寄存器(RS1=0,RS0=0),实际地址R0(00H) - R7(07H)
using 1使用第1组寄存器(RS1=0,RS0=1),实际地址R0(08H) - R7(0FH)

posted @ 2018-08-06 06:00  WindSpirit  阅读(...)  评论(...编辑  收藏