新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)讀端口與讀引腳徹底研究(個(gè)人淺見)

51單片機(jī)讀端口與讀引腳徹底研究(個(gè)人淺見)

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
要弄清讀端口、讀引腳問題,思考以下問題:

本文引用地址:http://butianyuan.cn/article/201611/321609.htm

(1)引腳的結(jié)構(gòu)圖清楚嗎?

以上是P0口一位的結(jié)構(gòu)。以上結(jié)構(gòu)說明:讀引腳之前一定要對端口先置1,使mosfet V2截止,以免信號被拉低而讀錯(cuò),這一點(diǎn)很容易理解。

(2)什么指令讀端口?什么指令讀引腳?

一般的教科書上都會(huì)強(qiáng)調(diào):讀端口的指令為端口內(nèi)容取反這樣的“讀-修改-寫”指令。而讀引腳之前,先置1,然后用Mov A,Px之類的指令即可。以下是從web(http://www.dzsc.com/dzbbs/20061112/200765184756359377.html)上搜集的資料:

“資料稱: 這樣的指令才有 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端口鎖存器是能讀?。。》抡鏅C(jī)才會(huì)用到
READ_PORT_P1_REG2ACC:
CLR A ; MOV A, #0FFH
CPL A

JB P1.0, L_11 ; $+11 ; pin 為“1”時(shí),鎖存器肯定為“1”
JBC P1.0, L_06; $+ 6 ; 用JBCTEST鎖存器, 為“1”時(shí),跳
JBC ACC.0, L_05; $ + 5 ; == clr acc.0/ sjmp L_05
;用2周期/3bytes, 代替 3周期/4bytes
L_06:SETB P1.0; 恢復(fù) 鎖存器 為“1”
L_05:
L_11:

JB P1.1, $+11
JBC P1.1, $+ 6
JBC ACC.1, $ + 5
SETB P1.1

JB P1.2, $+11
JBC P1.2, $+ 6
JBC ACC.2, $ + 5
SETB P1.2

JB P1.3, $+11
JBC P1.3, $+ 6
JBC ACC.3, $ + 5
SETB P1.3

JB P1.4, $+11
JBC P1.4, $+ 6
JBC ACC.4, $ + 5
SETB P1.4

JB P1.5, $+11
JBC P1.5, $+ 6
JBC ACC.5, $ + 5
SETB P1.5

JB P1.6, $+11
JBC P1.6, $+ 6
JBC ACC.6, $ + 5
SETB P1.6

JB P1.7, $+11
JBC P1.7, $+ 6
JBC ACC.7, $ + 5
SETB P1.7

RET

我們只需注意到上面方法中巧妙運(yùn)用的JB指令:

“JB P1.0, L_11 ; $+11 ; pin 為“1”時(shí),鎖存器肯定為“1””

(4)端口的內(nèi)容什么時(shí)候發(fā)生改變?當(dāng)Px口作為輸入,若外部引腳信號不斷變化,讀取引腳值之后,

端口內(nèi)容是否變化?

某網(wǎng)友的看法與我不謀而合:“由于復(fù)位后各引腳寄存器的值是明確的,而以后各引腳的寄存器的值的改變不會(huì)因?yàn)樾酒饷娑?影響到引腳寄存囂的值,引腳的寄存器的值只可能由程序來改變,所以就沒有必要只讀寄存器的值而不改變寄存器的內(nèi)容了。”

參考引腳內(nèi)部結(jié)構(gòu)圖可知,端口就是一個(gè)鎖存器,縱使鎖存器D口數(shù)據(jù)在變(內(nèi)部數(shù)據(jù)線),只要時(shí)鐘觸發(fā)端clk沒有觸發(fā)信號,鎖存器中的內(nèi)容永遠(yuǎn)都不會(huì)改變,也就是說,不管外部引腳信號如何變,也不管執(zhí)行過多少次讀引腳操作,端口鎖存器中的內(nèi)容是不會(huì)發(fā)生變化的。

那么,端口內(nèi)容何時(shí)變化?答曰:只要執(zhí)行過一次輸出,端口內(nèi)容必為輸出值,因?yàn)槎丝诰褪禽敵龅臄?shù)據(jù)鎖存器。

(5)端口上的內(nèi)容亦即反映到引腳上來嗎?

Px口如果作為輸出口,由引腳內(nèi)部結(jié)構(gòu)可知,端口內(nèi)容是直接反映到引腳上去的。這對于P1口更為直接。而其他口,由于有第二功能,是否作為I/O口受內(nèi)部控制信號的控制(注意mux)。

(6)什么時(shí)候是I/O口,什么時(shí)候是地址/數(shù)據(jù)口?

并非取決于硬件,而取決于當(dāng)前的狀態(tài)。例如:執(zhí)行任一條指令時(shí),這時(shí)候,在時(shí)序的不同階段,P1口輸出地址或讀取指令碼,這時(shí)候mux一定是倒向上面的(興許還受控于地址范圍?)??傊到y(tǒng)自己會(huì)決定。但只要執(zhí)行了向P1口輸出的指令,鎖存器中的內(nèi)容一定會(huì)及時(shí)地傳遞到引腳上去的。



關(guān)鍵詞: 51單片機(jī)讀端口讀引

評論


技術(shù)專區(qū)

關(guān)閉