單片機引腳與端口操作
以前寫過一篇也是關于單片機引腳的文章,寫的非常簡單,那時候的見解,今天再次看到單片機關于讀引腳和端口的操作時突然又是非常的不解,上網搜資料很多也都是關于單片機IO口結構的解釋,經過一番辛苦的搜索終于是找到了關于端口和引腳的資料,下面是我自己從各個方面總理的。
首先對于單片機IO口一般有第二功能,因為P0口比較特別以P0口為例說明。具體的單片機IO口結構和功能見:戳這里
1. P0口置1是怎么回事,什么時候置1?
單片機P0口作為輸入時需要先給鎖存器置1,以關閉V2場效應管,不置1的話當鎖存器的值為0時,V2導通接地使引腳的值為低,不能輸入高電平。至于怎么給P0口置1,就是給P0寄存器置1.
2. P0口怎么要接上拉電阻?有什么用?
見P0口結構圖可知,P0口作為通用IO口,即輸入輸出口時,需要把V1場效應管關閉,多功能開關連接到鎖存器,高電平信號通過鎖存器Q'端輸出時為低電平,V2管截止,V1,V2都截止,輸出既不是高電平又不是低電平,這就是漏極開路輸出。為了能夠輸出高電平需要外接上拉電阻。
3. 讀引腳和讀端口有什么不一樣?
讀引腳是讀P0口引腳上的電平信號,讀端口是讀鎖存器中的值,即就是讀P0口寄存器的值。作為輸出時引腳和端口的值是一樣的,但是作為輸入時因為外設可以影響引腳的值,所以端口和引腳的值作為輸入時可以不一樣。
4. 什么時候讀端口?什么時候讀引腳?各自的指令是什么?
一般的教科書上都會強調:讀端口的指令為端口內容取反這樣的“讀-修改-寫”指令。而讀引腳之前,先置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 of PORT X)
CLR PX.Y(clear bit Y of PORT X)
SETB PX.Y(set bit Y of PORT X)
”
有沒有讀端口的指令(而不修改端口)?
可以說,沒有直接的讀端口的指令。無論之前是否置1,以下指令
MOV A, P1
MOV 20H, P1
MOV R0, P1
MOV @R0, P1
讀的都是引腳,盡管不一定讀準確。
5. 端口的內容什么時候發(fā)生改變?當Px口作為輸入,若外部引腳信號不斷變化,讀取引腳值之后, 端口內容是否變化?
某網友的看法與我不謀而合:“ 由于復位后各引腳寄存器的值是明確的,而以后各引腳的寄存器的值的改變不會因為芯片外面而,影響到引腳寄存囂的值,引腳的寄存器的值只可能由程序來改變,所以就沒有必要只讀寄存器的值而不改變寄存器的內容了。 ”
參考引腳內部結構圖可知,端口就是一個鎖存器,縱使鎖存器D口數據在變(內部數據線),只要時鐘觸發(fā)端clk沒有觸發(fā)信號,鎖存器中的內容永遠都不會改變,也就是說,不管外部引腳信號如何變,也不管執(zhí)行過多少次讀引腳操作,端口鎖存器中的內容是不會發(fā)生變化的。
那么,端口內容何時變化?答曰:只要執(zhí)行過一次輸出,端口內容必為輸出值,因為端口就是輸出的數據鎖存器。
6. 端口上的內容亦即反映到引腳上來嗎?
Px口如果作為輸出口,由引腳內部結構可知,端口內容是直接反映到引腳上去的。這對于P1口更為直接。而其他口,由于有第二功能,是否作為I/O口受內部控制信號的控制
關于單片機其他IO口和P0差不多就不多說了,以后再繼續(xù)更新對IO口的理解,今天就先寫到這里,這里有些資料是引用別人的,在這里非常感謝大家的分享。
編輯:admin 最后修改時間:2018-05-19