PIC單片機匯編語言學習(一)


1、匯編語言的語句格式:

標號 操作碼(指令助記符) 操作數 ;注釋
(label) (opcode) (operand) (comment)

2、常用偽指令

a.EQU——符號名賦值偽指令
格式:符號名 EQU nn

b.ORG——程序起始地址定義偽指令
格式:ORG nnnn

c.END——程序結束偽指令
格式:END

d.LIST——列表選項偽指令
格式:LIST [可選項,可選項,......]

e.INCLUDE:調入外部程序文件偽指令
格式:INCLUDE "文件名"


2、分支程序結構

——對於程序中的指令運用作幾點說明:
(1)凡是需要2個數參與的邏輯運算(與、或、異或)和算術運算(加、減),都需要事先將其中一個操作數放入W中。對於在此使用的減法指令更要格外關注,應預先把減數放人W中,或者說,預先放入W中的數,在運算中是當做減數,而寄存器中的數當做了被減數。
(2)一條條件跳轉指令往往需要跟隨一條無條件跳轉指令,才能實現長距離的轉移和程序的分支。
(3)PIC單片機的指令系統中沒有設置專用的停機指令,可以用一條跳轉到自身的無條件跳轉指令GOTO來實現。

3、PIC單片機指令

由3種基本類型指令組成:
a.字節操作類指令
b.位操作類指令
c.立即數和控制操作類指令

對於字節操作指令,f——>文件寄存器標識符,d——>目標寄存器標識符

說明:目標標識符指定了操作結果的存放位置:
d=0 操作結果存入W寄存器
d=1 操作結果存入指定的文件寄存器,d默認值為1

 

 4、指令集

5、例子

  1 ;--------------------------------------------------------
  2 
  3 ;順序程序結構
  4 ;將20H單元低4位取出存入21H,高四位取出存入22H
  5 ;要點:ANDLW和SWAPF
  6 
  7 ;---------------------------------------------------------
  8     MOVF    20H,0    ;將20H單元的內容送人W
  9     ANDLW    0FH        ;W高四位清零低4位保持不變
 10     MOVWF    21H        ;將拆分后的低4位送21H
 11     SWAPF    20H,0    ;將20H單元內容高、低半字節換位后送W
 12 
 13     ANDLW    0FH        ;再將W高四位清0低四位保持不變
 14     MOVWF    22H        ;將拆分后的高四位送22H單元
 15 
 16 
 17 ;--------------------------------------------------------
 18 
 19 ;分支程序結構
 20 ;RAM中20H和21H單元存放2個數,找出大着存入22H單元
 21 ;要點:兩數做減法,判斷標志位C的值
 22 
 23 ;---------------------------------------------------------
 24 STATUS    EQU    03H    ;定義STATUS寄存器地址為03H
 25 C        EQU    0    ;定義進位/借位標志C在STATUS中得地址為0
 26         MOVF    20H 0    ;將20H單元的內容送人W
 27         SUBWF    21H 0    ;用21H單元的內容減去W中的內容,結果存在W中
 28         BTFSS    STATUS,C;若C=1,沒借位,則21H單元中的數大,跳到F21BIG
 29         GOTO    F20BIG    ;若C=0,有借位,20H單元中得數較大,則跳至F20BIG
 30     
 31 F21BIG    MOVF    21H,0    ;將21H中的內容存入W寄存器
 32         MOVWF     22H        ;再將它轉存到22H單元
 33         GOTO    STOP    ;跳過下面兩條指令到程序末尾
 34         
 35 F20BIG    MOVF    20H,0    ;將20H中的內容存入W寄存器
 36         MOVWF     22H        ;再將它轉存到22H單元
 37 
 38 STOP    GOTO    STOP    ;任務完成,停機,原地踏步
 39 
 40 
 41 ;--------------------------------------------------------
 42 
 43 ;循環程序結構
 44 ;數據存儲器中,從地址30H開始的50個單元全部寫入00H
 45 ;要點:間接尋址寄存器FSR當做地址指針
 46 
 47 ;---------------------------------------------------------
 48 COUNT    EQU        20H        ;指定20H單元作為循壞次數計數器(即循環變量)
 49 FSR        EQU     04H        ;定義FSR寄存器地址為04H
 50 INDF    EQU        00H        ;設定INDF寄存器地址為00H
 51         MOVLW    D50        ;把計數器初值50送入W
 52         MOVWF    COUNT    ;再把50轉入計數器(作為循環變量的操作值)
 53         MOVLW    30H        ;把30H(起始地址)送入W
 54         MOVWF    FSR     ;再把30H轉入寄存器FSR(用作地址指針)
 55         
 56 NEXT    CLRF    INDF    ;把以FSR內容為地址所指定的單元清0
 57         INCF    FSR,1    ;地址指針內容加1,指向下一單元
 58         DECFSZ    COUNT,1    ;計數值減1,結果為0就跳過到下一條指令到STOP處
 59         GOTO    NEXT    ;跳轉回去並執行下一次循環
 60 STOP    GOTO    STOP     ;循環結束之后執行該語句,實現停機
 61 
 62 ;--------------------------------------------------------
 63 
 64 ;子程序結構
 65 ;3個數最大者放入40H單元
 66 
 67 ;---------------------------------------------------------
 68 STATUS    EQU        03H
 69 C        EQU        00H
 70 X        EQU        20H
 71 Y        EQU        21H
 72 Z        EQU        22H
 73 ;--------------------------------------------------------
 74 
 75 ;主程序
 76 
 77 ;---------------------------------------------------------
 78 
 79 MAIN    MOVF    30H,0
 80         MOVWF    X
 81         MOVF    21H,0
 82         MOVWF    Y
 83         CALL    SUB
 84         MOVF    Z,0
 85         MOVWF    X
 86         MOVF    32H,0
 87         MOVWF    Y
 88         CALL SUB
 89         MOVF    Z,0
 90         MOVWF    40H
 91 STOP    GOTO    STOP
 92 ;--------------------------------------------------------
 93 
 94 ;子程序:(入口參數:X和Y,出口參數:Z)
 95 
 96 ;---------------------------------------------------------
 97 SUB        MOVF    X,0        ;將X內容送人W
 98         SUBWF    Y,0        ;Y內容減去W內容,結果存入W
 99         BTFSS    STATUS,C;若C=1,沒有發生借位,執行下一條,否則跳轉
100         GOTO X_BIG        
101         
102 Y_BIG    MOVF    Y,0        ;將Y中的數據送入W
103         MOVWF    Z        ;再將它轉存到Z
104         GOTO    THEEND    ;跳過下面兩條到末尾
105         
106 X_BIG    MOVF    X,0        ;將X中的數據送入W
107         MOVWF    Z        ;再將它轉存到Z
108 THEEND    RETURN            ;子程序返回

 


免責聲明!

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



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