zoukankan      html  css  js  c++  java
  • 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            ;子程序返回
  • 相关阅读:
    js例子
    js表单验证
    Python之Numpy的基础及进阶函数(图文)
    Numpy库的下载及安装(吐血总结)
    世界,你好!
    用逻辑回归模型解决互联网金融信用风险问题
    用逻辑回归模型解决互联网金融信用风险问题
    如何建立投资模型
    如何建立投资模型
    秒懂数据类型的真谛—Python基础前传(4)
  • 原文地址:https://www.cnblogs.com/loves6036/p/5369684.html
Copyright © 2011-2022 走看看