zoukankan      html  css  js  c++  java
  • 68HC11指令学习

    1.微处理器芯片(MPU)

    a.对所有的uC部件提供时序和控制信号

    b.从存储器读取指令和数据

    c.从I/O设备转移数据或转移数据到I/O设备。

    d.指令解码

    e.执行指令所调用的算术和逻辑操作

    f.响应I/O口所产生的控制信号,如复位和中断

    2.2.68HC11 MPU----更复杂版

    (1)    有5个16位寄存器连接到68HC11的内部地址总线。一个变址寄存器X、一个变址寄存器Y和一个堆栈寄存器SP、PC和DAR。这些寄存器中的每个都由2个8位组成。

    例如:PCh是PC的高字节,PCl是PC的低字节。

    (2)    有2个8位累加器,ACCA和ACCB,连接到ALU和内部总线。累加器A和累加器B可以作为单独的16位寄存器,称为双倍累加器ACCD。注意68hc11只有2个累加器ACCA和ACCB,但是,当使用ACCD的时候,实际上是串联了累加器A和B.

    (3)    一个8位条件码寄存器(CCR)连接到ALU

    68HC11分成3个部分进行讨论:

    时序和控制、寄存器、以及ALU

    时序和控制部分:
    控制总线信号

    AS信号:

    这个输出信号叫做地址选通,

    RESET复位的4种方式:

    外部复位

    加电复位(POR)

    计算机正常操作复位(COP)

    时钟监视器复位

    为了保证MPU稳定,RESET必须保持低电平至少4个E时钟周期

    初始化MPU的一些共同的功能有:

    (1)    初始化MPU寄存器(例如CCR和SP)

    (2)    初始化I/O设备控制寄存器

    (3)    执行系统RAM测试

    (4)    检查I/O设备的状态

    (5)    送信息到输出设备(例如:视频显示、LED和打印机),把系统状态通知操作者,或提醒输入命令

    加载指令寄存器(LIR):

    中断请求(IRQ)

    不可屏蔽中断请求(XIRQ):这是另一个MPU中断输入,但和IRQ有差别,在于它一旦被使能,就不能被禁止。

    指令寄存器IR

    程序计数器PC

    PC通常包含MPU要读取的下一条指令代码的存储器地址。

    数据地址寄存器(DAR)

    累加器

    通用寄存器:

    变址寄存器:

    3.       一些68HC11的指令

    LDAA     存储器地址的数据加载到累加器A,存储器地址是操作代码后面的2个字节

    STAA      累加器A的内容保存在存储器地址内,存储器地址为2字节操作数地址

    ADDA     由2字节操作数地址指定的存储器地址内的数据和累加器A相加,结果保存在累加器A

    SUBA     除了是从累加器A减去数据,其他的和ADDA相同

    WAI        代表等待,这个指令可以用来停止执行一个程序,但是并不是唯一的

    JMP              跳转,加载2字节操作数地址到PC,从这个新地址取下一条指令

    BEQ              如果CPU执行的最后的操作结果是0,则把操作代码后面的字节偏移加到PC,从这个新地址取下一个指令,否则,顺序读取下一个操作代码

    一个计算机系统包含硬件、软件、和固件、硬件是物理上组成计算机的电子、机械和磁性设备。从小的微型计算机到大的大型计算机,硬件的数量大有不同,但有一点是相同的,存储器中若没有一个或多个程序,硬件将毫无用处。

           软件是指导计算机系统从开机到关机的所有活动的程序,所有软件可以分为两类:

    1. 应用软件和系统软件。

    当程序在ROM中,就经常被称为固件。

    累加器:(Accumulator)  用做ALU的输入和输出的寄存器

    地址总线(Address  Bus)从MPU运载地址代码到存储器单元的线

    算术/逻辑单元(ALU)计算机中在程序执行过程中对数据执行算术和逻辑操作的部分。

    汇编编译器Assembler允许计算机把汇编语言转换成机器语言的程序

    汇编编译:Assembly把汇编语言源程序转换成机器语言目标程序的过程

    汇编语言:Assembly Language允许使用助记符代替二进制或十六进制机器语言指令的编程语言。

    字节(Byte) 一个8位数据,许多微处理器的字大小是一个字节

    中央处理单元(CPU) 控制单元和ALU的组合

    编译器(Compiler)  把完整高级语言程序转换成机器语言目标程序的程序

    4.微机的结构和操作

    微机(uC)和微处理器(uP)之间的差异。

    5.时钟信号:

    使用一个单独的系统时钟,称为E时钟,E时钟由68HC11芯片内部产生,内部和外部都可以使用,时钟频率由芯片的EXTAL和XTAL管脚所接的外部时钟器件决定,包括一个晶振和一个电阻/电容的组合。

             提供到EXTAL和XTAL管脚上的频率通常为MPU系统时钟或E时钟的4倍。

    6.读和写的时序:

    ORG $E100;任意的开始地址,设置XIRQ伪向量
    LDAA # $7E

    LDAA # $5A;把数值$5A放在ACCA中

    ORG $E000;指定起始地址
    LDAA COOLANT_TEMP;读取冷却剂温度
    SUBA #CT_OFFSET;减去补偿
    STAA STORE_TEMP;保存以备后用

    CLRA ;把ACCA清除为$00
    LDAA #$5C;把$5C加载到ACCA

    累加器A(ACCA)
    程序计数器(PC)
    累加器B(ACCB)
    可以用这2个8位寄存器组成一个16位寄存器D(ACCD)
    变址寄存器X
    变址寄存器Y
    堆栈指针
    程序计数器

    条件代码寄存器CCR

    ORG $E000
    CLRA 

    ;//////////////////////////////////////////////////////////////////////////////////////
    PAGE0 EQU 0
    STACK EQU $FF
    PROGSEG EQU $0100

     ORG PAGE0
    RAM   RMB 4
    MAXRESULT RMB 1
    COUNT  RMB 1
    FIRST FCB $5C, $67, $00, $31, $B3, $A5, $20, $80

     ORG PROGSEG
     LDS #STACK;初始化堆栈

    CLRA ;把ACCA请除为$00

    LDAA #$5C;把$5C加载到ACCA

    INCB :ACCB递增

    CLRA

    INCB

    XGDY:ACCD和IY交换

    DEY:1Y递减


    unsigned int Swap, VarD, VarY;
    unsigned char VarA, VarB;

    void main(void)
    {
     VarA = 0;
     ++VarB;
     Swap = VarY;
     VarY = VarD;
     VarD = Swap;
     --VarY;
    }


    LDAA #$5C是源代码,操作码LDAA是Load ACCA指令,但没有说明加载的内容,操作数#$5C指定了加载的内容,前缀数据符号#表示是立即寻址---源代码
    ,操作数是实际的数据。

    LDY #$B704,把数值$B074加载到IY中,同样前缀#表示源代码形式的立即寻址模式。

    例子程序:使用立即寻址的指令

     ORG $E000;起始地址
     LDAA #$5C;加载$5C到ACCA
     ADDA #$02;ACCA加$02
     LDAB #$17;$17加载到ACCB
     ABA  ;累加器B的内容和累加器A的内容相加,结果放在累加器A,累加器B 的内容不变。这个指令影响H条件代码位,所以适合用在BCD算术操作中。
     LDD  #$1234;$12->ACCA
          ;$34->ACCB
          BRA *;程序终止
         
         
         
     ldab #94;十进制数94 = 0x5e = 0x5c + 2
     stab _VarA
     
     直接寻址和扩展寻址模式
     寻址范围:
     
      ORG  $E000;起始地址
      LDAA $1B  ;直接模式
      STAA $6D00 ;必须用扩展模式
      LDAB $001C ;尽管可以用直接模式,但还是用扩展模式
      STAB $6D01  ;必须用扩展模式
      BRA  *;停止程序运行
      
      强制扩展寻址
      可以使用大于号(>)来强制使用扩展寻址。
      ORG  $E000
      LDAB $0005 ;汇编器使用直接寻址
      LDAB >$0005 ;强制使用扩展寻址
      
      访问输入/输出端口
      
    C 语言实现相同的操作
     unsigned char LoadA, StoreA, LoadB, StoreB;
     void main(void)
     {  
      StoreA = LoadA;
      StoreB = LoadB;
     }
     变址寻址模式
     
     间接寻址
     本模式的关键是CPU用变址寄存器间接指向数据,变址寄存器指向的是数据的地址,
     不是实际的数据。
     
     
     ORG  $E000;起始地址
     LDAA $00,X;变址模式加载
     ADDA $01,X;变址模式相加
     STAA $20,Y;变址模式保持
     ABY  ;固有模式
       ;修改IY的指令
     INY  ;IY递增
     STAA $30,Y
     
     
     基本操作
     数据处理
     数据处理指令分成三部分:
     数据移动、数据修改、移位和循环
     
     ORG设置地址计数器
     DB 定义字节
     DW定义字
     EQU 等于
     DS定义空间
     
     
     
     ORG  $FFOO;演示模拟的开始地址
     *----------------------------------------------------------------------
     *主程序开始
     LDS  #$FF
     LDX  #$1122
     LDY  #$3344
     LDAB #$55
     LDAA #$1C
     *使能XIRQ中断
     TPA  读取原来的中断
     

     
    pasmhc11-dxs-l myprog.lst myprog.s

    LDAA #$55;取数指令
    ADDA $0100;加法指令

    1.ASCT绝对段


    2.BSCT基段
    它是一个可重新定位的段
    基段通常用于存放直接寻址方式访问的变量
    基段所处的地址区域为0--255

    3.CSCT空白公共段

    ACCA 累加器A
    ACCB 累加器B
    IX  变址寄存器X
    PC  程序计数器
    SP  堆栈指针
    1   1   H       I        N    Z   V   C
           半进位 中断屏蔽  符号
     状态寄存器CCR

  • 相关阅读:
    Redis简单实践-分布式锁
    Redis基础数据结构
    Redis介绍
    MakeGenericType方法,运行时传入泛型T参数,动态生成泛型类
    Visual Studio 2017 Ctrl+单击键会跳转到定义的设置
    10 分钟 创建分布式微服务
    nodejs 中自定义事件
    我是这么给娃娃取名的(使用 node.js )
    使用 Fiddler 上传微信公众账号 自定义菜单
    drf_yasg 简单使用
  • 原文地址:https://www.cnblogs.com/tao560532/p/2572063.html
Copyright © 2011-2022 走看看