单片机
返回首页

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。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 单稳态控制电路设计与分析

  • 光控电路设计与分析

  • IGBT模块通过控制门极阻断过电流

  • 开关电源的基本组成及工作原理

  • 基于M66T旋律发​​生器的电路图解析

  • 一个简单的红外耳机电路

    相关电子头条文章