51單片機(jī)讀端口與讀引腳徹底研究(個(gè)人淺見(jiàn))
(1)引腳的結(jié)構(gòu)圖清楚嗎?
以上是P0口一位的結(jié)構(gòu)。以上結(jié)構(gòu)說(shuō)明:讀引腳之前一定要對(duì)端口先置1,使mosfet V2截止,以免信號(hào)被拉低而讀錯(cuò),這一點(diǎn)很容易理解。
(2)什么指令讀端口?什么指令讀引腳?
一般的教科書(shū)上都會(huì)強(qiáng)調(diào):讀端口的指令為端口內(nèi)容取反這樣的“讀-修改-寫(xiě)”指令。而讀引腳之前,先置1,然后用Mov A,Px之類的指令即可。
“資料稱: 這樣的指令才有 Read-Modify-Write 功效
ANL (logical AND, e.G., ANL P1,A)
ORL (logical OR, e.g., ORL P2,A)
XRL (logical EX-OR, e.g., XRL P3,A)
JBC (jump if bit = 1 and clear bit, e.g., JBC P1.1, LABEL)
CPL (complement bit, e.g., CPL P3.0)
INC (increment, e.g., INC P2)
DEC (decrement, e.g., DEC P2)
DJNZ (decrement and jump if not zero, e.g., DJNZ P3, LABEL)
MOV PX.Y,C(move carry bit to bit Y ofPORTX)
CLR PX.Y(clear bit Y ofPORTX)
SETB PX.Y(set bit Y ofPORTX)
”
(3)有沒(méi)有讀端口的指令(而不修改端口)?
可以說(shuō),沒(méi)有直接的讀端口的指令。無(wú)論之前是否置1,以下指令
MOV A, P1
MOV 20H, P1
MOV R0, P1
MOV @R0, P1
讀的都是引腳,盡管不一定讀準(zhǔn)確。
要想知道端口內(nèi)容,可以采用的方法是(以下代碼來(lái)源于網(wǎng)絡(luò)):
“
51端口鎖存器是能讀?。?!仿真機(jī)才會(huì)用到
READ_PORT_P1_REG2ACC:
L_06:
L_05:
L_11:
”
我們只需注意到上面方法中巧妙運(yùn)用的JB指令:
“JB P1.0, L_11 ; $+11 ; pin 為“1”時(shí),鎖存器肯定為“1””
(4)端口的內(nèi)容什么時(shí)候發(fā)生改變?當(dāng)Px口作為輸入,若外部引腳信號(hào)不斷變化,讀取引腳值之后,
端口內(nèi)容是否變化?
某網(wǎng)友的看法與我不謀而合:“
參考引腳內(nèi)部結(jié)構(gòu)圖可知,端口就是一個(gè)鎖存器,縱使鎖存器D口數(shù)據(jù)在變(內(nèi)部數(shù)據(jù)線),只要時(shí)鐘觸發(fā)端clk沒(méi)有觸發(fā)信號(hào),鎖存器中的內(nèi)容永遠(yuǎn)都不會(huì)改變,也就是說(shuō),不管外部引腳信號(hào)如何變,也不管執(zhí)行過(guò)多少次讀引腳操作,端口鎖存器中的內(nèi)容是不會(huì)發(fā)生變化的。
(5)端口上的內(nèi)容亦即反映到引腳上來(lái)嗎?
Px口如果作為輸出口,由引腳內(nèi)部結(jié)構(gòu)可知,端口內(nèi)容是直接反映到引腳上去的。這對(duì)于P1口更為直接。而其他口,由于有第二功能,是否作為I/O口受內(nèi)部控制信號(hào)的控制(注意mux)。
(6)什么時(shí)候是I/O口,什么時(shí)候是地址/數(shù)據(jù)口?
并非取決于硬件,而取決于當(dāng)前的狀態(tài)。例如:執(zhí)行任一條指令時(shí),這時(shí)候,在時(shí)序的不同階段,P1口輸出地址或讀取指令碼,這時(shí)候mux一定是倒向上面的(興許還受控于地址范圍?)。總之,系統(tǒng)自己會(huì)決定。但只要執(zhí)行了向P1口輸出的指令,鎖存器中的內(nèi)容一定會(huì)及時(shí)地傳遞到引腳上去的。
評(píng)論