关于C51中 中断子函数 调用其它函数 使用using 的有关问题?

关于C51中 中断子函数 调用其它函数 使用using 的问题???
各位好: 

我今天晚上下班后又研究MCU了,呵呵,发现一个问题: 
我在中断子函数中,调用了其他的显示函数(其他的函数又调用其他的函数,是一个通信协议差不多4.5级调用吧),悲催的是不能正常显示,除非有两种办法: 
1. 把定时器0中断子函数interrupt 1 using 2的using 2给去掉,让程序按照入栈出栈变量的方式。 
2. 把被中断子函数调用的那个显示函数,以及被它调用的那些4.5级函数,有局部变量的统统加上using 2 选择一个寄存器组,才能正常工作。 

我想请问一下: 
1. 为什么要把有局部变量的加using 2,没有局部的就不加?我在网上搜了一下,没有符合这个话题的。 
2. 我让程序单步运行一下,发现单步运行时,在添加using 2 的中断服务子程序 和 未添加using 2 的被中断调用的程序中psw中的rs寄存器都是2,也就是说没添加也已经默认using 2了,请高手给与解答 

如下是被调用的那些函数:
C/C++ code

void CT1642_Wr_Bit( bit level )  // 显示函数调用的函数, 这个函数只有形参没有局部变量,就可以不加using 
{ 
     if( CT1642_Choose_HIGH_Flag ) 
     { 
          CT1642_CLK_H = LOW; 
          CT1642_DAT_H = level; 
          CT1642_CLK_H = HIGH; 
     } 
     else 
     { 
          。。。。。 
     } 
} 

void CT1642_Wr_Command( U8 dig1642, U8 dat1642 ) // 这个函数中有局部变量,就必须加using 才能被中断函数调用 
{ 
     U8 i; 
     for( i = 0; i < 4; i ++ ) 
     。。。。。 
} 

void CT1642_Show( void ) // 这个函数中有局部变量,就必须加using 才能被中断函数调用 
{ 
     U8 i; 
     U8 multi_temp = 0; 
     Key_Value = CT1642_NO_KEY; 
     for( i = 0; i < 8; i ++ ) 
     { 
          。。。。。 
     } 
} 


void Is_Timer0( void ) interrupt 1 using 2 
{ 
     static U8 i; 
     TH0 = 0xB1; 
     TL0 = 0xE3; 
     TR0 = 1; 
     i ++; 
     if( i == 50 )  // 定时20ms 
     { 
          i = 0; 
          Display_Hex_Number ++; 
     } 
     Load_Display( );//要显示的数字装载函数 
     CT1642_Show( );// 显示函数 
} 

main() 
{ 

     P3 = 0xff; 
     Display_Hex_Number = 0; 

     PT0 = 0; 

     ET0 = 1; 
     EA = 1; 

     TMOD = 0x01; 
     TH0 = 0xB1; 
     TL0 = 0xE0; 
     TR0 = 1; 

     while( 1 ) 
     { 
          ; 
     } 
}



------解决方案--------------------
你这样搞,一个中断得执行多久才能执行完?还要不要为其它的中断服务了?
你可以在中断里设置个标志位,然后在主流程中查询这个标志位是否置位,如果置位了,就调用显示函数。
------解决方案--------------------
中断处理函数中调用的其他函数,应该定义为可重入的(reentrant)