PIC中檔系列單片機,每條指令14位,共有35條彙編指令,根據操作對象不同,可將其分為三類: 位元組操作類指令 位操作類指令 立即數與控制類操作指令 1、位元組操作類指令,以MOVF指令為例: 指令:MOVF f, d 說明: 功能:寄存器f值傳送; MOVF為助記符,即操作指令,大小寫均可; f代表文 ...
PIC中檔系列單片機,每條指令14位,共有35條彙編指令,根據操作對象不同,可將其分為三類:
- 位元組操作類指令
- 位操作類指令
- 立即數與控制類操作指令
1、位元組操作類指令,以MOVF指令為例:
指令:MOVF f, d
說明:
- 功能:寄存器f值傳送;
- MOVF為助記符,即操作指令,大小寫均可;
- f代表文件寄存器標識符,即RAM寄存器(PIC單片機基礎1中有說明),取值範圍為[0, 127]
- d代表目標標識符,表明指令操作的結果放在何處;
d=0:操作的結果放在W寄存器中;
d=1:操作的結果放在f寄存器中;
- 影響狀態位:Z
- 指令周期:1(執行本指令需要的時間)
實例1:
假設執行指令前,F寄存器22H的值為05H,W寄存器內的值為00H
MOVF 22H, 0
由於d=0,指令執行後結果存入W寄存器:
22H(F寄存器)= 05H;
W = 05H;
Z = 0;
指令應用:由於PIC指令中,不存在F寄存器之間的值傳遞操作指令,這種操作需要藉助W寄存器作為中介,並且此指令也可以直接給W寄存器賦值;
實例2:
假設執行指令前,F寄存器22H的值為05H,W寄存器內的值為00H
MOVF 22H, 1
由於d=1,指令執行後結果存入F寄存器(即22H):
22H(F寄存器)= 05H;
W = 00H;
Z = 0;
指令應用:指令操作以後,寄存器值大小、位置都沒變,那麼這種指令有什麼用呢?答案是:通過狀態位Z判斷寄存器的值是不是0。
在PIC的彙編指令中,我們沒有高級語言中if (var == 0)這樣方便的判斷操作,想要判斷一個寄存器的值是不是0,只有通過狀態寄存器中的Z位來判斷。當某條可以影響Z狀態位的指令執行後,如果Z=0,則說明指令執行的結果非0;如果Z=1,則說明執行的結果為0。
上面的指令操作後Z=0,所以判斷22H中的值非0。
2、位操作類指令,以BCF指令為例:
指令:BCF f, b
說明:
- 功能:f寄存器的位b清零;
- BCF和f不在贅述,命令中的b表示f寄存器的位b,從零開始,取值範圍為0~7;
- 影響狀態位:無(PIC的所有位操作指令都不影響狀態位);
- 指令周期:1;
示例:
假設執行指令前,FLAG_REG寄存器的值為0xFF(1111 1111b)
BCF FLAG_REG, 3
註意:位是從0開始的,指令中的位3,實際對應的是寄存器的第四位
執行後:
FLAG_REG = 0xF7(1111 0111b)
指令應用:在程式中,我們經常會用到很多標誌位,通過標誌位來確定某項功能的當前狀態,標誌位的狀態可通過位操作實現。
3、立即數與控制類操作指令,以MOLW指令為例:
指令:MOVLW k
說明:
- 功能:立即數k送入W寄存器;
- K為立即數,取值範圍為[0, 255];
- 影響狀態位:無;
- 指令周期:1;
以下通過兩個具體示例,說明對於立即數k的理解:
示例1:
假設執行指令前W寄存器值為00H
MOVLW 30H
執行後:
W = 30H
這種操作,明顯直接。
示例2:
假設執行指令前寄存器UD_REG的地址為25H,寄存器的值為45H,W寄存器的值為00H
MOVLW UD_REG
執行後:
W = 25H
先說一下寄存器、寄存器地址、寄存器值、寄存器名的關係:
寄存器:我們可以把它當做一個個的盒子;
寄存器地址:由於盒子(寄存器)太多,我們需要給每個盒子加一個編號,00,01,…,這樣便於我們描述要找的是哪一個盒子,這個編號就是寄存器地址;
寄存器值:在這些盒子裡面,我們可以放鞋子、襪子…,這些放在盒子裡面的東西就是寄存器的值;
寄存器名:為了讓人便於知道盒子裡面裝的是什麼,我們可以給盒子起一個別名,比如01編號裡面裝的是運動鞋,那麼可以把它叫做運動鞋盒,以後說運動鞋盒,就是指01編號盒子,上面的UD_REG就是這個道理;
在示例2中,執行指令後W寄存器的值是寄存器UD_REG的地址。所以在執行此類操作時,一定要小心謹慎,不能被寄存器的值忽悠了。
以上是對三類命令的大體分析,完整的指令列表詳見單片機的數據手冊或指令集說明手冊。