PIC16F87X 基本指令說明 ADDLW K 是 Add Literal and W 縮寫,ADDLW K 此指令是將 W 的內容與數值 K 相加, 並將加完結果存於 W 內 即 (W)+K (W) 例 :W=0X11,K=0X15, 執行 ADDLW K 之後, 結果為 W=0X26,K=0X15 ADDWF 是 Add W and f 縮寫,ADDWF F,d 此指令是將 W 之內容與 RAM(file) 之內容相加, 並 將加完結果存於 W 或 RAM 內, 由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W 例 :W=0X11,KKK=0X15, 執行 ADDWF KKK,W 則 W=0X26,KKK=0X15 ANDLW 是 AND Literal with W 縮寫 ANDLW K 此指令是將 W 之內容與數值 K 作邏輯的 AND 運算, 並將結果存在 W 內 * 如果需將某個埠部份輸出清除為 0, 同時又需維持其他輸出 狀態不變時, 可用 AND 運算來完成 * 例 :W=0X11,K=0X15, 執行 ANDLW K 之後, 結果為 W=B 00010001,K=0X15 ANDWF 是 AND W with F 縮寫 ANDWF F,d 此指令是將 W 之內容與 RAM(file) 之內容 作 AND 的邏輯運算, 並將結果存於 W 或 RAM 內由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W 例 :W=0X11,KKK=0X15, 執行 ANDWF KKK,F 之後, 結果為 W=0X11,KKK=0X11 BCF 是 BIT CLEAR F 縮寫 BCF F,b 是將 RAM(file) 內的第 b 個 BIT 清除為 0 例 :KKK=0X15=B 00010101, 執行 BCF KKK,2 後,KKK=B 00010001 BSF 是 BIT SET F 縮寫 BCF F,b 是將 RAM(file) 內的第 b 個 BIT 設為 1 例 :KKK=0X15=B 00010101, 執行 BSF KKK,6 後,KKK=B 01010101 BTFSS 是 BIT TEST F, SKIP IF SET 縮寫 BTFSS F,b 此指令是將 RAM(file) 中第 b 個 BIT 做檢查 若第 b 個 BIT 為 1, 則將跳過接下來的一個指令, 才繼續執行 (2us 時間 ) 若 b 為 0, 則繼續往下執行, 不做任何執行順序的改變 (1us 時間 ) 例 :KKK=B 00010101 BTFSS KKK,2 ;;; 判斷 KKK=B 00010101 第 2 個 BIT 是否為 1 GOTO T1 GOTO T2 ;;; 因為 KKK 第 2 個 BIT 為 1, 故執行 GOTO T2 這一行 BTFSC 是 BIT TEST F, SKIP IF CLEAR 縮寫 BTFSC F,b 是判斷 RAM(file) 中的第 b 個 BIT 是否為 0 若 b 為 0 則跳過接下來的一個指令, 才繼續執行 (2us 時間 ) 若 b 為 1, 則繼續 往下執行 (1us 時間 ) 一般可用來偵測按鍵開關是否被按 例 :PORTD,0 接一按鍵開關如圖所示, 寫一程式去判斷 按鍵是否被使用按下 PUSH_BUTTOM: BTFSC PORTD,0 GOTO PUSH_BUTTOM ;; 按鍵沒有被按, 故 PORTD,0=1 GOTO PUSH_OK ;; 繼續偵測按鍵 若按鍵被按, ;;PORTD,0=0( 接地 ), 故執行跳到 PUSH_OK 處執行 CALL 是 CALL Subroutine 縮寫 CALL K 此指令是呼叫副程式 首先將返回位址 (PC+1) 第 1 頁 R=10KΩ 5V SW PORTD,0 PIC
放到堆疊暫存內, 再將 K 所指的 11 個 BIT 立即位址放到 PC 之 0~10 BIT 中, 最後將 PCLATH 暫 存中第 3~4 BIT 載入到 PC 較高的位元組 ( 第 12 和 13 BIT) 例 : T1: CALL T1 ;;; 呼叫 T1 的副程式 ( 將下一個位址放入堆疊 ). RETURN ;;; 副程式執行完畢,RETURN 返回主程式 並將堆疊的位址填回 CLRF 是 CLEAR F 縮寫 CLRF F 是將 RAM(file) 內容清除為 0, 並將 Z 旗標設為 1 例 :KKK=0XFA, 執行 CLRF KKK 後,KKK=0X00 CLRW 是 CLEAR W 縮寫 CLRW 是將 W 內容清除為 0, 並將 Z 旗標設為 1 CLRWDT 是 CLEAR WATCHDOG TIMER 縮寫 CLRWDT 是把 看門狗計時器 的內容清 除為 0 所謂 看門狗計時器, 是 CPU 為防止本身當機而在其內部設計的一個計時器 其動 作原理主要是可以獨立計時, 不受 CPU 振盪電路的控制, 且計時終了, 會將 CPU 重置 因此, 如果看門狗計時器被啟動, 則 CPU 必須配合看門狗計時器的時間, 不斷的將計時器清除, 以 防止計時終了 而萬一 CPU 發生當機, 無法將看門狗計時器清除, 因此, 看門狗計時器會計 時終了, 而會自動將 CPU 重置 (RESET) 這就是利用看門狗計時器來防止 CPU 當機的方法 COMF 是 COMPLEMENT F 縮寫 COMF F,d 是將 RAM(file) 內容取 1 的補數 並將結果 存於 W 或 RAM 內, 由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W 例 :KKK=B 10101010, 執行 COMF KKK 後,KKK=B 01010101 DECF 是 DECREMENT F 縮寫 DECF F,d 是將 RAM(file) 之內容減 1 並將結果存於 W 或 RAM 內, 由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W 例 :KKK=0X23, 執行 DECF KKK,0,KKK=0X23, W=0X22 DECFSZ 是 DECREMENT F, SKIP IF 0 縮寫 DECFSZ F,d 是將 RAM(file) 之內容減 1, 並 檢查是否為 0, 以及將結果存於 W 及 RAM 內, 由 d 決定 若減一之後為 0, 則跳過下一行指令 (2us), 若不為 0, 則繼續執行下一行指令 (1us) 例如 :KKK=0X05 DECFSZ KKK,F ;;; 迴圈執行四次後 (1us+2us)x4, 第五次時跳到 (2us)MOVWF PORTC GOTO TEST MOVWF PORTC GOTO 是 UNCONDITIONAL BRANCH 縮寫 GOTO K 是無條件改便執行順序的指令 例 如,GOTO MAIN 就是指程式執行到指令後, 會跳到 LABEL 為 MAIN 的地方去執行 (2us) INCF 是 INCREMENT F 縮寫 INCF F,d 是將 RAM(file) 之內容加 1, 並將結果存於 W 或 RAM 內, 由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W 第 2 頁
例 :KKK=0X1B, 執行 INCF KKK,F 後,KKK=0X1C INCFSZ 是 INCREMENT F, SKIP IF 0 縮寫 INCFSZ F,d 是將 RAM(file) 之內容加 1, 並 檢查結果是否為 0, 以及將結果存於 W 或 RAM 內, 由 d 決定 而若加一的結果為 0, 則跳過下 一行指令 (2us); 若不為 0, 則執行下一行指令 (1us) 例 :KKK=0XFC INCFSZ KKK,F ;;; 對 KKK 執行加 1, 等加到 KKK=0XFF 0X00 則跳到 TEST2 執行 GOTO TEST GOTO TEST2 IORLW 是 Inclusive OR Literal with W 縮寫 IORLW K 是將 W 內容與數值 K 作邏輯的 OR 運 算, 並將結果存於 W 內 * 常用於某個埠的部份輸出設定為 1, 同時維持其他點輸出不變 例 :W=B 00101011,K=0XCD=B 11001101 執行 IORLW K 之後, W=B 11101111,K=0XCD IORWF 是 Inclusive OR W with F 縮寫 IORWF F,d 是將 W 內容與 RAM(file) 之內容作 OR 的邏輯運算, 並將結果存於 W 或 RAM 內, 由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則 結果存到 W 例 :W=B 00101011,KKK=0XCD=B 11001101 執行 IORWF K 之後, W=B 00101011,KKK=B 11101111 MOVF 是 MOVE F 縮寫 MOVF F,d 是將 RAM(file) 內容複製搬移 至於搬移複製到那裡, 則由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W 特別注意 : 當 d=1 時, 其實 並沒有改變 RAM 的內容 只是藉由此指令使 CPU 知道 RAM 的內容是否為零, 因此常被用來作 為測試 RAM 的內容是否為 0 之用 例 :KKK=0X22 (1) MOVF KKK,1 ;;; 測試 KKK 是否為 0, 不改變 KKK 的值 (2) MOVF KKK,0 ;;; 將 KKK 的內容, 複製移到 W 所以 W=KKK=0X22 MOVLW 是 Move Literal to W 縮寫 MOVLW K 將數值 K 存放於 W 內 *MOVLW 不影響任何旗標 * 例 : 如果要讓變數 XXX=6 用組合語言寫法為 MOVLW.6 ;;; 將 6 移到 W 暫存器 MOVWF XXX ;;; 再將 W 暫存器之值 6 移到 ( 複製 )XXX 所以 XXX=6 MOVWF 是 Move W to f 縮寫 MOVWF F 是將 W 的內容複製到 RAM(file) 內 特別注意 :MOVWF F,f 或 MOVWF F,w 這樣寫法是錯誤的 *MOVWF 不影響任何旗標 * 例 :W=B 11110101 執行 MOVWF PORTC 則 PORTC=B 11110101 NOP 是 No Operation 縮寫 此指令是要 CPU 什麼事都不要做, 只要消耗一個指令週期的時間 RETFIE 是 Return From Interrup 縮寫 此指令是中斷副程式的結尾所必須的指令, 意思要結束中斷副程式, 返回當初被中斷的地方, 並且重新啟動中斷的功能 (PIC 中斷在 0x04) RETLW 是 Return with Literal in W 縮寫 RETLW K 通常與 CALL 合用, 是查表副 第 3 頁
程式的結尾所必須指令之一 例 :KKK=0X01 MOVF KKK,W ; CALL TABLE MOVWF PORTC ;;;PORTC=0X11 ;;; 將要查表第幾筆的值給 W(W=1) ;;; 呼叫 TABLE 的表, 並將 0X11 值載入 W 內 TABLE: ADDWF PCL,F ;;; 查表的第一行, 需改變 PCL 的指標位置 RETLW 0X10 ;;; RETLW 0X11 ;;; 將 0X11 存放在 W 內, 返回主程式 RETURN 是 Return from Subroutine 縮寫 RETURN 是要結束副程式, 並返回至呼叫處的指 令 其與 RETLW 是同類指令, 只是 RETURN 只有返回並不會改變 W 內的值 而 RETLW 不但 返回, 並且改變 W 內容之值 RLF 是 Roate Left f through Carry 縮寫 RLF f,d 是將 RAM(file) 之內容及進位旗標左 旋 而旋轉完結果存放位置由 d 決定 若 d=1, 則結果存到 RAM(file) 若 d=0, 則結果存到 W 例 : 若 KKK=B 01010101,C=1 時 C=1 0 1 0 1 0 1 0 1 執行 RLF KKK,f, 結果如下 C=0,KKK=B 10101011 C=0 1 0 1 0 1 0 1 1 RRF 是 Rotate Right f through Carry 縮寫 RRF f,d 是將 RAM(file) 之內容及進位旗標右旋 而旋轉完結果存放位置由 d 決定 若 d=1, 則結果存到 RAM(file) 若 d=0, 則結果存到 W 例 :KKK=B 01010101,C=1 時, C=1 0 1 0 1 0 1 0 1 執行 RRF KKK,f 後, 結果如下 KKK=B 10101010,C=1 C=1 1 0 1 0 1 0 1 0 SLEEP 是要 CPU 進入省電模式 (POWER DOWN MODE) SUBLW 是 Subtract W from Literal 縮寫 SUBLW K 是先將 W 之內容取 2 的補數後, 再與數值 K 相加, 並將加完結果存於 W 內 **W=K-W,W 只能當減數 ** 第 4 頁
例 :W=H 23,K=H 3A 執行 SUBLW K 之後, 即 K W W=H 17 SUBWF 是 Subtract W from f 縮寫 SUBWF f,d 是先將 W 之內容取 2 的補數後, 再與 RAM(file) 的內容相加, 並將加完結果存於 W 或 RAM(file) 內則由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W SWAPF 是 Swap Nibbles in f 縮寫 SWAPF f,d 是將 RAM(file) 之內的高位元組 ( 第 4~7BIT) 與低位元組 ( 第 0~3 位元 ) 作互換, 並將互換結果存於 W 或 RAM(file) 內則由 d 決定 若 d=1, 則 結果存到 RAM 若 d=0, 則結果存到 W 由於 SWAPF 並不影響任何旗標, 適合做 STATUS 資料 或重要資料需在中斷時的備份使用 例 :STATUS=H A3 =B10100011, W=H 23 =B 00100011, STATUS_TEMP=H 00 EX: ORG 0X04 SWAPF STATUS,W ;;; 中斷副程式的 0X04 向量位置 ;;; 執行程式之後,STATUS=H A3,W=H 3A MOVWF STATUS_TEMP ;;;STATUS_TEMP=H 3A ;;; 將 STATUS 資料還原的方法 SWAPF STATUS_TEMP,W ;;; 再進行交換一次,STATUS_TEMP=H 3A,W=H A3 MOVWF STATUS.. RETFIE ;;; 再將結果複製到 STATUS,STATUS=H A3 ;;;; 中斷副程式返回指令 XORLW 是 Exclusive OR Literal with W 縮寫 XORLW K 是將 W 的內容與數值 K 作互 斥或 (XOR) 運算, 並將結果存於 W 內 例 :W=B 10101111, K=B 10100000 XORLW B 10100000 結果 :W=B 00001111 XORWF 是 Exclusive OR W with F 縮寫 XORWF f,d 是將 W 的內容與 RAM(file) 作互斥 或 (XOR) 運算, 並將結果存於 W 內或 RAM 內, 由 d 決定 若 d=1, 則結果存到 RAM 若 d=0, 則結果存到 W *XORWF 指令常用於比對二個變數是否相等 若兩者相同, 則零旗標被設為 1; 反之, 兩數若不相等, 則零旗標被清除為 0 * 例 :AAA=B 00110010,KKK=B 00110010 EX: MOVF AAA,W XORWF KKK, W ;; 將 AAA 的值複製到 W,W=B 00110010 ;; 將 KKK 與 W 的內容進行互斥或比對, 由於 W=KKK BTFSC STATUS,Z ;;; 判斷 Z 旗標是否為 0 故 W XOR KKK 會使得 W=0 GOTO NON_ZERO ;;; 若不是 0, 則到 NON_ZERO GOTO ZERO ;;; 由於 W=0, 所 Z 旗標 =0, 故跳到 ZERO 處執行 第 5 頁 PIC16F87X 指令列表 W: 指 W 暫存器, 所有運算 交換 邏輯比對都和 W 暫存器有關 F: 代表 RAM(file)( 相當可讀寫的記憶體 ),
包含使用者自訂的變數或一些特殊暫存器 L: 代表數字 (Literal), 也就是常數 f 代表來源位址,d 代表目的地 址 (d=0 代表指令運算結果存到工作暫存器 W 之內,d=1 代表指令運算結果存到 RAM(File) b 代表位元 ( 對 8 位 元微處理器而言,b=0~7),k 代表常數 ( 對 8 位元微處理器而言,k=0~255 之整數, 相常於十六進位數字 H 00 ~H FF 至於影響旗標內 C 指進位旗標 (Carry Flag,STATUS,0),Z 代表零旗標 (STATUS,2),DC 則代表半 進位 (STATUS,1) ( 一 ) 位元組 (Bytes) 指令集 指令 運算元 指令說明 執行週期 影響旗標 ADDWF f,d w+f, 結果存入 d 1 C,DC,Z ANDWF f,d w and f, 結果存入 d 1 Z CLRF f 清除 f 的內容 ( 結果 f=0) 1 Z CLRW 清除 w 的內容 ( 結果 w=0) 1 Z COMF f,d 將 f 取 1 的補數, 結果存入 d 1 Z DECF f,d 將 f 減 1, 結果存入 d 1 Z DECFSZ f,d 將 f 減 1, 結果存入 d, 若結果為 0, 則跳過接下來 1(2) 的一個指令 INCF f,d 將 f 加 1, 結果存入 d 1 Z INCFSZ f,d 將 f 加 1, 結果存入 d, 若結果為 0, 則跳過接下來 1(2) 的一個指令 ( 執行下下行 ) IORWF f,d w or f, 結果存入 d 1 Z MOVF f,d 複製 f, 結果存入 d 1 Z MOVWF f 將 w 的內容複製到 f 1 NOP 不動作 ( 但會耗掉一個指令週期 ) 1 RLF f,d 將 f 的內容和 C( 進位旗標 ) 左轉一個指令 1 C RRF f,d 將 f 的內容和 C( 進位旗標 ) 右轉一個指令 1 C SUBWF f,d f-w, 結果存入 d 1 C,DC,Z SWAPF f,d 將 f 之個 / 十位互換, 不影響旗標 1 XORWF f,d w xor f, 結果存入 d 1 Z ( 二 ) 位元 (Bit) 指令集 指令 運算元 指令說明 執行週期 影響旗標 BCF f,b 將 f 的第 b 個位元清除為 0 1 BSF f,b 將 f 的第 b 個位元設定為 1 1 BTFSC f,b f 的第 b 個位元為 0 則跳到下下行指令 1(2) BTFSS f,b f 的第 b 個位元為 1 則跳到下下行指令 1(2) ( 三 ) 常數 (Literal) 與控制指令集 指令 運算元 指令說明 執行週期 影響旗標 ADDLW k w+l ( 常數 ), 結果存入 w 1 C,DC,Z ANDLW k w AND l ( 常數 ), 結果存入 w 1 Z CALL k 呼叫副程式 ( 儲存位址 ) 2 CLRWDT 清除 WDT 1 TO,PD GOTO k 改變程式之執行順序 ( 不存位址 ) 2 IORLW k w OR l ( 常數 ), 結果存入 w 1 Z MOVLW k 將 l ( 常數 ) 複製到 w 1 RETFIE 中斷副程式之 return (1 GIE) 2 RETLW k 查表之 return( 注意程式之頁數 page) 2 RETURN 一般的 return 2 SLEEP 微處理器進入省電狀態 1 TO,PD SUBLW k l ( 常數 ) w, 結果存入 w 1 C,DC,Z XORLW k w XOR l ( 常數 ), 結果存入 w 1 Z 資料來源 :PIC16F87X 微處理器技術精解 盧春林 ( 民 92) 標高電腦股份有限公司 第 6 頁