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)

  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/leviatan/p/9428187.html
Copyright © 2011-2022 走看看