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 阅读(...) 评论(...) 编辑 收藏