关于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了,请高手给与解答
如下是被调用的那些函数:
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 ) { ; } }