<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2016-11-26 來源:網絡 收藏
          要弄清讀端口讀引腳問題,思考以下問題:

          本文引用地址:http://www.ex-cimer.com/article/201611/321609.htm

          (1)引腳的結構圖清楚嗎?

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

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

          一般的教科書上都會強調:讀端口的指令為端口內容取反這樣的“讀-修改-寫”指令。而讀引腳之前,先置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

          讀的都是引腳,盡管不一定讀準確。

          要想知道端口內容,可以采用的方法是(以下代碼來源于網絡):

          51端口鎖存器是能讀取?。》抡鏅C才會用到
          READ_PORT_P1_REG2ACC:
          CLR A ; MOV A, #0FFH
          CPL A

          JB P1.0, L_11 ; $+11 ; pin 為“1”時,鎖存器肯定為“1”
          JBC P1.0, L_06; $+ 6 ; 用JBCTEST鎖存器, 為“1”時,跳
          JBC ACC.0, L_05; $ + 5 ; == clr acc.0/ sjmp L_05
          ;用2周期/3bytes, 代替 3周期/4bytes
          L_06:SETB P1.0; 恢復 鎖存器 為“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

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

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

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

          端口內容是否變化?

          某網友的看法與我不謀而合:“由于復位后各引腳寄存器的值是明確的,而以后各引腳的寄存器的值的改變不會因為芯片外面而,影響到引腳寄存囂的值,引腳的寄存器的值只可能由程序來改變,所以就沒有必要只讀寄存器的值而不改變寄存器的內容了。”

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

          那么,端口內容何時變化?答曰:只要執(zhí)行過一次輸出,端口內容必為輸出值,因為端口就是輸出的數(shù)據(jù)鎖存器。

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

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

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

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



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();