|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)教C51中如何直接訪問(wèn)內(nèi)存地址?(利用數(shù)組存放地址) |
| 作者:javasdk 欄目:單片機(jī) |
事情是這樣的,我想對(duì)某些I/O口進(jìn)行掃描看是高或低電平(不是全部),因?yàn)椴贿B續(xù),先 把地址放在一個(gè)數(shù)組中: code unsigned CHAR MYPORTS[18]= {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, 0xB6,0xB7 }; //P1.0~P1.7, P2,0~P2.7, P3.6,P3.7 之后掃描時(shí)用for循環(huán),定義局部變量i, 這時(shí)我想把對(duì)應(yīng)的MYPORTS[i]取出來(lái)作為地址,再 讀取相應(yīng)的內(nèi)容,我是這樣用的, 先 unsigned CHAR *pi2= &MYPORTS[i]; 再 if((*(*pi2))==1) { /* */} else { /* */} 可是提示“*是錯(cuò)誤的指向”,真不知該如何了,請(qǐng)前輩指教一下如何是好啊,多謝! |
| 2樓: | >>參與討論 |
| 作者: lanmp 于 2005/3/16 11:19:00 發(fā)布:
是啊,*pi2已經(jīng)不是指針了 用強(qiáng)制類(lèi)型轉(zhuǎn)換或者指向指針的指針 |
|
| 3樓: | >>參與討論 |
| 作者: xwj 于 2005/3/16 11:57:00 發(fā)布:
當(dāng)然不對(duì)啦 |
|
| 4樓: | >>參與討論 |
| 作者: xwj 于 2005/3/16 12:25:00 發(fā)布:
原因: 1.指針轉(zhuǎn)換不對(duì),沒(méi)有明確指明尋址范圍的指針有3字節(jié),沒(méi)法賦值 2.指針不是這樣用的 3.就算編譯通過(guò),執(zhí)行也不會(huì)正確的,因?yàn)橛玫街羔樆驍?shù)組就注定是間接尋址,對(duì)于51間接尋址是訪問(wèn)不到端口的哦 |
|
| 5樓: | >>參與討論 |
| 作者: mmcu 于 2005/3/16 13:49:00 發(fā)布:
just for reference! unsigned CHAR *pi2; unsigned CHAR i = 0; unsigned CHAR *p; pi2 = MYPORTS; for (i = 0; i < 10; i++) { p = (unsigned CHAR idata *)(*(pi2+i)); if((*p) == 0x01) { break; } else { ;/* */} } |
|
| 6樓: | >>參與討論 |
| 作者: xwj 于 2005/3/16 14:08:00 發(fā)布:
3.就算編譯通過(guò),執(zhí)行也不會(huì)正確的,訪問(wèn)不到端口的 |
|
| 7樓: | >>參與討論 |
| 作者: mmcu 于 2005/3/16 15:43:00 發(fā)布:
C51中如何直接訪問(wèn)內(nèi)存地址?(利用數(shù)組存放地址)的問(wèn)題解決了 C51中如何直接訪問(wèn)內(nèi)存地址?(利用數(shù)組存放地址)的問(wèn)題解決了,訪問(wèn)端口的話是沒(méi)有辦法的。 |
|
| 8樓: | >>參與討論 |
| 作者: xwj 于 2005/3/16 16:55:00 發(fā)布:
這樣編寫(xiě)可以更快更省,但如樓上所說(shuō),訪問(wèn)端口的話是沒(méi)有辦法的。 code unsigned CHAR MYPORTS[18]= {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, 0xB6,0xB7 }; //P1.0~P1.7, P2,0~P2.7, P3.6,P3.7 void main(void) { unsigned CHAR code *pi2; unsigned CHAR i = 0; unsigned CHAR idata *p; pi2 = MYPORTS; p = (*(pi2)); for (i = 0; i < sizeof(MYPORTS); i++) { if((*p) == 0x01) { break; } else { ;/* */} p++; } } //本貼的:Program Size: data=9.0 xdata=0 code=53 //mmcu的:Program Size: data=12.0 xdata=0 code=145 |
|
| 9樓: | >>參與討論 |
| 作者: gqh 于 2005/3/16 17:00:00 發(fā)布:
?? 寄存器間接尋址用R1,R2做地址指針,可尋址片內(nèi)RAM的256個(gè)單元,但不能訪問(wèn)SFR; 直接尋址可訪問(wèn)片內(nèi)RAM的低128個(gè)單元,同時(shí)也是訪問(wèn)高128個(gè)單元的特殊功能寄存器SFR的唯一方法 52系列片內(nèi)RAM有256個(gè)單元,高128個(gè)單元與SFR的地址重疊 51系列高128個(gè)單元不重疊 那 C51中如何直接訪問(wèn)內(nèi)存地址? |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |