標(biāo)題: C51單片機(jī)在主程序里怎么訪問(wèn)特殊功能寄存器或者說(shuō)怎么更改先前SFR定義的地址? [打印本頁(yè)]

作者: 舊言四    時(shí)間: 2022-4-27 14:17
標(biāo)題: C51單片機(jī)在主程序里怎么訪問(wèn)特殊功能寄存器或者說(shuō)怎么更改先前SFR定義的地址?
環(huán)境 :KielC51
MCU :IAP15W4K61S4
應(yīng)用環(huán)境:利用兩組IO端口(P1^6\P1^5 和 P4^1\P4^2)模擬IIC總線(xiàn)和顯示驅(qū)動(dòng)芯片1648A及外部EEPROM通信,現(xiàn)在用的兩組獨(dú)立的代碼實(shí)現(xiàn)IIC協(xié)議,F(xiàn)在設(shè)想改為兩個(gè)端口共用一組代碼以減少代碼量,之前想過(guò)使用改變指針指向來(lái)重定向端口,但是在主程序里發(fā)現(xiàn)通過(guò)SFR定義的地址無(wú)法通過(guò)指針獲取。
請(qǐng)問(wèn)有好的解決方案嗎。

作者: munuc_w    時(shí)間: 2022-4-27 16:10
IIC設(shè)備是有地址的,放在一組總線(xiàn)上就可以了,用地址區(qū)分設(shè)備。
作者: 舊言四    時(shí)間: 2022-4-27 16:31
munuc_w 發(fā)表于 2022-4-27 16:10
IIC設(shè)備是有地址的,放在一組總線(xiàn)上就可以了,用地址區(qū)分設(shè)備。

感謝回復(fù)  確實(shí)使用一條總線(xiàn)確實(shí)可以實(shí)現(xiàn)目的 但是因?yàn)樵诮Y(jié)構(gòu)上也是兩個(gè)IIC外設(shè)單獨(dú)掛載的 所以暫時(shí)不能用這種方法。這邊首選還是設(shè)想一種方案以軟件來(lái)實(shí)現(xiàn)外設(shè)端口的跳轉(zhuǎn),了解到51的SFR地址區(qū)域只能采用直接尋址,是不是代表著沒(méi)有辦法在主程序中以指針或者中間值替換的方式改變SFR關(guān)鍵字的定義地址呢
作者: yzwzfyz    時(shí)間: 2022-4-27 17:37
51系統(tǒng)單片機(jī)中的特殊寄存器的地址是:80-FFH
而高端RAM的地址也是:80-FFH
這兩個(gè)地址是相同的。51為了能區(qū)分它們,在指令系統(tǒng)上做了如下的規(guī)定:
直接尋址(訪問(wèn))對(duì)應(yīng)的是特殊寄存器。
間接尋址(訪問(wèn))對(duì)應(yīng)的是高端RAM。
明白這一點(diǎn)就不難理解了。
你用指針訪問(wèn)80H,而80H即表示特殊寄存器的P0口,也表示高端RAM中的80H,F(xiàn)在知道你訪問(wèn)的是哪一個(gè)了吧。
要讀通CPU手冊(cè),這些手冊(cè)上都有。
作者: Hephaestus    時(shí)間: 2022-4-27 17:42
純c51語(yǔ)言是無(wú)法實(shí)現(xiàn)你需要的功能,只能用匯編寫(xiě)函數(shù),用c語(yǔ)言調(diào)用這個(gè)函數(shù)。
作者: 舊言四    時(shí)間: 2022-4-27 17:43
yzwzfyz 發(fā)表于 2022-4-27 17:37
51系統(tǒng)單片機(jī)中的特殊寄存器的地址是:80-FFH
而高端RAM的地址也是:80-FFH
這兩個(gè)地址是相同的。51為了 ...

確實(shí)如此

1651052485(1).png (171.45 KB, 下載次數(shù): 33)

1651052485(1).png

作者: lkc8210    時(shí)間: 2022-4-27 17:53
IAP15W4K61S4有61k ROM
就那一點(diǎn)點(diǎn)的代碼量CV十次都綽綽有余
作者: Y_G_G    時(shí)間: 2022-4-27 21:15
7#已經(jīng)回復(fù)過(guò)了
如果不是代碼空間已經(jīng)不夠用了,實(shí)在不理解為什么要減少代碼量?C+V它不香嗎?
說(shuō)不定整半天,代碼量反而更多了
再說(shuō),當(dāng)初設(shè)計(jì)的時(shí)候就應(yīng)該先看一下IIC的從機(jī)地址,如果不是一樣的地址,那就兩根線(xiàn)足夠了
作者: 188610329    時(shí)間: 2022-4-27 21:57
舊言四 發(fā)表于 2022-4-27 16:31
感謝回復(fù)  確實(shí)使用一條總線(xiàn)確實(shí)可以實(shí)現(xiàn)目的 但是因?yàn)樵诮Y(jié)構(gòu)上也是兩個(gè)IIC外設(shè)單獨(dú)掛載的 所以暫時(shí)不能 ...

說(shuō)實(shí)話(huà), STC15 系列沒(méi)有硬件 IIC, 換句話(huà)說(shuō),你只能通過(guò)軟件模擬來(lái) 操作IIC, 也就是說(shuō)不可能在后臺(tái)讀寫(xiě)IIC器件,必須前臺(tái)讀寫(xiě)的話(huà),同一之間你只能訪問(wèn)一個(gè)IIC器件,因此,兩個(gè)IIC器件,分別用兩個(gè)套IO來(lái)操控的意義何在? 感覺(jué)是給自己增加工作量啊……
作者: 舊言四    時(shí)間: 2022-4-28 09:10
Y_G_G 發(fā)表于 2022-4-27 21:15
7#已經(jīng)回復(fù)過(guò)了
如果不是代碼空間已經(jīng)不夠用了,實(shí)在不理解為什么要減少代碼量?C+V它不香嗎?
說(shuō)不定整半天 ...

好巧不巧的是  硬件IIC地址都是0XA0 外部EEPROM采用的是SOT-23-5的封裝也沒(méi)有辦法更改從機(jī)地址
作者: 舊言四    時(shí)間: 2022-4-28 09:12
188610329 發(fā)表于 2022-4-27 21:57
說(shuō)實(shí)話(huà), STC15 系列沒(méi)有硬件 IIC, 換句話(huà)說(shuō),你只能通過(guò)軟件模擬來(lái) 操作IIC, 也就是說(shuō)不可能在后臺(tái)讀寫(xiě)II ...

給自己挖了個(gè)大坑
作者: 舊言四    時(shí)間: 2022-4-28 09:14
Hephaestus 發(fā)表于 2022-4-27 17:42
純c51語(yǔ)言是無(wú)法實(shí)現(xiàn)你需要的功能,只能用匯編寫(xiě)函數(shù),用c語(yǔ)言調(diào)用這個(gè)函數(shù)。

感謝回復(fù)  值得參考的建議
作者: lkc8210    時(shí)間: 2022-4-28 13:32
其實(shí)又不用全代碼CV
只需要加個(gè)全局變量來(lái)選擇用個(gè)腳就可以了

if(IIC_Sel)//0=IIC1, 1=IIC2
SDA1 = 1;
else
SDA2 =1;
作者: 舊言四    時(shí)間: 2022-4-28 14:17
lkc8210 發(fā)表于 2022-4-28 13:32
其實(shí)又不用全代碼CV
只需要加個(gè)全局變量來(lái)選擇用個(gè)腳就可以了

感謝回復(fù)  這樣的話(huà)確實(shí)是比較省時(shí)間  




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1