你知道真正的「讀引腳」和「讀鎖存器」指令的區別嗎
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///
某些指令說明
-「讀引腳」和「讀鎖存器」指令的區別
.關於並行I/O口的「讀引腳」和「讀鎖存器」指令的區別
例如,當P1口的P1.0引腳外接一個發光二極管LED的陽極,LED的陰極接地。
若想查看一下單片機剛才向P1.x腳輸出的信息是「0」還是「1」,如果直接讀引腳,結果顯然錯誤。
-「讀引腳」和「讀鎖存器」指令的區別
正確做法是讀D鎖存器的Q端狀態,那裡儲存的才是前一時刻送給P1.0的真實值。就是說,凡遇「讀取P1口前一狀態以便修改後再送出」的情形,都應當「讀鎖存器」的Q端信息,而不是讀取引腳的信息。
當P1口外接輸入設備時,要想P1口引腳上反映真實的輸入信號,必須要設法先讓該引腳內部的場效應管截止才行,否則當場效應管導通時,P1口引腳上將永遠為低電平,無法正確反映外設的輸入信號。讓場效應管截止,就是用指令給P1口的相應位送一個「1」電平,這就是為什麼讀引腳之前,一定要先送出「1」的原因。
-「讀引腳」和「讀鎖存器」指令的區別
指令「MOV C,P1.0」讀的是P1.0腳,同樣,指令「MOV A,P1」也是讀引腳指令,讀引腳指令之前一定要有向P1.0寫「1」的指令。而指令「CPL P1.0」則是「讀鎖存器」,也即「讀-修改-寫」指令,它會先讀P1.0的鎖存器的Q端狀態,接著取反,然後再送到P1.0引腳上。而指令「ANL P1,A」也是「讀鎖存器」命令。類似的「讀-修改-寫」指令舉例如下:
INC P1
XRL P3,A
ORL P2,A
ANL P1,A
CPL P3.0
-操作數的位元組地址和位地址的區分問題
關於操作數的位元組地址和位地址的區分問題
如何區別指令中出現的位元組變量和位變量?
例如指令「MOV C,40H」和指令「MOV A,40H」兩條指令中源操作數「40H」都是以直接地址形式給出的,「40H」是位元組地址還是位地址?對於助記符相同指令,觀察操作數就可看出。顯然前條指令中的「40H」肯定是位地址,因為目的操作數C是位變量。後條指令的「40H」是位元組地址,因為目的操作數A是位元組變量。
-累加器A與Acc的書寫問題
.關於累加器A與Acc的書寫問題
累加器可寫成A,或Acc,區別是什麼?
Acc彙編後的機器碼必有一個位元組的操作數是累加器的位元組地址E0H,A彙編後則隱含在指令操作碼中。例如:「INC A」的機器碼,查指令表是04H。如寫成「INC Acc」後,則成了「INC direct」的格式,再查指令表,對應的機器碼為「05H E0H」。
-累加器A與Acc的書寫問題
.關於累加器A與Acc的書寫問題
在對累加器A的直接尋址和累加器A的某一位尋址要用Acc,不能寫成A。例如:
指令「POP Acc」不能寫成「POP A」;
指令「SETB Acc.0」,不能寫成「SETB A.0」。
-書寫兩位16進位數據前要加「0"
.書寫兩位16進位數據前要加「0」
經常遇到必須在某些數據或地址的前面多填一個「前導」0,否則彙編就通不過?這是彙編語言的嚴格性和規範性的體現。由於部分十六進位數是用字母來表示的,而程序內的標號也常用字母表示,為將標號和數據區分開,幾乎所有的彙編語言都規定:凡是以字母開頭(對十六進位數而言,就是A~F開頭)的數字量,應當在前面添加一個數字「0」。至於地址量,它也是數據量的一種,前面也應該添加「0」。
例如:
MOV A,#0F0H;「F0」以字母開頭的數據量
MOV A,0F0H;「F0」以字母開頭的地址量
如不加「前導」0,就會把字母開頭的數據量當作標號來處理,從而出錯以及不能通過彙編。指令系統匯總
·指令條數多,不宜死記硬背,應在程序的編寫中,多加練習,在實踐中不斷掌握和鞏固常用的指令。