PIC16F877XA指令系統(匯編語言)


宏觀理解

asm-advanced.png

核心助記符

助記符 功能說明 英文全稱
ADD 相加 add
SUB 相減 substract
RL 循環左移 rotate left
RR 循環右移 rotate right
AND and
IOR inclusive or
XOR 異或 exclusive or
COM 取反 complement
INC 加1 increase
DEC 減1 decrease
MOV 傳送 move
CLR 清零 clear
RET 返回 return
BTF 位測試 bit test

指令系統補充字符說明

字符 功能說明 英文全稱
W 工作寄存器(即累加器) -
f 寄存器地址(取7位寄存器地址,00H~7FH) -
b 8位寄存器f內位地址(0~7) bit
K 立即數(8位常數或11位地址)、常量或標號 -
L 指令操作數中含有8位立即數K -
d 目標地址選擇:d=0,結果至W;d=1,結果至f destination
FSZ 寄存器f為0,則間跳 skip if 0
FSC 寄存器f的b位為0,則間跳 skip if clear
FSS 寄存器f的b位為1,則間跳 skip if set
( ) 表示寄存器的內容 -
(( )) 表示寄存器間接尋址的內容 -
表示運算結果送入目標寄存器 -

常用指令實例

芯片手冊

寄存器加1指令:INCF

【格式】 INCF F,d

【功能】寄存器F加1

【說明】

(1)INCF是Increment F的縮寫;

(2)在PIC系列8位單片機中,常用符號F代表片內的各種寄存器和F的序號地址;

(3)d=0時,結果存入W;d=1時,結果存入F。

【實例】

INCF    PORTC,1    ;將PORTC加1

寄存器減1指令:DECF

【格式】 DECF F,d

【功能】寄存器F減1

【說明】

(1)DECF是Decrement F的縮寫;

(2)d=0時,結果存入W;d=1時,結果存入F。

【實例】

ENCODER     EQU 0X21

            ……

            DECF     ENCODER,1 ;將ENCODER減1

寄存器清零指令:CLRF

【格式】 CLRF F

【功能】寄存器清零

【說明】

(1)CLRF是Clear F的縮寫;

(2)F寄存器被清為全0,使狀態位Z=1。

【實例】

CLRF    TRISC       ;對TRISC 清零

W清零指令:CLRW

【格式】 CLRW

【功能】寄存器W清零

【說明】

(1)CLRW是Clear W的縮寫;

(2)W為PIC單片機的工作寄存器;

(3)W寄存器被清為全0,使狀態位Z=1。

【實例】

CLRW        ;W=00H

F寄存器傳送指令:MOVF

【格式】 MOVF F,d

【功能】將F寄存器內容傳送到F或W

【說明】

(1)MOVF是Move F的縮寫;

(2)當d=1時,傳到F本身;當d=0時,傳到W;

(3)影響狀態位Z

【實例】

MOVF       PORTB,0    ;PORTB口內容送W

MOVWF      PORTA     ;W內容即PORTB口內容送PORTA

W寄存器傳送指令:MOVWF

【格式】 MOVWF F

【功能】 W寄存器傳送

【說明】

(1)MOVWF是Move W to F的縮寫;

(2)將W寄存器內容傳到F,W內容不變;

(3)不影響狀態位。

【實例】

MOVLW   0x0B        ;送0BH送W

MOVWF   PORTB       ;送W內容到PORTB口

遞增跳轉指令:INCFSZ

【格式】 INCFSZ F,d

【功能】 遞增跳轉

【說明】

(1)INCFSZ是Increment F,Skip if 0的縮寫;

(2)F寄存器內容加1后,當d=1時結果存入F,當d=0時存入W;

(3)若結果為0則跳過下一條指令,否則順序執行;

(4)影響狀態位Z。

【實例】

LOOP   INCFSZ     COUNT1,1   ;COUNT1加1,結果存到COUNT1

       GOTO       LOOP      ;結果不為零,循環

       MOVWF      COUNT2     ;結果為零時,執行該語句

遞減跳轉指令:DECFSZ

【格式】 DECFSZ F,d

【功能】遞減跳轉

【說明】

(1)DECFSZ是Decrement F,Skip if 0的縮寫;

(2)F寄存器內容減1,結果存入F本身(d=1)或W(d=0);

(3)如果結果為0則跳過下一條指令,否則順序執行;

(4)影響狀態位Z;

(5)實際指令中,當d=1時,該項常常被略去。

【實例】

DELAY   MOVLW    25          ;延時子程序

        MOVWF    N           ;給N賦值25

        LOOP     DECFSZ N,1  ;N-1送回N並判結果=0?是!跳出循環

        GOTO     LOOP        ;否!循環回去

        RETURN               ;返回

位清零指令:BCF

【格式】 BCF F,B

【功能】位清0

【說明】

(1)BCF是Bit Clear F的縮寫;

