C51编程:再次请教混合编程问题
上次经过大虾门的热心帮助,受益非浅,但是我在进行软件防真时,程序会死机。再次请各位大
虾指点一、二,谢谢了
程序在调用汇编子程序时会死机,
死机时执行代码为:003EH F6 MOV @R0, A
003FH D8FD DJNZ R0, 003EH
主程序:
#include "reg51.h"
#define uint unsigned int
extern uint Left(uint temp); //申明函数头
void Delay(uint i) //延时程序
{ uint j;
for(;i>0;i--)
for(j=0;j<120;j++)
{;}
}
void main()
{ uint led=0x55;
while(1)
{ P1=Left(led);//调用函数,实现左移
Delay(100); //延时
}
}
汇编子程序:
PUBLIC _Left
_Left: MOV A,R7 ;第一个参数在R7中
RL A
MOV R7,A ;返回值也在R7中
RET
END
主程序汇编代码:
0000H 02003B LJMP 003BH
0003H 22 RET
0004H D3 SETB C
0005H EF MOV A, R7
0006H 9400 SUBB A, #00H
0008H EE MOV A, R6
0009H 9400 SUBB A, #00H
000BH 4015 JC 0022H
000DH E4 CLR A
000EH FD MOV R5, A
000FH FC MOV R4, A
0010H 0D INC R5
0011H BD0001 CJNE R5, #00H, 0015H
0014H 0C INC R4
0015H ED MOV A, R5
0016H 6478 XRL A, #78H
0018H 4C ORL A, R4
0019H 70F5 JNZ 0010H
001BH EF MOV A, R7
001CH 1F DEC R7
001DH 70E5 JNZ 0004H
001FH 1E DEC R6
0020H 80E2 SJMP 0004H
0022H 22 RET
0023H 750800 MOV 08H, #00H
0026H 750955 MOV 09H, #55H
0029H AF09 MOV R7, 09H
002BH AE08 MOV R6, 08H
002DH 120000 LCALL 0000H
0030H 8F90 MOV P1, R7
0032H 7F64 MOV R7, #64H
0034H 7E00 MOV R6, #00H
0036H 120004 LCALL 0004H
0039H 80EE SJMP 0029H
003BH 787F MOV R0, #7FH
003DH E4 CLR A
003EH F6 MOV @R0, A
003FH D8FD DJNZ R0, 003EH
0041H 758109 MOV SP, #09H
0044H 020023 LJMP 0023H
0047H FF MOV R7, A
发表时间:2002年2月8日14:04:00