PIC18系列家族指令快速索引
2019-11-13 来源:51hei
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.
影響旗標:無
指令說明:當狀態暫存器中的進位旗標C等於0時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BC Lab1 ;若是進位旗標C等於0就跳到Lab1的位址,若是進位旗標C不等於0則程式往下執行。
執行前:
PC = 在目前Here的位址
C = 0
執行後:
PC = 跳到Lab1的位址
C = 0
指令名稱:BNN
原 意:Branch if Not Negative
語 法:[label] BNN Label name
運 算 元:
運算說明:If negative bit is ‘0’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的負號旗標N等於0時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BN Lab1 ;若是負號旗標N等於0就跳到Lab1的位址,若是負號旗標N不等於0則程式往下執行。
執行前:
PC = 在目前Here的位址
N = 0
執行後:
PC = 跳到Lab1的位址
N = 0
指令名稱:BNOV
原 意:Branch if Not Overflow
語 法:[label] BNOV Label name
運 算 元:
運算說明:If overflow bit is ‘0’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的溢位旗標OV等於0時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BNOV Lab1 ;若是溢位旗標OV等於0就跳到Lab1的位址,若是溢位旗標OV不等於0則程式往下執行。
執行前:
PC = 在目前Here的位址
OV = 0
執行後:
PC = 跳到Lab1的位址
OV = 0
指令名稱:BNZ
原 意:Branch if Not Zero
語 法:[label] BNZ Label name
運 算 元:
運算說明:If zero bit is ‘0’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的零位旗標Z等於0時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BNZ Lab1 ;若是零位旗標Z等於0就跳到Lab1的位址,若是零位旗標Z不等於0則程式往下執行。
執行前:
PC = 在目前Here的位址
Z = 0
執行後:
PC = 跳到Lab1的位址
Z = 0
指令名稱:BRA
原 意:Unconditional Branch
語 法:[label] BRA Label name
運 算 元:
運算說明:Jump to label name.
影響旗標:無
指令說明:無條件跳躍至指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BRA Lab1 ;跳到Lab1的位址。
執行前:
PC = 在目前Here的位址
執行後:
PC = 跳到Lab1的位址
指令名稱:BSF
原 意:Bit Set f
語 法:[label] BSF f, b
運 算 元:
運算說明:1 -> f < b >
影響旗標:無
指令說明:將暫存器中的某一個位元設定為1。
類 別:位元定址指令。
組 別:單一位元設定指令。
範例一:
BSF REG,2 ;將REG暫存器的第2個位元設定為1。
執行前:
REG = 00000000 = 0x00 ;REG暫存器的值為0x00。
執行後:
REG = 00000100 = 0x04 ;將REG暫存器的第2個位元設定為1,從右邊算起為第0個位元、第1個位元、第2個位元,以下依此類推。
指令名稱:BTFSC
原 意:Bit Test File, Skip if Clear
語 法:[label] BTFSC f, b
運 算 元:
運算說明:skip if (f < b >) = 0
影響旗標:無
指令說明:比較暫存器中的某一個位元是否為0,假設是0則跳過下一個指令,若是不為0則往下執行。
類 別:程式流程控制指令。
組 別:單一位元比較指令。
範例一:
Here BTFSC REG,2 ;比較REG暫存器的第2個位元是否為0,假設是0則執行Here2這行指令,若不為0則執行Here1這行指令。
Here1 ADDLW 0x01 ;不為0則執行Here1這行指令。
Here2 ADDLW 0x03 ;為0則執行Here2這行指令。
執行前:
REG = 11110000 = 0xF0 ;REG暫存器的值為0xF0。
PC = 在目前Here的位址
執行後:
REG = 11110000 = 0xF0 ;REG暫存器的值為0xF0。
PC = 在Here2的位址 ;由於REG暫存器的第2個位元為0,因此程式跳到Here2的位址。
指令名稱:BTFSS
原 意:Bit Test File, Skip if Set
語 法:[label] BTFSS f, b
運 算 元:
運算說明:skip if (f < b >) = 1
影響旗標:無
指令說明:比較暫存器中的某一個位元是否為1,假設是1則跳過下一個指令,若是不為1則往下執行。
類 別:程式流程控制指令。
組 別:單一位元比較指令。
範例一:
Here BTFSS REG,2 ;比較REG暫存器的第2個位元是否為1,假設是1則執行Here2這行指令,若不為1則執行Here1這行指令。
Here1 ADDLW 0x01 ;不為1則執行Here1這行指令。
Here2 ADDLW 0x03 ;為1則執行Here2這行指令。
執行前:
REG = 11111111 = 0xFF ;REG暫存器的值為0xFF。
PC = 在目前Here的位址
執行後:
REG = 11111111 = 0xFF ;REG暫存器的值為0xFF。
PC = 在Here2的位址 ;由於REG暫存器的第2個位元為1,因此程式跳到Here2的位址。
指令名稱:BTG
原 意:Bit Toggle f
語 法:[label] BTG f, b
運 算 元:
運算說明:
影響旗標:無
指令說明:將暫存器中的某一個位元取補數。
類 別:位元定址指令。
組 別:單一位元邏輯指令。
範例一:
BTG REG,2 ;將REG暫存器的第2個位元取補數。
執行前:
REG = 00000000 = 0x00 ;REG暫存器的值為0x00。
執行後:
REG = 00000100 = 0x04 ;將REG暫存器的第2個位元取補數,從右邊算起為第0個位元、第1個位元、第2個位元,以下依此類推。
指令名稱:BOV
原 意:Branch if Overflow
語 法:[label] BOV Label name
運 算 元:
運算說明:If overflow bit is ‘1’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的溢位旗標OV等於1時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BOV Lab1 ;若是溢位旗標OV等於1就跳到Lab1的位址,若是溢位旗標OV不等於1則程式往下執行。
執行前:
PC = 在目前Here的位址
OV = 1
執行後:
PC = 跳到Lab1的位址
OV = 1
指令名稱:BZ
原 意:Branch if Zero
語 法:[label] BZ Label name
運 算 元:
運算說明:If zero bit is ‘1’, jump to label name.
影響旗標:無
指令說明:當狀態暫存器中的零位旗標Z等於1時,就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範例一:
Here BZ Lab1 ;若是零位旗標Z等於1就跳到Lab1的位址,若是零位旗標Z不等於1則程式往下執行。
執行前:
PC = 在目前Here的位址
Z = 1
執行後:
PC = 跳到Lab1的位址
Z = 1
指令名稱:CALL
原 意:Subroutine Call
語 法:[label] CALL Label name
運 算 元:
運算說明:(PC) + 4 -> Stack, Label name- > PC
影響旗標:無
指令說明:呼叫副程式,呼叫的範圍最大到2 Mbytes的記憶體範圍。
類 別:程式流程控制指令。
組 別:呼叫副程式指令。
範例一:
Here CALL Lab1 ;呼叫Lab1的副程式。
執行前:
PC = 在目前Here的位址
執行後:
PC = 跳到Lab1的位址
指令名稱:CLRF
原 意:Clear f
語 法:[label] CLRF f
運 算 元:
運算說明:0x00 -> f, Z ->1
影響旗標:Z
指令說明:將暫存器的值全部清除為0。
類 別:資料轉移指令。
組 別:位元組 (Byte) 清除指令。
範例一:
CLRF REG ;將REG暫存器的值全部清為0。
執行前:
REG = 0xF5 ;REG暫存器的值為0xF5。
Z = 0 ;零位旗標Z等於0。
執行後:
REG = 0x00 ;REG暫存器的值為0x00。
Z = 1 ;零位旗標Z等於1。
指令名稱:CLRWDT
原 意:Clear Watchdog Timer
語 法:[label] CLRWDT
運 算 元:無
運算說明:0x00 -> WDT, 0x00 -> WDT postscaler,
,
影響旗標:,
指令說明:將看門狗計時器的值全部清除為0。
類 別:程式流程控制指令。
組 別:清除指令。
範例一:
CLRWDT ;將看門狗計時器的值全部清除為0。
執行前:
WDT Count = ? ;看門狗計時器的值未知?
執行後:
WDT Count = 0x00 ;看門狗計時器的值為0x00。
WDT Postscaler = 0x00 ;看門狗後除器的值為0x00。
= 1 ;計時器溢位旗標等於1。
= 1 ;電源下降旗標等於1。
指令名稱:COMF
原 意:Complement f
語 法:[label] COMF f, d
運 算 元:
運算說明:
影響旗標:N, Z
指 令說明:將暫存器的值取1的補數,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:邏輯運算指令。
組 別:邏輯運算NOT指令。
範例一:
COMF REG,0 ;將暫存器REG的值取1的補數,並將運算結果放回W累加器中。
執行前:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x00 ;W累加器的值為0x00。
Z = N = 0 ;零位旗標Z與負號旗標N皆為0。
執行後:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x80 ;W累加器的值為0x80。
Z = 0, N = 1 ;零位旗標Z等於0,因為運算結果不為0x00,而負號旗標N為1,因為運算結果後最高位元等於1。
範例二:
COMF REG,F ;將暫存器REG的值取1的補數,並將運算結果放回暫存器REG中。
執行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x00 ;W累加器的值為0x00。
Z = N = 0 ;零位旗標Z與負號旗標N皆為0。
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x00 ;W累加器的值為0x00。
Z = 1, N = 0 ;零位旗標Z等於1,因為運算結果為0x00,而負號旗標N為0,因為運算結果後最高位元不等於1。
指令名稱:CPFSEQ
原 意:Compare f with W, skip if f = W
語 法:[label] CPFSEQ f
運 算 元:
運算說明:(f) - (W), skip if (f) = (W)
影響旗標:無
指令說明:將暫存器的值與W累加器的值作比較,若是兩個值相等則跳過下一個指令,若大於或是小於則往下執行。
類 別:程式流程控制指令。
組 別:比較指令。
範例一:
Lab CPFSEQ REG ;將暫存器REG的值與W累加器的值作比較。
Here1 ADDLW 0x01 ;若暫存器REG的值與W累加器的值不相等,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若暫存器REG的值與W累加器的值相等,則執行Here2這行指令。
執行前:
REG = 0x04 ;暫存器REG的值為0x04。
W = 0x04 ;W累加器的值為0x04。
PC = 在目前Lab的位址
執行後:
PC = 在Here2的位址 ;暫存器REG的值與W累加器的值相等,因此執行Here2這行指令。
指令名稱:CPFSGT
原 意:Compare f with W, skip if f > W
語 法:[label] CPFSGT f
運 算 元:
運算說明:(f) - (W), skip if (f) > (W)
影響旗標:無
指令說明:將暫存器的值與W累加器的值作比較,若是暫存器的值大於W累加器的值則跳過下一個指令,若小於或是等於則往下執行。
類 別:程式流程控制指令。
組 別:比較指令。
範例一:
Lab CPFSGT REG ;將暫存器REG的值與W累加器的值作比較。
Here1 ADDLW 0x01 ;若暫存器REG的值與W累加器的值小於或是等於,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若是暫存器的值大於W累加器的值,則執行Here2這行指令。
執行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x04 ;W累加器的值為0x04。
PC = 在目前Lab的位址
執行後:
PC = 在Here2的位址 ;暫存器的值大於W累加器的值,因此執行Here2這行指令。
指令名稱:CPFSLT
原 意:Compare f with W, skip if f < W
語 法:[label] CPFSLT f
運 算 元:
運算說明:(f) - (W), skip if (f) < (W)
影響旗標:無
指令說明:將暫存器的值與W累加器的值作比較,若是暫存器的值小於W累加器的值則跳過下一個指令,若大於或是等於則往下執行。
類 別:程式流程控制指令。
組 別:比較指令。
範例一:
Lab CPFSLT REG ;將暫存器REG的值與W累加器的值作比較。
Here1 ADDLW 0x01 ;若暫存器REG的值與W累加器的值大於或是等於,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若是暫存器的值小於W累加器的值,則執行Here2這行指令。
執行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執行後:
PC = 在Here2的位址 ;暫存器的值小於W累加器的值,因此執行Here2這行指令。
指令名稱:DAW
原 意:Decimal Adjust W Register
語 法:[label] DAW
運 算 元:無
運算說明:If (W < 3:0 >) > 9 or [DC = 1] then
(W < 3:0 >) + 6 -> W < 3:0 > ;
else
(W < 3:0 >) -> W < 3:0 > ;
If (W < 7:4 >) > 9 or [DC = 1] then
(W < 7:4 >) + 6 -> W < 7:4 > ;
else
(W < 7:4 >) -> W < 7:4 >.
影響旗標:C
指令說明:將W累加器的低四位元與高四位元分別調整成BCD碼,也就是當低四位元的值大於9時就將低四位元加6,然後將進位加到高四位元去,若是小於9則維持原狀;若是高四位元的值大於9就將高四位元加6,然後將進位加到狀態旗標的進位旗標C中,若是小於9則維持原狀。
類 別:程式流程控制指令。
組 別:邏輯運算BCD碼調整指令。
範例一:
DAW ;將W累加器的低四位元與高四位元分別調整成BCD碼。
執行前:
W = 0x0F ;W累加器的值為0x0F。
C = 0 ;進位旗標等於0。
執行後:
W = 0x15 ;由於低四位元大於9,因此將低四位元加6並且將進位加到高四位元。
C = 0 ;進位旗標等於0。
範例二:
DAW ;將W累加器的低四位元與高四位元分別調整成BCD碼。
執行前:
W = 0xA0 ;W累加器的值為0xA0。
C = 0 ;進位旗標等於0。
執行後:
W = 0x00 ;由於高四位元大於9,因此將高四位元加6並且將進位加到進位旗標。
C = 1 ;由於高四位元大於9,因此作BCD調整後會有進位的情形,所以進位旗標等於1。
範例三:
DAW ;將W累加器的低四位元與高四位元分別調整成BCD碼。
執行前:
W = 0xAF ;W累加器的值為0xAF。
C = 0 ;進位旗標等於0。
執行後:
W = 0x15 ;由於低四位元大於9,因此將低四位元加6並且將進位加到高四位元,再者是高四位元大於9,因此將高四位元加6並且將進位加到進位旗標。
C = 1 ;由於高四位元大於9,因此作BCD調整後會有進位的情形,所以進位旗標等於1。
指令名稱:DECF
原 意:Decrement f
語 法:[label] DECF f, d
運 算 元:
運算說明:(f) – 1 -> dest
影響旗標:C, DC, N, OV, Z
指 令說明:將暫存器的值減1,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉移指令。
組 別:算數運算指令。
範例一:
DECF REG, W ;將暫存器REG的值減1,並將結果放回W累加器。
執行前:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x02 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0xFF ;W累加器的值為0xFF。
C = DC =OV = Z = 0, N = 1 ;由於將暫存器REG的值 (原本為0x00) 減1後變成-1,因此狀態暫存器中的負號旗標N被設定為1。
範例二:
DECF REG, F ;將暫存器REG的值減1,並將結果放回暫存器REG。
執行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x80 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x80 ;W累加器的值為0x00。
C = DC = Z = 1, N = OV = 0;由於減1之後並沒有發生負號的情形發生,因此狀態暫存器中的借位旗標C等於1;再者高四位元與低四位元之間也沒有借位的情形發生,因此半借位旗標DC 等於1;而將暫存器REG的值減1後結果為0,因此零位旗標Z被設定為1。
範例三:
DECF REG, W ;將暫存器REG的值減1,並將結果放回W累加器。
執行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x00 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x80 ;暫存器REG的值為0x00。
W = 0x7F ;W累加器的值為0x00。
C = OV = 1, Z = N = DC = 0;由於減1之後並沒有發生負號的情形發生,因此狀態暫存器中的借位旗標C等於1;再者是第7個位元由1變成0,因此跟據溢位旗標OV的定義,當第7個位元狀態有被改變時,溢位旗標OV就會被設定為1。
範例四:
DECF REG, 1 ;將暫存器REG的值減1,並將結果放回暫存器REG。
執行前:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x51 ;W累加器的值為0x51。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x7E ;暫存器REG的值為0x7E。
W = 0x51 ;W累加器的值為0x51。
C = DC = 1, Z = N = OV = 0;由於減1之後並沒有發生負號的情形發生,因此狀態暫存器中的借位旗標C等於1;再者高四位元與低四位元之間也沒有借位的情形發生,因此半借位旗標DC等於1。
備 註:在進行DECF減法指令時,若是在減1後有負號的情形發生,例如REG = 0x00減1變成REG = 0xFF,此時狀態暫存器中的負號旗標N就會被設定為1,而借位旗標C也會從1變成0,因為被借位了;再者是零位旗標Z,他要被設定為1的情形是發生在當 結果等於0時才會發生,如例題二;其半借位旗標DC等於1的情形會發生在高四位元與低四位元之間沒有借位的情形發生,若是有借位的情形發生DC就會等於 0,如例題三;最後是溢位旗標OV被設定為1的情形會發生在第7個位元由1變成0的時候,如例題三。
指令名稱:DECFSZ
原 意:Decrement f, skip if 0
語 法:[label] DECFSZ f, d
運 算 元:
運算說明:(f) – 1 -> dest, skip if result = 0
影響旗標:無
指 令說明:將暫存器的值減1後與0作比較,若是暫存器的值等於0則跳過下一個指令,若不等於0則往下執行,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數比較運算指令。
範例一:
Lab DECFSZ REG,W ;將暫存器REG的值減1後與0作比較,並將運算結果放到W累加器中。
Here1 ADDLW 0x01 ;若暫存器REG的值不等於0,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若是暫存器的值等於0,則執行Here2這行指令。
執行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執行後:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x00 ;W累加器的值為0x00。
PC = 在Here2的位址 ;暫存器的值等於0,因此執行Here2這行指令。
範例二:
Lab DECFSZ REG,F ;將暫存器REG的值減1後與0作比較,並將運算結果放到暫存器REG中。
Here1 ADDLW 0x04 ;若暫存器REG的值不等於0,則執行Here1這行指令。
Here2 ADDLW 0x15 ;若是暫存器的值等於0,則執行Here2這行指令。
執行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執行後:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x3F ;W累加器的值為0x3F。
PC = 在Here1的位址 ;暫存器的值不等於0,因此執行Here1這行指令。
指令名稱:DCFSNZ
原 意:Decrement f, skip if not 0
語 法:[label] DCFSNZ f, d
運 算 元:
運算說明:(f) – 1 -> dest, skip if result 0
影響旗標:無
指 令說明:將暫存器的值減1後與0作比較,若是暫存器的值不等於0則跳過下一個指令,若等於0則往下執行,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數比較運算指令。
範例一:
Lab DCFSNZ REG,F ;將暫存器REG的值減1後與0作比較,並將運算結果放到暫存器REG中。
Here1 ADDLW 0x01 ;若暫存器REG的值等於0,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若是暫存器的值不等於0,則執行Here2這行指令。
執行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x15 ;W累加器的值為0x15。
PC = 在Here1的位址 ;暫存器的值等於0,因此執行Here1這行指令。
範例二:
Lab DCFSNZ REG,W ;將暫存器REG的值減1後與0作比較,並將結果放到W累加器中。
Here1 ADDLW 0x04 ;若暫存器REG的值等於0,則執行Here1這行指令。
Here2 ADDLW 0x15 ;若是暫存器的值不等於0,則執行Here2這行指令。
執行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執行後:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x3F ;W累加器的值為0x3F。
PC = 在Here2的位址 ;暫存器的值不等於0,因此執行Here2這行指令。
指令名稱:GOTO
原 意:Unconditional Branch
語 法:[label] GOTO k
運 算 元:
運算說明:k -> PC <20:0 >
影響旗標:無
指令說明:無條件跳躍至指定位址。
類 別:程式流程控制指令。
組 別:跳躍運算指令。
範例一:
Lab GOTO Here1 ;無條件跳躍至Here1。
Here1 ADDLW 0x01 ;無條件跳躍至此。
執行前:
PC = 在目前Lab的位址
執行後:
PC = 在Here1的位址 ;執行Here1這行指令。
指令名稱:INCF
原 意:Increment f
語 法:[label] INCF f, d
運 算 元:
運算說明:(f) + 1 -> dest
影響旗標:C, DC, N, OV, Z
指 令說明:將暫存器的值加1,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉移指令。
組 別:算數運算指令。
範例一:
INCF REG,F ;將暫存器REG的值加1,並將結果放回暫存器REG。
執行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x02 ;W累加器的值為0x02。
C = DC = Z = 1, N = OV = 0;由於將暫存器REG的值加1後產生溢位情形,因此進位旗標C與半進位旗標DC被設定為1;又相加結果為0,因此零位旗標Z被設定為1;而負號旗標N與 溢位旗標OV因為相加之後結果為0,不符合負號旗標N與溢位旗標OV的定義,因此狀態步改變。
範例二:
INCF REG,W ;將暫存器REG的值加1,並將結果放回W累加器。
執行前:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x80 ;W累加器的值為0x80。
DC = N = OV = 1, C = Z = 0;由於將暫存器REG的值加1後低四位元產生溢位情形,因此半進位旗標DC被設定為1;又將暫存器REG的值加1後,結果大於127,因此負號旗標N被 設定為1,因為使用2的補數加法;溢位旗標OV等於1,跟據溢位旗標OV的定義,當第7個位元狀態有被改變時,溢位旗標OV就會被設定為1。
範例三:
INCF REG,F ;將暫存器REG的值加1,並將結果放回暫存器REG。
執行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x81 ;暫存器REG的值為0x81。
W = 0x02 ;W累加器的值為0x02。
N = 1, C = DC = OV = Z = 0;將暫存器REG的值加1後,結果大於127,因此負號旗標N被設定為1,因為使用2的補數加法。
範例四:
INCF REG,W ;將暫存器REG的值加1,並將結果放回暫存器REG。
執行前:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x10 ;W累加器的值為0x10。
DC = 1, C = N = OV = Z = 0;由於將暫存器REG的值加1後低四位元產生溢位情形,因此半進位旗標DC被設定為1。
指令名稱:INCFSZ
原 意:Increment f, skip if 0
語 法:[label] INCFSZ f, d
運 算 元:
運算說明:(f) + 1 -> dest, skip if result = 0
影響旗標:無
指 令說明:將暫存器的值加1後與0作比較,若是暫存器的值等於0則跳過下一個指令,若不等於0則往下執行,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數比較運算指令。
範例一:
Lab INCFSZ REG,W ;將暫存器REG的值加1後與0作比較,並將運算結果放到W累加器中。
Here1 ADDLW 0x01 ;若暫存器REG的值不等於0,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若是暫存器的值等於0,則執行Here2這行指令。
執行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執行後:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x02 ;W累加器的值為0x02。
PC = 在Here1的位址 ;暫存器的值不等於0,因此執行Here1這行指令。
範例二:
Lab DECFSZ REG,F ;將暫存器REG的值加1後與0作比較,並將運算結果放到暫存器REG中。
Here1 ADDLW 0x04 ;若暫存器REG的值不等於0,則執行Here1這行指令。
Here2 ADDLW 0x15 ;若是暫存器的值等於0,則執行Here2這行指令。
執行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x3F ;W累加器的值為0x3F。
PC = 在Here2的位址 ;暫存器的值不等於0,因此執行Here2這行指令。
指令名稱:INFSNZ
原 意:Increment f, skip if not 0
語 法:[label] INFSNZ f, d
運 算 元:
運算說明:(f) + 1 -> dest, skip if result 0
影響旗標:無
指 令說明:將暫存器的值加1後與0作比較,若是暫存器的值不等於0則跳過下一個指令,若等於0則往下執行,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數比較運算指令。
範例一:
Lab INFSNZ REG,F ;將暫存器REG的值加1後與0作比較,並將運算結果放到暫存器REG中。
Here1 ADDLW 0x01 ;若暫存器REG的值等於0,則執行Here1這行指令。
Here2 ADDLW 0x05 ;若是暫存器的值不等於0,則執行Here2這行指令。
執行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執行後:
REG = 0x02 ;暫存器REG的值為0x02。
W = 0x15 ;W累加器的值為0x15。
PC = 在Here2的位址 ;暫存器的值不等於0,因此執行Here2這行指令。
範例二:
Lab INFSNZ REG,W ;將暫存器REG的值加1後與0作比較,並將運算結果放到W累加器中。
Here1 ADDLW 0x04 ;若暫存器REG的值等於0,則執行Here1這行指令。
Here2 ADDLW 0x15 ;若是暫存器的值不等於0,則執行Here2這行指令。
執行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執行後:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x00 ;W累加器的值為0x00。
PC = 在Here1的位址 ;暫存器的值等於0,因此執行Here1這行指令。
指令名稱:IORLW
原 意:Inclusive OR literal with W
語 法:[label] IORLW k
運 算 元:
運算說明:(W) .OR. k -> W
影響旗標:N, Z
指令說明:W累加器中的值與k值作OR運算,並將運算結果放回W累加器中。
類 別:立即常數定址法。
組 別:邏輯運算OR指令。
範例一:
IORLW 0x00 ;將暫存器REG的值與0作OR運算,並將運算結果放到W累加器中。
執行前:
W = 0x00 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
W = 0x00 ;W累加器的值為0x00。
Z = 1, C = DC = OV = N = 0;由於運算後結果等於0,因此零位旗標Z被設定為1。
範例二:
IORLW 0x80 ;將暫存器REG的值與0作OR運算,並將運算結果放到W累加器中。
執行前:
W = 0x00 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
W = 0x80 ;W累加器的值為0x80。
N = 1, C = DC = OV = Z = 0;由於運算後第7個位元等於1,因此負號旗標N被設定為1。
範例三:
IORLW 0x05 ;將暫存器REG的值與0作OR運算,並將運算結果放到W累加器中。
執行前:
W = 0x80 ;W累加器的值為0x80。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
W = 0x85 ;W累加器的值為0x85。
N = 1, C = DC = OV = Z = 0;由於運算後第7個位元等於1,因此負號旗標N被設定為1。
指令名稱:IORWF
原 意:Inclusive OR W with f
語 法:[label] IORLW f, d
運 算 元:
運算說明:(W) .OR. (f) -> dest
影響旗標:N, Z
指 令說明:W累加器中的值與f暫存器中的值作OR運算,並將運算結果放回 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉移指令。
組 別:邏輯運算OR指令。
範例一:
IORWF REG,W ;將暫存器REG的值與W累加器作OR運算,並將運算結果放到W累加器中。
執行前:
W = 0x00 ;W累加器的值為0x00。
REG = 0x00 ;暫存器REG的值為0x00。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
W = 0x00 ;W累加器的值為0x00。
REG = 0x00 ;暫存器REG的值為0x00。
Z = 1, C = DC = OV = N = 0;由於運算後結果等於0,因此零位旗標Z被設定為1。
範例二:
IORWF REG,F ;將暫存器REG的值與W累加器作OR運算,並將運算結果放到暫存器REG中。
執行前:
W = 0x10 ;W累加器的值為0x10。
REG = 0x05 ;暫存器REG的值為0x05。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
W = 0x10 ;W累加器的值為0x10。
REG = 0x15 ;暫存器REG的值為0x15。
Z = C = DC = OV = N = 0 ;狀態暫存器的旗標皆為0。
範例三:
IORWF REG,F ;將暫存器REG的值與W累加器作OR運算,並將運算結果放到暫存器REG中。
執行前:
W = 0x80 ;W累加器的值為0x80。
REG = 0x05 ;暫存器REG的值為0x05。
C = DC = N = OV = Z = 0 ;假設狀態暫存器的旗標皆為0。
執行後:
W = 0x80 ;W累加器的值為0x80。
REG = 0x85 ;暫存器REG的值為0x85。
N = 1, Z = C = DC = OV = N = 0 ;由於運算後第7個位元等於1,因此負號旗標N被設定為1。
指令名稱:LFSR
原 意:Load FSR
語 法:[label] LFSR f, d
運 算 元:
運算說明:k -> FSRf
影響旗標:無
指 令說明:PIC單晶片對資料的定址方式除了有直接定址與立即定址外,還有一種就是間接定址,而間接定址所使用的基底暫存器就是FSR (File Select Register) 暫存器,FSR暫存器所放的是位址,也就是資料的位址,至於資料就放在INDF這個暫存器中,例如我們要將0x30這個資料放在RAM位址中的 0x100,我們只要把0x100存入FSR暫存器中,把0x30存入INDF這個暫存器中就可以了。而在PIC18系列中間接定址可以使用的FSR暫存 器有3個,分別是FSR0、FSR1與FSR2這三個暫存器,而定義的記憶體位址長度可以到達12 bits,但是暫存器的長度只有8 bits,因此便將FSR0分成FSR0H與FSR0L、FSR1分成FSR1H與FSR1L、FSR2分成FSR2H與FSR2L二個高低位元的暫存 器。若是我們要將RAM的位址0x180放到FSR2,則我們可以寫成LFSR 2,0x180;若是我們要將RAM的位址0x2AB放到FSR0,則我們可以寫成LFSR 0,0x2AB即可。
類 別:立即常數定址法。
組 別:數值運算指令。
範例一:
LFSR 0,0x423
執行前:
FSR0H = ?
FSR0L = ?
執行後:
FSR0H = 0x04
FSR0L = 0x23
範例二:
LFSR 2,0x3AB
執行前:
FSR2H = ?
FSR2L = ?
執行後:
FSR2H = 0x03
FSR2L = 0xAB
指令名稱:MOVF
原 意:Move f
語 法:[label] MOVF f, d
運 算 元:
運算說明:f -> dest
影響旗標:N, Z
指 令說明:將暫存器 (f) 的值般到 ’d’ 所指定的暫存器中。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉移指令。
組 別:資料搬移指令。
範例一:
MOVF REG,W ;將暫存器REG的值般到W累加器中。
執行前:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x02 ;W累加器的值為0x02。
N = Z = 0 ;假設狀態暫存器的皆為0。
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x00 ;W累加器的值為0x00。
Z = 1, N = 0 ;結果等於0,因此零號旗標Z等於1。
範例二:
MOVF REG,F ;將暫存器REG的值般到暫存器REG中。
執行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x02 ;W累加器的值為0x02。
N = Z = 0 ;假設狀態暫存器的皆為0。
執行後:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x02 ;W累加器的值為0x02。
N = 1, Z = 0 ;由於第7個位元為1,因此負號旗標N等於1。
範例三:
MOVF REG,W ;將暫存器REG的值般到W累加器中。
執行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x30 ;W累加器的值為0x30。
N = Z = 0 ;假設狀態暫存器的皆為0。
執行後:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x80 ;W累加器的值為0x80。
N = 1, Z = 0 ;由於第7個位元不是1,因此負號旗標N等於0;搬運後的結果不是0,因此零號旗標Z等於0。
指令名稱:MOVFF
原 意:Move f to f
語 法:[label] MOVF
運 算 元:
運算說明:
影響旗標:無
指令說明:將暫存器的值般到暫存器去。
類 別:資料轉移指令。
組 別:資料搬移指令。
範例一:
MOVFF REG1,REG2 ;將暫存器REG1的值般到暫存器REG2中。
執行前:
REG1 = 0x03 ;暫存器REG1的值為0x03。
REG2 = 0x80 ;暫存器REG2的值為0x80。
執行後:
REG1 = 0x03 ;暫存器REG1的值為0x03。
REG2 = 0x03 ;暫存器REG2的值為0x03。
範例二:
MOVFF REG1,PORTB ;將暫存器REG1的值般到PORTB中。
執行前:
REG1 = 0x03 ;暫存器REG1的值為0x03。
PORTB = 0x80 ; PORTB的值為0x80。
執行後:
REG1 = 0x03 ;暫存器REG1的值為0x03。
PORTB = 0x03 ; PORTB的值為0x03。
指令名稱:MOVLB
原 意:Move literal to low nibble in BSR
語 法:[label] MOVLB k
運 算 元:
運算說明:k -> BSR
影響旗標:無
指 令說明:將常數搬到分頁暫存器 (Bank Select Register, BSR) 中,以設定存取資料的起始位址。因為在18FXX2中將RAM分成許多頁供我們使用,因此若是BSR等於1,則表示存取得位址從0x100開始;系統開始 後或是RESET後BSR預設為0,也就是從0x00開始。
類 別:立即常數定址法。
組 別:資料搬移指令。
範例一:
MOVLB 1 ;將常數1般到暫存器BSR中。
執行前:
BSR = 0x00 ;暫存器BSR的值為0x00。
執行後:
REG1 = 0x01 ;暫存器BSR的值為0x01。
指令名稱:MOVLW
原 意:Move literal to W
語 法:[label] MOVLW k
運 算 元:
運算說明:k -> W
影響旗標:無
指令說明:將常數搬到W累加器中。
類 別:立即常數定址法。
組 別:資料搬移指令。
範例一:
MOVLW 0x40 ;將常數0x40搬到W累加器中。
執行前:
W = 0x00 ;W累加器的值為0x00。
執行後:
W = 0x40 ;W累加器的值為0x40。
指令名稱:MOVWF
原 意:Move W to f
語 法:[label] MOVWF f
運 算 元:
運算說明:(W) -> f
影響旗標:無
指令說明:將W累加器中值搬到暫存器REG中。
類 別:資料轉移指令。
組 別:資料搬移指令。
範例一:
MOVWF REG ;將W累加器中的值搬到暫存器REG去。
執行前:
W = 0xF0 ;W累加器的值為0xF0。
REG = 0x50 ;暫存器REG的值為0x50。
執行後:
W = 0xF0 ;W累加器的值為0xF0。
REG = 0xF0 ;暫存器REG的值為0xF0。
指令名稱:MULLW
原 意:Multiply Literal with W
語 法:[label] MULLW k
運 算 元:
運算說明:(W) x k -> PRODH : PRODL
影響旗標:無
指令說明:將常數與W累加器中的值相乘,並將結果放到PRODH : PRODL這二個8位元的暫存器。
類 別:立即常數定址法。
組 別:數學運算乘法指令。
範例一:
MULLW 0x10 ;將常數0x10與W累加器中的值相乘。
執行前:
W = 0x02 ;W累加器的值為0x02。
PRODH = ? ;假設PRODH的值未知。
PRODL = ? ;假設PRODL的值未知。
執行後:
W = 0x02 ;W累加器的值為0x02。
PRODH = 0x00 ;PRODH的值為0x00。
PRODL = 0x20 ;PRODL的值0x20。
範例二:
MULLW 0xC4 ;將常數0xC4與W累加器中的值相乘。
執行前:
W = 0xE2 ;W累加器的值為0xE2。
PRODH = ? ;假設PRODH的值未知。
PRODL = ? ;假設PRODL的值未知。
執行後:
W = 0xE2 ;W累加器的值為0xE2。
PRODH = 0xAD ;PRODH的值為0xAD。
PRODL = 0x08 ;PRODL的值為0x08。
指令名稱:MULWF
原 意:Multiply W to f
語 法:[label] MULWF f
運 算 元:
運算說明:(W) x (f) -> PRODH : PRODL
影響旗標:無
指令說明:將暫存器的值與W累加器中的值相乘,並將結果放到PRODH : PRODL這二個8位元的暫存器。
類 別:資料轉移指令。
組 別:數學運算乘法指令。
範例一:
MULWF REG ;將暫存器REG的值與W累加器中的值相乘。
執行前:
W = 0x02 ;W累加器的值為0x02。
REG = 0x20 ;暫存器REG的值為0x20。
PRODH = ? ;假設PRODH的值未知。
PRODL = ? ;假設PRODL的值未知。
執行後:
W = 0x02 ;W累加器的值為0x02。
REG = 0x20 ;暫存器REG的值為0x20。
PRODH = 0x00 ;PRODH的值為0x00。
PRODL = 0x40 ;PRODL的值0x40。
範例二:
MULWF REG ;將暫存器REG的值與W累加器中的值相乘。
執行前:
W = 0xC4 ;W累加器的值為0xC4。
REG = 0xB5 ;暫存器REG的值為0xB5。
PRODH = ? ;假設PRODH的值未知。
PRODL = ? ;假設PRODL的值未知。
執行後:
W = 0xC4 ;W累加器的值為0xC4。
REG = 0xB5 ;暫存器REG的值為0xB5。
PRODH = 0x8A ;PRODH的值為0x8A。
PRODL = 0x94 ;PRODL的值為0x94。
範例三:
MULWF REG ;將暫存器REG的值與W累加器中的值相乘。
執行前:
W = 0x10 ;W累加器的值為0x10。
REG = 0x50 ;暫存器REG的值為0x50。
PRODH = ? ;假設PRODH的值未知。
PRODL = ? ;假設PRODL的值未知。
執行後:
W = 0x10 ;W累加器的值為0x10。
REG = 0x50 ;暫存器REG的值為0x50。
PRODH = 0x05 ;PRODH的值為0x05。
PRODL = 0x00 ;PRODL的值0x00。
指令名稱:NEGF
原 意:Negate f
語 法:[label] NEGF f
運 算 元:
運算說明:
影響旗標:N, OV, C, DC, Z
指令說明:將暫存器的值取補數後加1,並將結果放回暫存器。
類 別:邏輯運算指令。
組 別:邏輯運算指令。
範例一:
NEGF REG ;將暫存器REG的值取補數後加1。
執行前:
REG = 0x00 ;暫存器REG的值為0x00。
N = OV = C = DC = Z = 0 ;狀態暫存器中的值皆為0。
執行後:
REG = 0x00 ;暫存器REG的值為0x00。
N = OV = 0, C = DC = Z = 1;運算結果等於0,因此零位旗標Z等於1;運算後有進位發生,由0xFF加1發生溢位產生0x00,因此進位旗標C等於1;低四位元有進位發生,因此半進位旗標DC等於1。
範例二:
NEGF REG ;將暫存器REG的值取補數後加1。
執行前:
REG = 0x80 ;暫存器REG的值為0x80。
N = OV = C = DC = Z = 0 ;狀態暫存器中的值皆為0。
執行後:
REG = 0x80 ;暫存器REG的值為0x80。
C = Z = 0, N = DC = OV = 1;由於第7個位元由0變成1,因此負號旗標N被設定為1;接著OV也被設定為1,因為0x80取補數後為0x7F,之後在加1,因此最後結果為 0x80,在運算過程中低四位元有進位的情形發生,因此半進位旗標DC等於1。
範例三:
NEGF REG ;將暫存器REG的值取補數後加1。
執行前:
REG = 0x55 ;暫存器REG的值為0x55。
N = OV = C = DC = Z = 0 ;狀態暫存器中的值皆為0。
執行後:
REG = 0xAB ;暫存器REG的值為0xAB。
OV = C = DC = Z = 0, N = 1;由於第7個位元由0變成1,因此負號旗標N被設定為1。
指令名稱:NOP
原 意:NO Operation
語 法:[label] NOP
運 算 元:無
運算說明:無
影響旗標:無
指令說明:不做任何運算,只延遲一個指令時間。
類 別:程式流程控制指令。
組 別:空指令。
範例一:
NOP ;空指令。
指令名稱:POP
原 意:Pop Top of return Stack
語 法:[label] POP
運 算 元:無
運算說明:(TOS) -> bit bucket
影響旗標:無
指令說明:將堆疊的值取出來放在TOS這個暫存器中,TOS暫存器的資料長度21 bits,因此TOS暫存器被分為TOSL、TOSH與TOSU。
類 別:程式流程控制指令。
組 別:堆疊資料存取控制。
範例一:
POP ;將堆疊最上層的資料取出來。
Goto NEW ;跳到NEW標記去。
執行前:
TOS = 0x0031A2 ;堆疊暫存器的值為0x0031A2。
堆疊最上層 = 0x014332 ;堆疊最上層的資料為0x014332。
執行後:
TOS = 0x014332 ;堆疊暫存器的值為0x014332。
PC = NEW ;程式計數器的值為NEW標記。
指令名稱:PUSH
原 意:Push Top of return Stack
語 法:[label] PUSH
運 算 元:無
運算說明:(PC+2) -> TOS
影響旗標:無
指令說明:將下一個指令的位址置於堆疊上層。
類 別:程式流程控制指令。
組 別:堆疊資料存取控制。
範例一:
PUSH ;將下一個指令的位址置於堆疊上層。
執行前:
TOS = 0x0031A2 ;堆疊暫存器的值為0x0031A2。
PC = 0x000124 ;目前程式計數器的值0x000124。
執行後:
TOS = 0x000126 ;堆疊暫存器的值為0x000126。
PC = 0x000126 ;目前程式計數器的值0x000126。
堆疊次上層 = 0x0031A2 ;堆疊次上層的資料0x0031A2。
指令名稱:RCALL
原 意:Relative Call
語 法:[label] RCALL n
運 算 元:
運算說明:(PC) + 2 -> TOS
(PC) + 2 + 2n -> PC
影響旗標:無
指令說明:1 k範圍內的短程副程式呼叫。
類 別:程式流程控制指令。
組 別:呼叫副程式控制。
範例一:
Here RCALL Jump ;呼叫Jump副程式。
執行前:
PC = Here ;程式計數器在Here位址上。
執行後:
PC = Jump ;程式計數器跳到Jump副程式位址。
TOS = Here + 2 ;推疊指標暫存器記錄返回的位址。
指令名稱:RESET
原 意:Reset
語 法:[label] RESET
運 算 元:無
運算說明:Reset all registers and flags.
影響旗標:全部歸零
指令說明:軟體重置命令。
類 別:程式流程控制指令。
組 別:程式重新啟動控制。
範例一:
RESET ;執行軟體RESET。
執行後:
所有暫存器與旗標回到初始值
指令名稱:RETFIE
原 意:Return from Interrupt
語 法:[label] RETFIE [s]
運 算 元:
運算說明:(TOS) -> PC
1 -> GIE/ GIEH or PEIE/GIEL,
if s = 1
(WS) -> W,
(STATUSS) -> STATUS,
(BSRS) -> BSR,
PCLATU, PCLATH 狀態不改變。
影響旗標:GIE/ GIEH, PEIE/GIEL
指 令說明:離開中斷程式副程式,並將推疊指標暫存器的值存到PC中,中斷致能接腳設定為1。若是資料備份選擇位元等於1 (s = 1) ,則將WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態暫存器;BSRS暫存器的值搬到BSR,但是PCLATU 與PCLATH的狀態不改變。
類 別:程式流程控制指令。
組 別:流程控制。
範例一:
RETFIE 1 ;離開中斷程式,並把WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態暫存器;BSRS暫存器的值搬到BSR。
執行後:
PC = TOS
W = WS
BSR = BSRS
STATUS = STATUSS
GIE/ GIEH, PEIE/GIEL = 1
指令名稱:RETLW
原 意:Return Literal to W
語 法:[label] RETLW k
運 算 元:
運算說明:k -> W,
(TOS) -> PC,
PCLATU, PCLATH 狀態不改變。
影響旗標:無
指令說明:從副程式返回主程式的指令,但本指令在返回的時候,還會順便將8 bits的常數k載入到 ” W ” 累加器中,這個功能在查表法時會用到。
類 別:立即常數定址法。
組 別:流程控制。
範例一:
CALL TABLE ;呼叫TABLE副程式。
、、、、 ;W累加器的內容為表中Offset值。
、、、、 ;返回後W累加器的內容為TABLE的值。
Table:
ADDWF PCL ;W = Offset.
RETLW 0x30 ;返回時將0x30存回W累加器
RETLW 0x10 ;返回時將0x10存回W累加器
RETLW 0xDD ;返回時將0xDD存回W累加器
執行前:
W = ? ;W累加器的值未知。
執行後:
W = 0x30 ;W累加器的值等於0x30。
指令名稱:RETURN
原 意:Return from Subroutine
語 法:[label] RETURN [s]
運 算 元:
運算說明:(TOS) -> PC
1 -> GIE/ GIEH or PEIE/GIEL,
if s = 1
(WS) -> W,
(STATUSS) -> STATUS,
(BSRS) -> BSR,
PCLATU, PCLATH 狀態不改變。
影響旗標:無
指 令說明:離開副程式,並將推疊指標暫存器的值存到PC中,中斷致能接腳設定為1。若是資料備份選擇位元等於1 (s = 1) ,則將WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態暫存器;BSRS暫存器的值搬到BSR,但是PCLATU 與PCLATH的狀態不改變。
類 別:程式流程控制指令。
組 別:流程控制。
範例一:
RETURN ;離開副程式,並把WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態暫存器;BSRS暫存器的值搬到BSR。
執行後:
PC = TOS ;推疊指標的值存回PC。
指令名稱:RLCF
原 意:Rotate Left f through Carry
語 法:[label] RLCF f, d
運 算 元:
運算說明:(f < n >) -> dest (f < 7 >) -> 7, ( C ) -> dest <0 > 影響旗標:C, N, Z 指 令說明:將REG暫存內的值與進位旗標C一起向左旋轉。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器)。 類 別:邏輯運算指令。 組 別:邏輯指令。 範例一: CLRC ;將進位旗號C清除為0。 RLCF REG, 0 ;將REG暫存器的值一起與進位旗號C一起向左旋轉,並將結果存回W暫存器中。 執行前: REG = 1110 0110 ;REG暫存器的值為11100110。 N = Z = C = 0 ;假設狀態暫存器的皆為0。 執行後: REG = 1110 0110 ;REG暫存器的值為11100110。 W = 1100 1100 ;W暫存器的值為11001100。 N = C = 1 ;由於向左移是負數越多,因此負號旗標N為1;進位旗號C為1。 範例二: CLRC ;將進位旗號C清除為0。 RLCF REG, F ;將REG暫存器的值一起與進位旗號C一起向左旋轉,並將結果存回REG暫存器中。 執行前: REG = 1000 0000 ;REG暫存器的值為10000000。 W = 0000 0000 ;W暫存器的值為00000000。 N = Z = C = 0 ;假設狀態暫存器的皆為0。 執行後: REG = 0000 0000 ;REG暫存器的值為00000000。 W = 0000 0000 ;W暫存器的值為00000000。 Z = C = 1 ;由於向左移後結果為0,因此零位旗號Z為1;進位旗號C為1。 指令名稱:RLNCF 原 意:Rotate Left f (no Carry) 語 法:[label] RLNCF f, d 運 算 元: 運算說明:(f < n >) -> dest (f < 7 >) -> 7, 影響旗標:N, Z 指 令說明:將REG暫存內的值向左旋轉。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器)。 類 別:邏輯運算指令。 組 別:邏輯指令。 範例一: RLNCF REG, 0 ;將REG暫存器的值向左旋轉,並將結果存回W暫存器中。 執行前: REG = 1110 0110 ;REG暫存器的值為11100110。 N = Z = 0 ;假設狀態暫存器的皆為0。 執行後: REG = 1110 0110 ;REG暫存器的值為11100110。 W = 1100 1100 ;W暫存器的值為11001100。 N = 1 ;由於向左移是負數越多,因此負號旗標N為1。 範例二: RLNCF REG, F ;將REG暫存器的值向左旋轉,並將結果存回REG暫存器中。 執行前: REG = 1000 0000 ;REG暫存器的值為10000000。 W = 0000 0000 ;W暫存器的值為00000000。 N = Z = 0 ;假設狀態暫存器的皆為0。 執行後: REG = 0000 0000 ;REG暫存器的值為00000000。 W = 0000 0000 ;W暫存器的值為00000000。 Z = 1 ;由於向左移後結果為0,因此零位旗號Z為1。 指令名稱:RRCF 原 意:Rotate Right f through Carry 語 法:[label] RRCF f, d 運 算 元: 運算說明:(f < n >) -> dest (f < 7 >) -> 7, ( C ) -> dest <0 > 影響旗標:C, N, Z 指 令說明:將REG暫存內的值與進位旗標C一起向右旋轉。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。 類 別:邏輯運算指令。 組 別:邏輯指令。 範例一: RRCF REG, 0 ;將REG暫存器的值一起與進位旗號C一起向右旋轉,並將結果存回W暫存器中。 執行前: REG = 1110 0110 ;REG暫存器的值為11100110。 N = Z = 0 ;假設狀態暫存器中的負號旗標N與零號旗標Z皆為0。 C = 1 ;假設進位旗號C為1。 執行後: REG = 1110 0110 ;REG暫存器的值為11100110。 W = 1111 0011 ;W暫存器的值為11110011。 N = Z = C = 0 ;狀態暫存器中的負號旗標N、零號旗標Z與進位旗號C結果皆為0。 範例二: CLRC ;將進位旗號C清除為0。 RRCF REG, F ;將REG暫存器的值一起與進位旗號C一起向左旋轉,並將結果存回REG暫存器中。 執行前: REG = 0000 0001 ;REG暫存器的值為00000001。 W = 0000 0000 ;W暫存器的值為00000000。 N = Z = C = 0 ;狀態暫存器中的負號旗標N、零號旗標Z與進位旗號C皆為0。 執行後: REG = 0000 0000 ;REG暫存器的值為00000000。 W = 0000 0000 ;W暫存器的值為00000000。 Z = C = 1 ;由於向左移後結果為0,因此零位旗號Z為1;進位旗號C為1。 N = 0 ;負號旗標N為0。 指令名稱:RRNCF 原 意:Rotate Right f (no Carry) 語 法:[label] RRNCF f, d 運 算 元: 運算說明:(f < n >) -> dest (f < 7 >) -> 7, 影響旗標:N, Z 指 令說明:將REG暫存內的值向右旋轉。若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。 類 別:邏輯運算指令。 組 別:邏輯指令。 範例一: RRNCF REG, 0 ;將REG暫存器的值向右旋轉,並將結果存回W暫存器中。 執行前: REG = 1110 0110 ;REG暫存器的值為11100110。 N = Z = 0 ;假設狀態暫存器的皆為0。 執行後: REG = 1110 0110 ;REG暫存器的值為11100110。 W = 0111 0011 ;W暫存器的值為11001100。 N = Z = 0 ;負號旗標N與零號旗標皆為0。 範例二: RRNCF REG, F ;將REG暫存器的值向右旋轉,並將結果存回REG暫存器中。 執行前: REG = 0000 0001 ;REG暫存器的值為00000001。 W = 0000 0000 ;W暫存器的值為00000000。 N = Z = 0 ;假設狀態暫存器的皆為0。 執行後: REG = 0000 0001 ;REG暫存器的值為00000001。 W = 0000 0000 ;W暫存器的值為00000000。 Z = 1 ;由於向右移後結果為0,因此零位旗號Z為1。 N = 0 ;負號旗標N為0。 指令名稱:SETF 原 意:Set f 語 法:[label] SETF f 運 算 元: 運算說明:0xFF -> f 影響旗標:無 指令說明:將REG暫存內的值全部設定為1。 類 別:資料轉移指令。 組 別:位元設定指令。 範例一: SETF REG ;將REG暫存器的值全部設定為1。 執行前: REG = 1110 0110 ;REG暫存器的值為11100110。 執行後: REG = 1111 1111 ;REG暫存器的值為11111111。 指令名稱:SLEEP 原 意:Enter SLEEP Mode 語 法:[label] SLEEP 運 算 元: 運算說明:0x00 -> WDT, 0 -> WDT後除器, , 影響旗標: 指令說明:CPU進入睡眠狀態。 類 別:程式流程控制指令。 組 別:程式流程指令。 範例一: SLEEP ;設定CPU進入睡眠狀態。 執行前: ;與的值未知。 執行後: ;暫存器的值為1。 ;暫存器的值為0。 指令名稱:SUBFWB 原 意:Subtract f From W with Borrow 語 法:[label] SUBFWB f, d, a 運 算 元: 運算說明:(W) – (f) – () -> dest 影響旗標:N, OV, C, DC, Z 指 令說明:W累加器的值減去f暫存器與進位旗標C,若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。 類 別:資料轉移指令。 組 別:數學運算減法指令。 範例一: SUBFWB REG, F, 0 ;W累加器的值減去REG暫存器與進位旗標C,並將運算後的結果放到REG暫存器中。 執行前: REG = 3 ;REG暫存器的值為3。 W = 2 ;W累加器的值為2。 C = 1 ;進位旗標C的值為1。 執行後: REG = 0xFF ;REG暫存器的值為0xFF。 W = 2 ;W累加器的值為2。 C = 0 ;進位旗標C的值為0。 Z = 0 ;零號旗號Z的值為0。 N = 1 ;負號旗號N的值為1。 ²運算結果為負。 範例二: SUBFWB REG, W, 0 ;W累加器的值減去REG暫存器與進位旗標C,並將運算後的結果放到W累加器中。 執行前: REG = 2 ;REG暫存器的值為2。 W = 5 ;W累加器的值為5。 C = 1 ;進位旗標C的值為1。 執行後: REG = 2 ;REG暫存器的值為2。 W = 3 ;W累加器的值為3。 C = 1 ;進位旗標C的值為1。 Z = 0 ;零號旗號Z的值為0。 N = 0 ;負號旗號N的值為0。 ²運算結果為正。 範例三: SUBFWB REG, F, 0 ;W累加器的值減去REG暫存器與進位旗標C,並將運算後的結果放到REG暫存器中。 執行前: REG = 1 ;REG暫存器的值為1。 W = 2 ;W累加器的值為2。 C = 0 ;進位旗標C的值為0。 執行後: REG = 0 ;REG暫存器的值為0。 W = 2 ;W累加器的值為2。 C = 1 ;進位旗標C的值為1。 Z = 1 ;零號旗號Z的值為1。 N = 0 ;負號旗號N的值為0。 ²運算結果為零。 指令名稱:SUBLW 原 意:Subtract W From Literal 語 法:[label] SUBLW k 運 算 元: 運算說明:k – (W) -> W 影響旗標:N, OV, C, DC, Z 指令說明:將常數k與W累加器的值相減並將結果放回W累加器中。 類 別:立即常數定址法。 組 別:數學運算減法指令。 範例一: SUBLW 0x02 ;將0x02與W累加器的值相減並將結果放回W累加器中。 執行前: W = 1 ;W累加器的值為1。 C = ? ;進位旗標C的值為未知。 執行後: W = 1 ;W累加器的值為1。 C = 1 ;進位旗標C的值為1。 Z = 0 ;零號旗號Z的值為0。 N = 0 ;負號旗號N的值為0。 ²運算結果為正。 範例二: SUBLW 0x02 ;將0x02與W累加器的值相減並將結果放回W累加器中。 執行前: W = 2 ;W累加器的值為5。 C = ? ;進位旗標C的值未知。 執行後: W = 0 ;W累加器的值為0。 C = 1 ;進位旗標C的值為1。 Z = 1 ;零號旗號Z的值為1。 N = 0 ;負號旗號N的值為0。 ²運算結果為零。 範例三: SUBLW 0x02 ;將0x02與W累加器的值相減並將結果放回W累加器中。 執行前: W = 3 ;W累加器的值為2。 C = ? ;進位旗標C的值未知。 執行後: W = 0xFF ;W累加器的值為0xFF。 C = 0 ;進位旗標C的值為0。 Z = 0 ;零號旗號Z的值為0。 N = 1 ;負號旗號N的值為1。 ²運算結果為負。 指令名稱:SUBWF 原 意:Subtract W From f 語 法:[label] SUBWF f, d, a 運 算 元: 運算說明:(f) – (W) -> dest 影響旗標:N, OV, C, DC, Z 指 令說明:將暫存器f的值減掉W累加器的值,若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。 類 別:資料轉移指令。 組 別:數學運算減法指令。 範例一: SUBWF REG, F, 0 ;REG暫存器的值減去W累加器的值,並將運算後的結果放到REG暫存器中。 執行前: REG = 3 ;REG暫存器的值為3。 W = 2 ;W累加器的值為2。 C = ? ;進位旗標C的值未知。 執行後: REG = 1 ;REG暫存器的值為1。 W = 2 ;W累加器的值為2。 C = 1 ;進位旗標C的值為1。 Z = 0 ;零號旗號Z的值為0。 N = 0 ;負號旗號N的值為0。 ²運算結果為正。 範例二: SUBWF REG, W, 0 ;REG暫存器的值減去W累加器的值,並將運算後的結果放到W累加器中。 執行前: REG = 2 ;REG暫存器的值為2。 W = 2 ;W累加器的值為2。 C = ? ;進位旗標C的值未知。 執行後: REG = 2 ;REG暫存器的值為2。 W = 0 ;W累加器的值為0。 C = 1 ;進位旗標C的值為1。 Z = 1 ;零號旗號Z的值為1。 N = 0 ;負號旗號N的值為0。 ²運算結果為零。 範例三: SUBWF REG, F, 0 ;REG暫存器的值減去W累加器的值,並將運算後的結果放到REG暫存器中。 執行前: REG = 1 ;REG暫存器的值為1。 W = 2 ;W累加器的值為2。 C = ? ;進位旗標C的值未知。 執行後: REG = 0xFF ;REG暫存器的值為0xFF。 W = 2 ;W累加器的值為2。 C = 0 ;進位旗標C的值為0。 Z = 0 ;零號旗號Z的值為0。 N = 1 ;負號旗號N的值為1。 ²運算結果為負。 指令名稱:SUBWFB 原 意:Subtract W From f with Borrow 語 法:[label] SUBFWB f, d, a 運 算 元: 運算說明:(f) – (W) – () -> dest 影響旗標:N, OV, C, DC, Z 指 令說明:f暫存器的值減去W累加器與進位旗標C,若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。 類 別:資料轉移指令。 組 別:數學運算減法指令。 範例一: SUBWFB REG, F, 0 ;REG暫存器的值減去W累加器與進位旗標C,並將運算後的結果放到REG暫存器中。 執行前: REG = 3 ;REG暫存器的值為3。 W = 2 ;W累加器的值為2。 C = 1 ;進位旗標C的值為1。 執行後: REG = 1 ;REG暫存器的值為1。 W = 2 ;W累加器的值為2。 C = 1 ;進位旗標C的值為1。 Z = 0 ;零號旗號Z的值為0。 N = 0 ;負號旗號N的值為0。 ²運算結果為正。 範例二: SUBWFB REG, W, 0 ;REG暫存器的值減去W累加器與進位旗標C,並將運算後的結果放到W累加器中。 執行前: REG = 2 ;REG暫存器的值為2。 W = 2 ;W累加器的值為2。 C = 0 ;進位旗標C的值為0。 執行後: REG = 2 ;REG暫存器的值為2。 W = 0 ;W累加器的值為0。 C = 1 ;進位旗標C的值為1。 Z = 1 ;零號旗號Z的值為1。 N = 0 ;負號旗號N的值為0。 ²運算結果為零。 範例三: SUBWFB REG, F, 0 ;REG暫存器的值減去W累加器與進位旗標C,並將運算後的結果放到REG暫存器中。 執行前: REG = 1 ;REG暫存器的值為1。 W = 2 ;W累加器的值為2。 C = 1 ;進位旗標C的值為1。 執行後: REG = 0xFF ;REG暫存器的值為0xFF。 W = 2 ;W累加器的值為2。 C = 0 ;進位旗標C的值為0。 Z = 0 ;零號旗號Z的值為0。 N = 1 ;負號旗號N的值為1。 運算結果為負。 指令名稱:SWAPF 原 意:Swap f 語 法:[label] SWAPF f, d, a 運 算 元: 運算說明:(f < 3:0 >) -> dest <7:4>, (f < 7:4 >) -> dest <3:0> 影響旗標:無 指 令說明:將f暫存器內的高4位元與低4位元做交換;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。 類 別:資料轉移指令。 組 別:資料交換指令。 範例一: SWAPF REG, F, 0 ;REG暫存器的值高4位元與低4位元做交換,並將運算後的結果放到REG暫存器中。 執行前: REG = 0x53 ;REG暫存器的值為0x53。 執行後: REG = 0x35 ;REG暫存器的值為0x35。 指令名稱:TBLRD 原 意:Table Read 語 法:[label] TBLRD (*; *+, *-, +*) 運 算 元:無 運算說明: uIf TBLRD *, (Prog. Mem (TBLPTR)) -> TABLAT; TBLPTR No Change; uIf TBLRD *+, (Prog. Mem (TBLPTR)) -> TABLAT; (TBLPTR) +1 ->TBLPTR; uIf TBLRD *-, (Prog. Mem (TBLPTR)) -> TABLAT; (TBLPTR) -1 ->TBLPTR; uIf TBLRD +*, (TBLPTR) +1 ->TBLPTR, (Prog. Mem (TBLPTR)) -> TABLAT. 影響旗標:無 指令說明:TBLRD是一個程式記憶體讀取的指令,它具有以下4種用法: 1.TBLRD * : 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。 2.TBLRD *+ : 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動加1。 3.TBLRD *- : 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動減1。 4.TBLRD +* : 先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。 類 別:程式記憶體讀寫指令。 組 別:資料讀取指令。 範例一: TBLRD *+ ;以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動加1。 執行前: TABLAT = 0x55 ;TABLAT暫存器的值為0x55。 TBLPTR = 0x00A356 ;TBLPTR暫存器的值為0x00A356。 MEMORY (0x00A356) = 0x34 ;記憶體位置0x00A356內的值為0x34。 執行後: TABLAT = 0x34 ;TABLAT暫存器的值為0x34。 TBLPTR = 0x00A357 ;TBLPTR暫存器的值為0x00A357。 範例二: TBLRD +* ;以TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。 執行前: TABLAT = 0xAA ;TABLAT暫存器的值為0xAA。 TBLPTR = 0x01A357 ;TBLPTR暫存器的值為0x01A357。 MEMORY (0x01A357) = 0x12 ;記憶體位置0x01A357內的值為0x12。 MEMORY (0x01A358) = 0x34 ;記憶體位置0x01A358內的值為0x34。 執行後: TABLAT = 0x34 ;TABLAT暫存器的值為0x34。 TBLPTR = 0x01A358 ;TBLPTR暫存器的值為0x01A358。 指令名稱:TBLWT 原 意:Table Write 語 法:[label] TBLWT (*; *+, *-, +*) 運 算 元:無 運算說明: uIf TBLWT *, (TABLAT) -> Holding Register; TBLPTR No Change; uIf TBLWT *+, (TABLAT) -> Holding Register; (TBLPTR) +1 -> TBLPTR; uIf TBLWT *-, (TABLAT) -> Holding Register; (TBLPTR) -1 -> TBLPTR; uIf TBLWT +*, (TBLPTR) +1 -> TBLPTR; (TABLAT) -> Holding Register; 影響旗標:無 指令說明:TBLWT是一個程式記憶體寫入的指令,它具有以下4種用法: 1.TBLWT *: 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。 2.TBLWT *+: 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動加1。 3.TBLWT *-: 以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動減1。 4.TBLWT +*: 先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。 類 別:程式記憶體讀寫指令。 組 別:資料寫入指令。 範例一: TBLWT *+ ;以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動加1。 執行前: TABLAT = 0x55 ;TABLAT暫存器的值為0x55。 TBLPTR = 0x00A356 ;TBLPTR暫存器的值為0x00A356。 Holding Register (0x00A356) = 0xFF ;記憶體位置0x00A356內的值為0xFF。 執行後: TABLAT = 0x55 ;TABLAT暫存器的值為0x55。 TBLPTR = 0x00A357 ;TBLPTR暫存器的值為0x00A357。 Holding Register (0x00A356) = 0x55 ;記憶體位置0x00A356內的值為0x55。 範例二: TBLWT +* ;以TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。 執行前: TABLAT = 0x34 ;TABLAT暫存器的值為0x34。 TBLPTR = 0x01389A ;TBLPTR暫存器的值為0x01389A。 Holding Register (0x01389A) = 0xFF ;記憶體位置0x01389A內的值為0xFF。 Holding Register (0x01389B) = 0xFF ;記憶體位置0x01389B內的值為0xFF。 執行後: TABLAT = 0x34 ;TABLAT暫存器的值為0x34。 TBLPTR = 0x01389B ;TBLPTR暫存器的值為0x01389A。 Holding Register (0x01389A) = 0xFF ;記憶體位置0x01389A內的值為0xFF。 Holding Register (0x01389B) = 0x34 ;記憶體位置0x01389B內的值為0x34。 指令名稱:TSTFSZ 原 意:Test f, Skip if 0 語 法:[label] TSTFSZ f, a 運 算 元: 運算說明:Skip if f = 0 影響旗標:無 指令說明:假設暫存器f內的值等於0,則跳過下一個指令;若是暫存器f內的值不等於0,則執行下一個指令。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。 類 別:程式流程控制指令。 組 別:位元比較指令。 範例一: HERE TSTFSZ REG, 1 ;若是暫存器REG內的值等於0,則執行GOTO N2這一行指令;若是暫存器REG內的值不等於0,則執行GOTO N1這一行指令。 NZERO GOTO N1 ; ZERO GOTO N2 ; 執行前: PC = HERE Address ;目前程式計數器的值在HERE這行指令的位址。 執行後: If REG = 0x00 ;若是暫存器REG內的值等於0。 PC = GOTO N2 ;程式計數器的值會跳到在GOTO N2這行指令的位址。 If REG 0x00 ;若是暫存器REG內的值不等於0。 PC = GOTO N1 ;程式計數器的值會跳到在GOTO N1這行指令的位址。 指令名稱:XORLW 原 意:Exclusive OR Literal With W 語 法:[label] XORLW k 運 算 元: 運算說明:(W) .XOR. k -> W 影響旗標:N, Z 指令說明:將常數k與W累加器的值做互斥或 (XOR) 運算,並將結果放回W累加器中。 類 別:立即常數定址法。 組 別:邏輯運算XOR指令。 範例一: XORLW 0xAF ;將常數k與W累加器的值做互斥或 (XOR) 運算,並將結果放回W累加器中。 執行前: W = 0xB5 ;W累加器的值為0xB5。 執行後: W = 0x1A ;W累加器的值為0x1A。 Z = N = 0 ;零號旗標Z與負號旗標N皆等於0。 範例二: XORLW 0x40 ;將常數k與W累加器的值做互斥或 (XOR) 運算,並將結果放回W累加器中。 執行前: W = 0xB5 ;W累加器的值為0xB5。 執行後: W = 0xF5 ;W累加器的值為0xF5。 N = 1 ;負號旗標N等於1。 Z = 0 ;零號旗標Z等於0。 範例三: XORLW 0xB5 ;將常數k與W累加器的值做互斥或 (XOR) 運算,並將結果放回W累加器中。 執行前: W = 0xB5 ;W累加器的值為0xB5。 執行後: W = 0x00 ;W累加器的值為0x00。 N = 0 ;負號旗標N等於0。 Z = 1 ;零號旗標Z等於1。 指令名稱:XORWF 原 意:Exclusive OR W With f 語 法:[label] XORWF f, d, a 運 算 元: 運算說明:(W) .XOR. (f) -> dest 影響旗標:N, Z 指 令說明:將常數k與W累加器的值做互斥或 (XOR) 運算,若d = 0,則運算後的結果放到W累加器中;若d = 1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運算後的結果放到目前RAM的位址中;若a = 1,則運算後的結果放到BSR暫存器所指定的RAM位址中。 類 別:資料轉移指令。 組 別:邏輯運算XOR指令。 範例一: XORWF REG,f ;REG暫存器的值與W累加器做互斥或 (XOR) 運算,並將運算後的結果放到REG暫存器中。 執行前: W = 0xB5 ;W累加器的值為0xB5。 REG = 0xAF ;REG暫存器的值為0xAF。 執行後: W = 0xB5 ;W累加器的值為0xB5。 REG = 0x1A ;REG暫存器的值為0x1A。 Z = N = 0 ;零號旗標Z與負號旗標N皆等於0。 範例二: XORWF REG,W ;REG暫存器的值與W累加器做互斥或 (XOR) 運算,並將運算後的結果放到REG暫存器中。 執行前: W = 0xB5 ;W累加器的值為0xB5。 REG = 0xAF ;REG暫存器的值為0xAF。 執行後: W = 0x1A ;W累加器的值為0x1A。 REG = 0xAF ;REG暫存器的值為0xAF。 Z = N = 0 ;零號旗標Z與負號旗標N皆等於0。
上一篇:超声波PIC单片机C程序
下一篇:单片机EC1数字旋扭编码仿真程序