nevertheless
一般會員
發表:4 回覆:7 積分:2 註冊:2005-06-08
發送簡訊給我
|
當89C51的RESET腳位被拉為HIGH時,產生重置,
程式從0000H位址開始執行!
但小弟用的是C語言,
COMPILER過後,查看編譯後的組合語言,
小弟發現它的0000H位址跑了一個 "LJMP 0140H"的指令!
但小弟並未在C程式中加入此類的指令!
請問一下各位大大,小弟該如用用程式去改掉"LJMP"後面的位址??讓它指到我所希望的位址去??
|
㊣
版主
發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
為何要改?它只是跳到放code的位址去而已. 一切 c compiler已經幫你規劃好了. 要改就要改compiler. 那這樣你用組語寫就好啦..幹麻還用C??
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
nevertheless
一般會員
發表:4 回覆:7 積分:2 註冊:2005-06-08
發送簡訊給我
|
上面的那一位大大...
因為它跳到不對的地方去了...
它沒有跳回到MAIN去執行...
而是跳到其中一個副函式去了...
造成我所執行的結果錯誤了...
因此才需要改變它...使它跳到正確的位址去執行...^^"
|
㊣
版主
發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
方便的話, 請把你的程式碼po 上來.
這樣大家比較清楚問題所在, 謝謝!
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
暗黑破壞神
版主
發表:9 回覆:2301 積分:1627 註冊:2004-10-04
發送簡訊給我
|
如果這樣。這一題就不該叫 89C51重置的問題。
而是你對 c compiler & liner 不清楚。
要把問題寫清楚。。。。。 再來我們把畫面交給棚內主播。阿正。
|
㊣
版主
發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
nevertheless兄:
PO程式碼請縮排. 不知如何做請參考版規.
煩請修改配合, 謝謝!
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
nevertheless
一般會員
發表:4 回覆:7 積分:2 註冊:2005-06-08
發送簡訊給我
|
抱歉...^^"
我在貼一次我的程式碼了...
http://www.wretch.cc/album/show.php?i=nochange&b=3&f=1125640012&p=0
#include
sbit M_CLOCK = P1^6;
sbit M_DATA = P1^7;
unsigned char bank[70];
unsigned int Tptr = 0,Rptr = 0;
unsigned char transflag = 0;
unsigned char recflag = 0;
void UART();
void Microsoft();
unsigned char Micro_MSData();
unsigned char Micro_HostData(); void main()
{
IE = 0x92;
UART();
//M_TEST = 0;
Microsoft();
} //================== RS232 UART ==================//
void UART()
{
SM0=0;
SM1=1;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1=1 ;
REN=1 ;
} //==================== Microfoft ==========================//
void Microsoft()
{
while(!transflag)
{
while(M_DATA){}
if(!M_DATA)
{
if(M_CLOCK)
{
bank[Rptr] = Micro_MSData();
Rptr = (Rptr 1)p;
}
else if(!M_CLOCK)
{
bank[Rptr] = 0xBB;
Rptr = (Rptr 1)p;
bank[Rptr] = Micro_HostData();
Rptr = (Rptr 1)p;
}
}
TI = 1;
}
while(1)
{
if(transflag == 1)
{
if(Tptr != Rptr)
{
transflag = 0;
SBUF = bank[Tptr];
Tptr = (Tptr 1)p;
}
}
while(M_DATA)
{
if(transflag == 1)
{
if(Tptr != Rptr)
{
transflag = 0;
SBUF = bank[Tptr];
Tptr = (Tptr 1)p;
}
}
}
while(!M_DATA)
{
if(M_CLOCK)
{
bank[Rptr] = Micro_MSData();
Rptr = (Rptr 1)p;
}
else if(!M_CLOCK)
{
bank[Rptr] = 0xBB;
Rptr = (Rptr 1)p;
bank[Rptr] = Micro_HostData();
Rptr = (Rptr 1)p;
if(transflag == 1)
{
if(Tptr != Rptr)
{
transflag = 0;
SBUF = bank[Tptr];
Tptr = (Tptr 1)p;
}
}
while(M_DATA){}
bank[Rptr] = Micro_MSData();
Rptr = (Rptr 1)p;
}
}
}
} //============== Microsoft Mouse Data ==================//
unsigned char Micro_MSData()
{
int i = 0;
unsigned char tmp = 0x00,tmp1 = 0x00;
while(M_CLOCK){}
while(!M_CLOCK){}
while(M_CLOCK){}
while(M_CLOCK == 0 && i < 8)
{
tmp = tmp >> 1;
tmp1 = (M_DATA==1)?0x80:0x00;
tmp = tmp | tmp1;
while(!M_CLOCK){}
while(M_CLOCK){}
i;
}
while(!M_CLOCK){}
while(M_CLOCK){}
return tmp;
} //============== Microsoft Host Data ==================//
unsigned char Micro_HostData()
{
int i = 0;
unsigned char tmp;
unsigned char tmp1;
while(!M_CLOCK){}
while(M_CLOCK){}
while(!M_CLOCK){}
while(M_CLOCK && i<8)
{
tmp = tmp >> 1;
tmp1 = (M_DATA==1)?0x80:0x00;
tmp = tmp | tmp1;
while(M_CLOCK){}
while(!M_CLOCK){}
i;
}
while(M_CLOCK){}
while(!M_CLOCK){}
while(M_CLOCK){}
while(!M_CLOCK){}
return tmp;
} //================== 通訊中斷 ================//
void UART_ISR(void) interrupt 4
{
TI = 0;
transflag = 1; // 傳送完畢,將flag設為1!
} 發表人 - nevertheless 於 2005/09/02 15:19:13 發表人 - nevertheless 於 2005/09/02 15:26:19 發表人 - nevertheless 於 2005/09/02 15:31:15
|
㊣
版主
發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
C:0140 裡面的code是??
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
nevertheless
一般會員
發表:4 回覆:7 積分:2 註冊:2005-06-08
發送簡訊給我
|
C:0410 程式碼的圖:
http://www.wretch.cc/album/show.php?i=nochange&b=3&f=1125640013&p=1
|
暗黑破壞神
版主
發表:9 回覆:2301 積分:1627 註冊:2004-10-04
發送簡訊給我
|
沒錯呀。
在 main 之前要先初始化資料。
ex. stack point....
等等呀。
51 的初始化比較簡單啊。
你那幾行就是做這個事呀。
然後才會把控制權交到你寫的 main 啊。
|
㊣
版主
發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
如同暗黑大仔說的..它在做初始化的動作....
還有什麼問題嗎?
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
frederick
中階會員
發表:101 回覆:108 積分:66 註冊:2002-08-01
發送簡訊給我
|
有興趣可以去研究組譯器、編譯器怎麼寫。
有的compiler作法,除了前面版大所說stack point以外,
它還會把你所call的副程式的程式碼插在main()前面喔。
所以你看到的main()大概是很長位置以後了吧。
|
foreman
高階會員
發表:3 回覆:124 積分:190 註冊:2004-09-10
發送簡訊給我
|
您有void UART_ISR(void) interrupt 4 這函式所以必須要用到中斷向量表
reset 0h
...
uart 23h 所以0h Ljmp xxxx 是很正常
|
addn
高階會員
發表:64 回覆:221 積分:202 註冊:2005-03-21
發送簡訊給我
|
像我用組合語言寫,也習慣在00h 放jump指令跳到XXX的位址去 這樣有一個好處,可以避免覆蓋中斷位址
|
㊣
版主
發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
另外,看了一下圖片. 您是用Keil C 寫的吧?稍微模擬一下就知道程式結果對不對了. 試試看吧!
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
foreman
高階會員
發表:3 回覆:124 積分:190 註冊:2004-09-10
發送簡訊給我
|
http://www.spjsystems.com/sim51.htm
也可從上列網址下載wsim51 demo版2k限制模擬一下您的程式
|