(2)符號B是表示片內某個8位數據寄存器F的位號(或位地址);

(3)指令的意思是:將寄存器的第B位清0。

【實例】

BCF     REG1,2     ;把寄存器REG1的第2位清零

位置1指令:BSF

【格式】 BSF F,B

【功能】位置1

【說明】(1)BSF是Bit Set F的縮寫;

(2)將寄存器F的第B位置1。

【實例】

BSF     STATUS,RP0      ;設置文件寄存器的體1

位測試為零跳轉指令:BTFSC

【格式】 BTFSC F,B

【功能】位測試為0跳轉

【說明】

(1)BTFSC是Bit Test,Skip if Clear的縮寫;

(2)測試F寄存器的第B位,若F(B)=0則調到下一條指令,否則順序執行。

【實例】

BTFSC       PORTB,0    ;檢測PORTB口中的第0位是否為0?是!跳過下一條指令

GOTO       CHECK       ;否!則轉到標號為CHECK的語句

CALL       DELAY       ;PORTB的第0位是1則直接執行該語句,調用延時子程序

位測試為1跳轉指令:BTFSS

【格式】 BTFSS F,B

【功能】位測試位1跳轉指令

【說明】

(1)BTFSS是Bit Test F,Skip if Set的縮寫;

(2)測試F寄存器的第B位,若F(B)=1,則跳轉到下一條指令,否則順序執行。

【實例】

BTFSS       PORTB,0     ;檢測PORTB口中的第0位是否為1?是!跳過下一條指令

GOTO        CHECK       ;否!則轉到標號為CHECK的語句

CALL        DELAY       ;PORTB的第0位是1則直接執行該句,調用延時子程序

常數傳送指令:MOVLW

【格式】 MOVLW K

【功能】常數傳送

【說明】(1)MOVLW是Move literal to W的縮寫;

(2)將8位立即數傳送到W寄存器,k表示常數、立即數和標號;

(3)不影響狀態位

【實例】

MOVLW       0x1E    ;常數30送W

子程序調用指令:CALL

【格式】 CALL K

【功能】子程序調用

【說明】

(1)CALL是CALL subroutine的縮寫;

(2)K為立即地址;

(3)不影響狀態位。

【實例】

CALL    DELAY         ;調用延時子程序

DELAY   ……            ;延時子程序DELAY

        ……

        RETURN

無條件跳轉指令:GOTO

【格式】 GOTO K

【功能】無條件跳轉

【說明】

(1)GOTO是Go to address的縮寫;

(2)指令中的K,常與程序中的標號聯系起來;

(3)不影響狀態位。

【實例】

STOP    GOTO    STOP    ;循環執行GOTO語句,從而停機

子程序返回指令:RETURN

【格式】 RETURN

【功能】子程序返回

【說明】

(1)RETURN是Return from Subroutine的縮寫;

(2)將堆棧頂端單元內容彈出並送入PC,從而返回主程序斷點處;

(3)不影響狀態位。

【實例】

SUB  MOVLW   01H     ;子程序

     ……

     RETURN          ;子程序返回

空操作指令:NOP

【格式】 NOP

【功能】空操作

【說明】

(1)NOP是No Operation的縮寫;

(2)不產生任何操作,僅使PC加1,消耗一個指令周期NOP;

(3)不影響狀態位。

【實例】

MOVLW       0xOF      ;送OFH到W
    
MOVWF       PORTB       ;W內容寫入B口
     
NOP                 ;空操作

MOVF        PORTB,W     ;讀操作

常用偽指令實例

符號名賦值偽指令:EQU

【格式】符號名 EQU nn

【功能】符號名賦值

【說明】

(1)給符號名或寄存器賦值,符號名一旦由EQU賦值,其值就不能再重新定義;

(2)nn是一個長度不同的二進制數值。

【實例】

COUNT       EQU     100     ;定義COUNT為常數100

程序起始地址偽指令:ORG

【格式】 ORG nnnn

【功能】程序起始地址

【說明】

(1)用於指定該偽指令后面的源程序存放的起始地址,也就是匯編后的機器碼目標程序在單片機的程序存貯器中開始存放的首地址;

(2)nnnn是一個13為長的地址參數。

【實例】

ORG 0x00     ;程序匯編地址從00H開始

程序結束偽指令:END

【格式】 END

【功能】程序結束

【說明】

(1)指令末的偽指令END是通知匯編程序MPASM結束對源程序的匯編,即使后面還有語句,也不再予以匯編;

(2)在一個源程序中必須有END偽指令;

(3)只能有一個END;

(4)放在整個程序的最后。

【實例】直接在程序末尾使用,從而結束程序

調入外部函數偽指令:INCLUDE

【格式】 INCLUDE “文件名”

【功能】調入外部函數

【說明】

(1)用來告訴匯編器,將一個預先編好的外部程序文件包含進來,作為本源程序的一部分;

(2)這樣可以減少重復勞動,提高編程效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM