A Keil C program, it will send data "1" when it receives data "55H" on serial port. The code is as below: #include <REG52.H> void main (void) { SP=0x5F; TMOD=0x20; //timer1,Mode2 TH1=0xFD; //baudrate 9600 TR1=1; //start timer1 SCON=0x50; //#0101 0000B; Mode 3, SM2=0 enable int IE=0x90; //#1001 0000B; enable total int, enable serial int while(1); } void ReceiveFrameStateMachine(void) interrupt 5 //using 2 //serial int { unsigned int xdata c; if(TI!=0) TI=0; //clear and not care about TI if(RI==0) return; //just care RI ACC=SBUF; c=ACC; if (c==0x55) SBUF=1; RI=0; } This program runs correctly when complied in SMALL mode,however it won't send any data when compiled in LARGE mode. After compiled in LARGE mode, the asm code as below: ; FUNCTION main (BEGIN) 0000 75815F MOV SP,#05FH 0003 758920 MOV TMOD,#020H 0006 758DFD MOV TH1,#0FDH 0009 D28E SETB TR1 000B 759850 MOV SCON,#050H 000E 75A890 MOV IE,#090H 0011 ?C0001: 0011 80FE SJMP ?C0001 ; FUNCTION main (END) ; FUNCTION ReceiveFrameStateMachine (BEGIN) 0000 C0E0 PUSH ACC 0002 C0D0 PUSH PSW 0004 75D000 MOV PSW,#00H 0007 C006 PUSH AR6 0009 C007 PUSH AR7 000B 309902 JNB TI,?C0004 000E C299 CLR TI 0010 ?C0004: 0010 30980B JNB RI,?C0006 0013 ?C0005: 0013 E599 MOV A,SBUF ;---- Variable 'c' assigned to Register 'R6/R7' ---- 0015 6455 XRL A,#055H 0017 7003 JNZ ?C0007 0019 759901 MOV SBUF,#01H 001C ?C0007: 001C C298 CLR RI 001E ?C0006: 001E D007 POP AR7 0020 D006 POP AR6 0022 D0D0 POP PSW 0024 D0E0 POP ACC 0026 32 RETI ; FUNCTION ReceiveFrameStateMachine (END) The asm code seems right. but I cannot receive data "1" on the srial prot. My questions are: 1.The asm code seems right,but I cannot receive data "1" on the serial prot of my PC. 2. "PUSH AR6" and "PUSH AR7", I cannot find the definition of AR6 and AR7. What do they mean? Please tell me why instead of just telling me how to midfy the code. Thanks, Z.Y. Xu
"Please tell me why instead of just telling me how to midfy the code." Oh, OK -- because your code is wrong.