zoukankan      html  css  js  c++  java
  • PIC单片机基础2

    PIC中档系列单片机,每条指令14位,共有35条汇编指令,根据操作对象不同,可将其分为三类:

    • 字节操作类指令
    • 位操作类指令
    • 立即数与控制类操作指令

    1、字节操作类指令,以MOVF指令为例:

    指令:MOVF     f, d

    说明:

    • 功能:寄存器f值传送;
    • MOVF为助记符,即操作指令,大小写均可;
    • f代表文件寄存器标识符,即RAM寄存器(PIC单片机基础1中有说明),取值范围为[0, 127]
    • d代表目标标识符,表明指令操作的结果放在何处;

       d=0:操作的结果放在W寄存器中;

       d=1:操作的结果放在f寄存器中;

    • 影响状态位:Z
    • 指令周期:1(执行本指令需要的时间)

    实例1

    假设执行指令前,F寄存器22H的值为05HW寄存器内的值为00H

    MOVF    22H, 0

    由于d=0,指令执行后结果存入W寄存器:

      22HF寄存器)= 05H

      W =  05H

      Z =  0

    指令应用:由于PIC指令中,不存在F寄存器之间的值传递操作指令,这种操作需要借助W寄存器作为中介,并且此指令也可以直接给W寄存器赋值;

    实例2

    假设执行指令前,F寄存器22H的值为05HW寄存器内的值为00H

    MOVF    22H, 1

    由于d=1,指令执行后结果存入F寄存器(即22H):

      22HF寄存器)= 05H

      W =  00H

      Z =  0

    指令应用:指令操作以后,寄存器值大小、位置都没变,那么这种指令有什么用呢?答案是:通过状态位Z判断寄存器的值是不是0

    PIC的汇编指令中,我们没有高级语言中if (var == 0)这样方便的判断操作,想要判断一个寄存器的值是不是0,只有通过状态寄存器中的Z位来判断。当某条可以影响Z状态位的指令执行后,如果Z=0,则说明指令执行的结果非0;如果Z=1,则说明执行的结果为0

    上面的指令操作后Z=0,所以判断22H中的值非0

    2、位操作类指令,以BCF指令为例:

    指令:BCF    f, b

    说明:

    • 功能:f寄存器的位b清零;
    • BCFf不在赘述,命令中的b表示f寄存器的位b,从零开始,取值范围为0~7
    • 影响状态位:无(PIC的所有位操作指令都不影响状态位);
    • 指令周期:1

    示例:

    假设执行指令前,FLAG_REG寄存器的值为0xFF1111 1111b

    BCF    FLAG_REG3

    注意:位是从0开始的,指令中的位3,实际对应的是寄存器的第四位

    执行后:

    FLAG_REG = 0xF71111 0111b

    指令应用:在程序中,我们经常会用到很多标志位,通过标志位来确定某项功能的当前状态,标志位的状态可通过位操作实现。

    3、立即数与控制类操作指令,以MOLW指令为例:

    指令:MOVLW    k

    说明:

    • 功能:立即数k送入W寄存器;
    • K为立即数,取值范围为[0, 255]
    • 影响状态位:无;
    • 指令周期:1

    以下通过两个具体示例,说明对于立即数k的理解:

    示例1

    假设执行指令前W寄存器值为00H

    MOVLW    30H

    执行后:

    W = 30H

    这种操作,明显直接。

    示例2

    假设执行指令前寄存器UD_REG的地址为25H,寄存器的值为45HW寄存器的值为00H

    MOVLW    UD_REG

    执行后:

    W = 25H

    先说一下寄存器、寄存器地址、寄存器值、寄存器名的关系:

    寄存器:我们可以把它当做一个个的盒子;

    寄存器地址:由于盒子(寄存器)太多,我们需要给每个盒子加一个编号,00,01,…,这样便于我们描述要找的是哪一个盒子,这个编号就是寄存器地址;

    寄存器值:在这些盒子里面,我们可以放鞋子、袜子…,这些放在盒子里面的东西就是寄存器的值;

    寄存器名:为了让人便于知道盒子里面装的是什么,我们可以给盒子起一个别名,比如01编号里面装的是运动鞋,那么可以把它叫做运动鞋盒,以后说运动鞋盒,就是指01编号盒子,上面的UD_REG就是这个道理;

    在示例2中,执行指令后W寄存器的值是寄存器UD_REG的地址。所以在执行此类操作时,一定要小心谨慎,不能被寄存器的值忽悠了。

    以上是对三类命令的大体分析,完整的指令列表详见单片机的数据手册或指令集说明手册。

     

  • 相关阅读:
    Android录制视频添加水印的高效方案之YUV帧数据覆盖
    Android 数据库迁移--自定义数据类型
    Android Camera录制视频添加水印
    Android视频录制 花屏、绿屏的分析及解决方案
    Android Moudle封装SDK的步骤及注意事项总结
    Android音频流+视频流合成视频及提取音频流、视频流数据
    常见排序算法以及时间复杂度
    整合两个有序集合 时间复杂度最小为O(n)
    Android启动app步骤简介
    HihoCoder String Matching Content Length
  • 原文地址:https://www.cnblogs.com/xbook-ben/p/7607757.html
Copyright © 2011-2022 走看看