|
|
你稍微懂一點點的 硬件知識,就不會有這個問題了。 指針訪問屬于 “間接訪問”。 而51的SFR 屬于 只能"直接訪問",是不能用指針訪問的。 至于,51的擴(kuò)展寄存器 XSFR 屬于只能“間接訪問”,即無論如何都必須通過指針才能訪問的。 |
3038838599 發(fā)表于 2024-8-25 15:15 總而言之 0x80~0xFF地址的寄存器只能用SFR來訪問, 如 sfr P3 = 0xB0; ... P3 = 0x0F; if(P3 != 0x0F) { ... } |
3038838599 發(fā)表于 2024-8-24 16:08 這個寄存器地址是在xdata區(qū)域,不在0x80--0xFF,所以可以這樣定義,大多數(shù)寄存器地址是0x80--0xFF,需要使用直接尋址, 如果用間接尋址訪問0x80--0xFF,就是訪問idata的RAM, 如果用直接尋址訪問0x80--0xFF,就是訪問寄存器 0x00-0x7F可以是data區(qū),也可以是idata區(qū) 如果用間接尋址訪問0x00--0x7F,就是訪問idata區(qū) 如果用直接尋址訪問0x00--0x7F,就是訪問data區(qū) |
|
我也看了這段話,但是沒有整明白,有人說32的是地址映射, |
cccc888 發(fā)表于 2024-8-22 21:23 是的 我也是看見過別的51內(nèi)核的單片機(jī)這么做,所以才需要搞懂 #define I2C_SR *(_IO uint8 xdata *)0x402b // RV: 00H I2C狀態(tài)寄存器 |
|
我嘗試回答,不知道是否有誤,請指正。 1、51特殊功能寄存器與RAM使用統(tǒng)一編址,如果用這種指針方式訪問,編譯器不知道指向哪個鬼,編譯器會給出警告說:內(nèi)存空間或許無效。 2、所以,51使用關(guān)鍵字SFR訪問特殊寄存器。如:sfr P1 = 0x90; //P1口數(shù)據(jù)寄存器 |
又有新發(fā)現(xiàn)。參照別的頭文件加上內(nèi)存區(qū)塊名
發(fā)現(xiàn)加了data和加idata和不加生成的匯編代碼一樣。這算不算??,既然支持了,就應(yīng)該有區(qū)別吧。
|
3038838599 發(fā)表于 2024-8-22 09:45 的確是這樣子的,但是xdata寄存器可以這樣定義,我看過別的單片機(jī)的頭文件定義。 |
|
是因為32比較落后,沒有bit功能,只能這么操作 而51就比較強(qiáng)大,不但能用bit賦值,也能用指針賦值 只是你沒寫對 |
| 51的寄存器只能直接尋址操作,不能用間接尋址,所以不能用指針。 |
cccc888 發(fā)表于 2024-8-21 20:54 那你試著不要“reg52.h"頭文件,看看能不能把P1的引腳都置0。 |
|
| 51用匯編也可以實現(xiàn)同樣的效果 |
|
Powered by 單片機(jī)教程網(wǎng)