PIC16與PIC18的I/O--lat寄存器的解釋
用pic16的時候設(shè)計端口操作時,一般也就涉及一個trisx和portx寄存器,trisx用來設(shè)置端口方向,portx用來寫數(shù)據(jù)和讀取數(shù)據(jù),開始玩pic18的時候發(fā)現(xiàn)端口操作的時候多了一個latx寄存器,而它偏偏又和portx這么像,剛開始的時候確實蒙了。后來看看數(shù)據(jù)手冊里面的io結(jié)構(gòu)框圖,慢慢才明白了lat寄存器的作用。下面先上圖:16和18的io結(jié)構(gòu)框圖,取自數(shù)據(jù)手冊
pic18:
pic16:
從上圖可以看出,在16系列里面,通過一個trisx設(shè)置為輸出的時候,portx的值在每次一次來wr portx指令脈沖的時候輸出到io管腳。如果trisx設(shè)置為輸入則上端的或門和與門關(guān)閉,管腳狀態(tài)通過輸入緩沖器加到下方的D觸發(fā)器,每次來一個rd portx指令脈沖,管教狀態(tài)鎖存到portx寄存器中,所以不關(guān)輸入輸出,只要trisx和portx就可以搞定了,輸入的時候讀管腳電平就讀portx。
但是在pic18中,我們發(fā)現(xiàn)多了一個數(shù)據(jù)鎖存寄存器,就是latx,輸出數(shù)據(jù)的時候,trisx設(shè)置為輸出,每來一個wr lat或者wr port指令脈沖,數(shù)據(jù)總線上的數(shù)據(jù)輸出到io管腳,這個時候可以看到lat和port用法是很相似的。但是,重點在讀管腳數(shù)據(jù)的時候。只有讀取port讀到的才是真正的管腳電平,由圖可以看出,rd port指令脈沖來的時候,管腳端平鎖存到port中,也就是說要想獲得正確的管腳狀態(tài),只有讀取port寄存器,而如果去讀lat寄存器,讀到的輸出鎖存器的值,比如說你一開始設(shè)置管腳成輸出,通過lat輸出了一個0x55,然后你設(shè)置管腳成輸出,這個時候管腳電平再外部電路的驅(qū)動下發(fā)生了變化編程了0x66,這個時候你讀port才能讀到0x66,而如果你去讀lat則讀到的是你上一次輸出值,不是當(dāng)前時刻管腳電平狀態(tài)。這也就是lat和port的不同之所在。所以在做pic18的時候我們應(yīng)該養(yǎng)成寫則寫lat,讀則讀port的好習(xí)慣,當(dāng)然,至于microchip在pic18為什么要多設(shè)置一個這個lat肯定是有他的用意的,至于這個為什么,我暫時也還沒有想通,百度一下說是什么讀-修改-寫操作相關(guān)之類的,講的不是很清楚,等以后摸索明白了在寫到blog里面。