zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    线性dp 打鼹鼠
    区间dp 能量项链 洛谷p1063
    洛谷 CF1012C Hills (动态规划)
    交作业了 动态规划 木棍加工
    最短路之Floyd
    最小生成树
    寒假集训并查集初级版
    【倍增DP】——保卫王国
    bootstrap四部分概述
    zrender初识
  • 原文地址:https://www.cnblogs.com/leviatan/p/9428187.html
Copyright © 2011-2022 走看看