51單片機(jī)讀端口與讀引腳徹底研究(個人淺見)
(1)引腳的結(jié)構(gòu)圖清楚嗎?
以上是P0口一位的結(jié)構(gòu)。以上結(jié)構(gòu)說明:讀引腳之前一定要對端口先置1,使mosfet V2截止,以免信號被拉低而讀錯,這一點很容易理解。
(2)什么指令讀端口?什么指令讀引腳?
一般的教科書上都會強(qiáng)調(diào):讀端口的指令為端口內(nèi)容取反這樣的“讀-修改-寫”指令。而讀引腳之前,先置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)有沒有讀端口的指令(而不修改端口)?
可以說,沒有直接的讀端口的指令。無論之前是否置1,以下指令
MOV A, P1
MOV 20H, P1
MOV R0, P1
MOV @R0, P1
讀的都是引腳,盡管不一定讀準(zhǔn)確。
要想知道端口內(nèi)容,可以采用的方法是(以下代碼來源于網(wǎng)絡(luò)):
“
51端口鎖存器是能讀取??!仿真機(jī)才會用到
READ_PORT_P1_REG2ACC:
L_06:
L_05:
L_11:
”
我們只需注意到上面方法中巧妙運用的JB指令:
“JB P1.0, L_11 ; $+11 ; pin 為“1”時,鎖存器肯定為“1””
(4)端口的內(nèi)容什么時候發(fā)生改變?當(dāng)Px口作為輸入,若外部引腳信號不斷變化,讀取引腳值之后,
端口內(nèi)容是否變化?
某網(wǎng)友的看法與我不謀而合:“
參考引腳內(nèi)部結(jié)構(gòu)圖可知,端口就是一個鎖存器,縱使鎖存器D口數(shù)據(jù)在變(內(nèi)部數(shù)據(jù)線),只要時鐘觸發(fā)端clk沒有觸發(fā)信號,鎖存器中的內(nèi)容永遠(yuǎn)都不會改變,也就是說,不管外部引腳信號如何變,也不管執(zhí)行過多少次讀引腳操作,端口鎖存器中的內(nèi)容是不會發(fā)生變化的。
(5)端口上的內(nèi)容亦即反映到引腳上來嗎?
Px口如果作為輸出口,由引腳內(nèi)部結(jié)構(gòu)可知,端口內(nèi)容是直接反映到引腳上去的。這對于P1口更為直接。而其他口,由于有第二功能,是否作為I/O口受內(nèi)部控制信號的控制(注意mux)。
(6)什么時候是I/O口,什么時候是地址/數(shù)據(jù)口?
并非取決于硬件,而取決于當(dāng)前的狀態(tài)。例如:執(zhí)行任一條指令時,這時候,在時序的不同階段,P1口輸出地址或讀取指令碼,這時候mux一定是倒向上面的(興許還受控于地址范圍?)??傊?,系統(tǒng)自己會決定。但只要執(zhí)行了向P1口輸出的指令,鎖存器中的內(nèi)容一定會及時地傳遞到引腳上去的。
評論