PIC指令
指令 | 指令說明 | 影響旗號 | 參考說明頁數 | |||
位元組運算指令 (BYTE-ORIENTED FILE REGISTER OPERATIONS) | ||||||
ADDWF | f, d, a | 將W與f做相加,並將結果放至W或f。 | C, DC, Z, OV, N | 7 | ||
ADDWFC | f, d, a | 將W與C做相加,並將結果放至W或f。 | C, DC, Z, OV, N | 10 | ||
ANDWF | f, d, a | 將W與f做AND運算,並將結果放至W或f。 | Z, N | 14 | ||
CLRF | f, a | 將f內的值都清為0。 | Z | 31 | ||
COMF | f, d, a | 將f內的值取補數,並將結果放至W或f。 | Z, N | 33 | ||
CPFSEQ | f, a | 若f與W的值相等,則跳過下一個指令。 | 無 | 35 | ||
CPFSGT | f, a | 若f大於W,則跳過下一個指令。 | 無 | 36 | ||
CPFSLT | f, a | 若f小於W,則跳過下一個指令。 | 無 | 37 | ||
DECF | f, d, a | 將f內的值減1,並將結果放至W或f。 | C, DC, Z, OV, N | 40 | ||
DECFSZ | f, d, a | 將f內的值減1,若為0則跳過下一個指令,並將結果放至W或f。 | 無 | 43 | ||
DCFSNZ | f, d, a | 將f內的值減1,若不為0則跳過下一個指令,並將結果放至W或f。 | 無 | 45 | ||
INCF | f, d, a | 將f內的值加1,並將結果放至W或f。 | C, DC, Z, OV, N | 48 | ||
INCFSZ | f, d, a | 將f內的值加1,若為0則跳過下一個指令,並將結果放至W或f。 | 無 | 51 | ||
INFSNZ | f, d, a | 將f內的值加1,若不為0則跳過下一個指令,並將結果放至W或f。 | 無 | 53 | ||
IORWF | f, d, a | 將W與f做OR運算,並將結果放至W或f。 | Z, N | 57 | ||
MOVF | f, d, a | 將f內的值搬到W或f。 | Z, N | 61 | ||
MOVFF | 將內的資料搬到中。 | 無 | 63 | |||
MOVWF | f, a | 將W內的值搬到f中。 | 無 | 66 | ||
MULWF | f, a | 將W與f做相乘。 | 無 | 68 | ||
NEGF | f, a | 將f內的值取2的補數。 | C, DC, Z, OV, N | 70 | ||
RLCF | f, d, a | 將f內的值與C一起做左移動作,並將結果放至W或f。 | C, Z, N | 80 | ||
RLNCF | f, d, a | 將f內的值做左移動作,並將結果放至W或f。 | Z, N | 82 | ||
RRCF | f, d, a | 將f內的值與C一起做右移動作,並將結果放至W或f。 | C, Z, N | 84 | ||
RRNCF | f, d, a | 將f內的值做右移動作,並將結果放至W或f。 | Z, N | 86 | ||
SETF | f, a | 將f內的值設為0xFF。 | 無 | 88 | ||
SUBFWB | f, d, a | 將W內的值減掉C及f,並將結果放至W或f。 | C, DC, Z, OV, N | 90 | ||
SUBWF | f, d, a | 將W內的值減掉f,並將結果放至W或f。 | C, DC, Z, OV, N | 94 | ||
SUBWFB | f, d, a | 將f內的值減掉W及C,並將結果放至W或f。 | C, DC, Z, OV, N | 96 | ||
SWAPF | f, d, a | 將f內的值高4位元與低4位元對調,並將結果放至W或f。 | 無 | 98 | ||
TSTFSZ | f, a | 測試f內的值是否等於0,若為0則跳過下一個指令。 | 無 | 105 | ||
XORWF | f, d, a | 將W與f做XOR運算,並將結果放至W或f。 | Z, N | 108 | ||
位元運算指令 (BIT-ORIENTED FILE REGISTER OPERATIONS) | ||||||
BCF | f, b, a | 將f內某個位元 (Bit) 設定為0。 | 無 | 17 | ||
BSF | f, b, a | 將f內某個位元 (Bit) 設定為1。 | 無 | 24 | ||
BTFSC | f, b, a | 測試f內某個位元 (Bit) 的值是否等於0,若為0則跳過下一個指令。 | 無 | 25 | ||
BTFSS | f, b, a | 測試f內某個位元 (Bit) 的值是否等於1,若為1則跳過下一個指令。 | 無 | 26 | ||
BTG | f, d, a | 將f內某個位元 (Bit) 做NOT運算。 | 無 | 27 | ||
Note: | Ff表示暫存器。 | Fd表示資料存放的地方,d = 0表示存放在W累加器;d = 1表示存放在f暫存器。 | ||||
Fb表示暫存器的第b個位元。 | ||||||
Fk表示8位元常數。 | Fa表示資料存放在那個記憶體位置,a = 0表示放在目前的記憶體位置;a = 1表示放在BSR暫存器內所指定的記憶體位置。 | |||||
Fn表示程式記憶體的位址。 | ||||||
PIC18系列家族指令快速索引 (續)
指令 | 指令說明 | 影響旗號 | 參考說明頁數 | |||
程式流程控制指令 (CONTROL OPERATIONS) | ||||||
BC | n | 若C = 1則跳到位址n去。 | 無 | 16 | ||
BN | n | 若N = 1則跳到位址n去。 | 無 | 18 | ||
BNC | n | 若C = 0則跳到位址n去。 | 無 | 19 | ||
BNN | n | 若N = 0則跳到位址n去。 | 無 | 20 | ||
BNOV | n | 若OV = 0則跳到位址n去。 | 無 | 21 | ||
BNZ | n | 若Z = 0則跳到位址n去。 | 無 | 22 | ||
BOV | n | 若OV = 1則跳到位址n去。 | 無 | 28 | ||
BRA | n | 無條件跳到位址n去 () 。 | 無 | 23 | ||
BZ | n | 若Z = 1則跳到位址n去。 | 無 | 29 | ||
CALL | n, s | 將下一個指令的PC值存到堆疊的最上層,並跳到位址n去 () 。 | 無 | 30 | ||
CLRWDT | 將看門狗計時器清為0。 | 無 | 32 | |||
DAW | 將W內的值做BCD調整。 | 無 | 38 | |||
GOTO | n | 無條件跳到位址n去 () 。 | 無 | 47 | ||
NOP | 空指令。 | 無 | 72 | |||
POP | 將堆疊最上層的值取出來。 | 無 | 73 | |||
PUSH | 將下一個指令的PC值存到堆疊的最上層。 | 無 | 74 | |||
RCALL | n | 將下一個指令的PC值存到堆疊的最上層,並跳到位址n去 () 。 | 無 | 75 | ||
RESET | 利用軟體將系統重置。 | 無 | 76 | |||
RETFIE | s | 由中斷副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執行。 | 無 | 77 | ||
RETURN | s | 由副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執行。 | 無 | 79 | ||
SLEEP | 進入睡眠狀態。 | 無 | 89 | |||
Note: | Ff表示暫存器。 | Fd表示資料存放的地方,d = 0表示存放在W累加器;d = 1表示存放在f暫存器。 | ||||
Fb表示暫存器的第b個位元。 | ||||||
Fk表示8位元常數。 Fn表示程式記憶體的位址。 | Fa表示資料存放在那個記憶體位置,a = 0表示放在目前的記憶體位置;a = 1表示放在BSR暫存器內所指定的記憶體位置。 | |||||
PIC18系列家族指令快速索引 (續)
指令 | 指令說明 | 影響旗號 | 參考說明頁數 | |||
立即常數定址 (LITERAL OPERATIONS) | ||||||
ADDLW | k | 將常數k與W做相加。 | C, DC, Z, OV, N | 4 | ||
ANDLW | k | 將常數k與W做AND運算。 | Z, N | 12 | ||
IORLW | k | 將常數k與W做OR運算。 | Z, N | 55 | ||
LFSR | f, k | 將常數k (12-bit) 搬到第f個FSR暫存器去 (f = 0 ~ 2 ) 。 | 無 | 59 | ||
MOVLB | k | 將常數k搬到BSR暫存器去。 | 無 | 64 | ||
MOVLW | k | 將常數k搬到W去。 | 無 | 65 | ||
MULLW | k | 將常數k與W做乘法運算。 | 無 | 67 | ||
RETLW | k | 將堆疊最上層的值取出來放至PC中,並將W的值設為k () ,而主程式由目前PC值開始執行。 | 無 | 78 | ||
SUBLW | k | 將常數k與W做減法。 | C, DC, Z, OV, N | 92 | ||
XORLW | k | 將常數k與W做XOR運算。 | Z, N | 106 | ||
程式記憶體讀寫指令 (DATA MEMORY <-> PROGRAM MEMORY OPERATIONS) | ||||||
TBLRD* | 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。 | 無 | 99 | |||
TBLRD*+ | 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動加1。 | 無 | 99 | |||
TBLRD*- | 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動減1。 | 無 | 99 | |||
TBLRD+* | 先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。 | 無 | 99 | |||
TBLWT* | 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。 | 無 | 102 | |||
TBLWT*+ | 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動加1。 | 無 | 102 | |||
TBLWT*- | 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動減1。 | 無 | 102 | |||
TBLWT+* | 先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。 | 無 | 102 | |||
Note: | Ff表示暫存器。 | Fd表示資料存放的地方,d = 0表示存放在W累加器;d = 1表示存放在f暫存器。 | ||||
Fb表示暫存器的第b個位元。 | ||||||
Fk表示8位元常數。 Fn表示程式記憶體的位址。 | Fa表示資料存放在那個記憶體位置,a = 0表示放在目前的記憶體位置;a = 1表示放在BSR暫存器內所指定的記憶體位置。 | |||||
指令名稱:ADDLW
原 意:ADD literal to W
語 法:[label] ADDLW k
運 算 元:
運算說明:(W) + K -> W
影響旗標:N, OV, C, DC, Z
指令說明:W累加器中的值與k值相加,並將運算結果放回W累加器中。
類 別:立即常數定址法。
組 別:數學運算加法指令。
範例一:
ADDLW 0x11 ;將0x11的值與W累加器相加,結果放回W累加器中。
執行前:
W = 0x1F ;假設執行前W累加器的值為0x1F。
N = OV = C = DC = Z = 0 ;假設執行前狀態暫存器的值皆為0。
執行後:
W = 0x30 ;執行後W累加器的值為0x30。
N = OV = C = 0,DC = 1 ;半進位旗標等於1,因為低四位元相加之後有進位的情形發生,因此半進位旗標DC等於1其餘旗標狀態不變。
範例二:
ADDLW 0x11 ;將0x11的值與W累加器相加,結果放回W累加器中。
執行前:
W = 0x7F ;假設執行前W累加器的值為0x7F。
N = OV = C = DC = Z = 0 ;假設執行前狀態暫存器的值皆為0。
執行後:
W = 0x90 ;執行後W累加器的值為0x90。
N = OV = DC = 1,Z = C = 0 ;半進位旗標DC等於1,因為低四位元相加後有進位情形發生;溢位旗標OV等於1,因為兩數相加後第7個位元有進位情形發生;負號旗標N等於1,因為兩數 相加後結果大於127,因為使用2的補數作運算,所以結果大於127便算是負號。
範例三:
ADDLW 0x11 ;將0x11的值與W累加器相加,結果放回W累加器中。
執行前:
W = 0x9F ;假設執行前W累加器的值為0x9F。
N = OV = C = DC = Z = 0 ;假設執行前狀態暫存器的值皆為0。
執行後:
W = 0xB0 ;執行後W累加器的值為0xB0。
N = DC = 1,OV = Z = C = 0 ;半進位旗標DC等於1,因為低四位元相加後有進位情形發生;負號旗標N等於1,因為使用2的補數作運算,因此兩數相加後結果大於127,N等於1。範例 二與範例三之不同是在於範例二在相加前第七個位元為0,相加後第七個位元為1,因此溢位旗標OV等於1 (根據Microchip的定義) ,而範例三不同的是在相加前第七個位元為1,相加後第七個位元為1,因此溢位旗標OV不變,依然是等於0。
範例四:
ADDLW 0x01 ;將0x01的值與W累加器相加,結果放回W累加器中。
執行前:
W = 0xFF ;假設執行前W累加器的值為0xFF。
N = OV = C = DC = Z = 0 ;假設執行前狀態暫存器的值皆為0。
執行後:
W = 0x00 ;執行後W累加器的值為0x00,因為累加器為8 bits的暫存器,因此相加後結果超過255 (0xFF) 便會歸0。
N = OV = 0,C = DC = Z = 1 ;由於兩數相加後結果超過255 (0xFF) ,因此進位旗標C會被設定為1;又相加後W累加器的值為0x00,因此零位旗標Z會被設定為1;又由於低四位元相加後有進位情形發生,因此半進位旗標DC 被設定為1。
指令名稱:ADDWF
原 意:ADD W to f
語 法:[label] ADDWF f , d, a
運 算 元:
運算說明:(W) + (f) -> dest
影響旗標:N, OV, C, DC, Z
指 令說明:W累加器中的值與f暫存器中的值相加,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉移指令。
組 別:數學運算加法指令。
範例一:
ADDWF REG, 0, 0 ;將暫存器 (REG) 的值與W累加器的值相加,結果放回W累加器中。
執行前:
W = 0x11 ;假設執行前W累加器的值為0x11。
REG = 0x0F ;假設執行前REG暫存器的值為0x0F。
N = OV = C = DC = Z = 0 ;假設執行前狀態暫存器的值皆為0。
執行後:
W = 0x20
REG = 0x0F
N = OV = C = Z = 0,DC = 1
Ø結果放回W累加器中。
範例二:
ADDWF REG, W, 0
執行前:
W = 0x17
REG = 0xC2
N = OV = C = DC = Z = 0
執行後:
W = 0xD9
REG = 0xC2
N = OV = C = DC = Z = 0
Ø結果放回W累加器中。
範例三:
ADDWF REG, F, 1 (if BSR = 0x01)
執行前:
W = 0x17
REG = 0xC2
N = OV = C = DC = Z = 0
執行後:
W = 0x17
REG = 0xC2
RAM位址100 = 0xD9
N = OV = C = DC = Z = 0
Ø結果放在BSR暫存器所指定的位址中。
範例四:
ADDWF REG, W
執行前:
W = 0x17
REG = 0xC2
N = OV = C = DC = Z = 0
執行後:
W = 0xD9
REG = 0xC2
N = OV = C = DC = Z = 0
Ø結果放回W累加器中。
範例五:
ADDWF REG, F
執行前:
W = 0x01
REG = 0x10
N = OV = C = DC = Z = 0
執行後:
W = 0x01
REG = 0x11
N = OV = C = DC = Z = 0
Ø結果放回暫存器中。
指令名稱:ADDWFC
原 意:ADD W and Carry bit to f
語 法:[label] ADDWFC f , d, a
運 算 元:
運算說明:(W) + (f) + (c) -> dest
影響旗標:N, OV, C, DC, Z
指 令說明:W累加器中的值與f暫存器中的值與進位旗標三者相加,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到f所指定的暫存器中;若a = 1為不存在狀態。
類 別:資料轉移指令。
組 別:數學運算加法指令。
範例一:
ADDWFC REG, 0, 1
執行前:
W = 0x4D
REG = 0x02
Carry=1
N = OV = DC = Z = 0
執行後:
W = 0x50
REG = 0x02
Carry=0
N = OV = DC = Z = 0
Ø結果放回W累加器中,進位旗標C = 0。
範例二:
ADDWFC REG, F, 0
執行前:
W = 0x4D
REG = 0x02
Carry=1
N = OV = DC = Z = 0
執行後:
W = 0x4D
REG = 0x50
Carry=0
N = OV = DC = Z = 0
Ø結果放回暫存器中,進位旗標C = 0。
指令名稱:ANDLW
原 意:AND literal with W
語 法:[label] ANDLW k
運 算 元:
運算說明:(W) .AND. k -> W
影響旗標:N, Z
指令說明:W累加器中的值與k值做邏輯的AND運算,並將運算結果放回W累加器中。
類 別:立即常數定址法。
組 別:邏輯運算AND指令。
範例一:
ANDLW 0x5F
執行前:
W = 0xA3 = 10100011
N = Z = 0
執行後:
W = 0x03
N = Z = 0
範例二:
ANDLW 0x00
執行前:
W = 0x5F = 01011111
N = Z = 0
執行後:
W = 0x00
N = 0;Z=1
指令名稱:ANDWF
原 意:AND W with f
語 法:[label] ANDWF f , d, a
運 算 元:
運算說明:(W) .AND. (f) -> dest
影響旗標:N, Z
指 令說明:W累加器中的值與f暫存器中的值做邏輯AND運算,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到f所指定的暫存器中;若a = 1不存在 (系統預設值) 。
類 別:邏輯運算指令。
組 別:邏輯運算AND指令。
範例一:
ANDWF REG, 0, 0
執行前:
W = 0x17
REG = 0xC2
N = Z = 0
執行後:
W = 0x02
REG = 0xC2
N = Z = 0
Ø結果放回W累加器中。
範例二:
ANDWF REG, F
執行前:
W = 0x01
REG = 0xFF
N = Z = 0
執行後:
W = 0x01
REG = 0x01
N = Z = 0
Ø結果放回暫存器中。
指令名稱:BC
原 意:Branch if Carry
語 法:[label] BC label name
運 算 元:
運算說明:If carry bit is ‘1’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的進位旗標C等於1時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BC Lab1 ;若是進位旗標C等於1就跳到Lab1的位址,若是進位旗標C不等於1則程式往下執行。
執行前:
PC = 在目前Here的位址
C = 1
執行後:
PC = 跳到Lab1的位址
C = 1
指令名稱:BCF
原 意:Bit Clear f
語 法:[label] BCF f, b
運 算 元:
運算說明:0 -> f < b >
影響旗標:無
指令說明:將暫存器中的某一個位元清除為0。
類 別:位元定址指令。
組 別:單一位元清除指令。
範例一:
BCF REG,2 ;將REG暫存器的第2個位元清除為0。
執行前:
REG = 11111111 = 0xFF ;REG暫存器的值為0xFF。
執行後:
REG = 11111011 = 0xFB ;將REG暫存器的第2個位元清除為0,從右邊算起為第0個位元、第1個位元、第2個位元,以下依此類推。
指令名稱:BN
原 意:Branch if Negative
語 法:[label] BN Label name
運 算 元:
運算說明:If negative bit is ‘1’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的負號旗標N等於1時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BN Lab1 ;若是負號旗標N等於1就跳到Lab1的位址,若是負號旗標N不等於1則程式往下執行。
執行前:
PC = 在目前Here的位址
N = 1
執行後:
PC = 跳到Lab1的位址
N = 1
指令名稱:BNC
原 意:Branch if Not Carry
語 法:[label] BNC label name
運 算 元:
運算說明:If carry bit is ‘0’, jump to label name.
上一篇:超声波PIC单片机C程序
下一篇:单片机EC1数字旋扭编码仿真程序
设计资源 培训 开发板 精华推荐
- ESP32-Smart-Watch - 基于ESP32 WROOM的开源智能手表
- 使用 Analog Devices 的 LTC3130IMSE-1 的参考设计
- 高达呼吸灯
- 小型gps北斗追踪器 HT1612Z3M3L AIR302
- 使用 NXP Semiconductors 的 MAX3232CP 的参考设计
- 5V 至 5V 转换器适合 0.1in2
- 使用 ON Semiconductor 的 STK350-000 的参考设计
- LF25ABDT-TR 2.5V 极低压降稳压器的典型应用
- MCP3551DM-PCTL,MCP3551 演示板,22 位性能 Delta-Sigma ADC
- 16 位、2MSPS、2CH 用于仪器
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况