单片机实例教程秒脉冲发生器电路课件_第1页
单片机实例教程秒脉冲发生器电路课件_第2页
单片机实例教程秒脉冲发生器电路课件_第3页
单片机实例教程秒脉冲发生器电路课件_第4页
单片机实例教程秒脉冲发生器电路课件_第5页
已阅读5页,还剩139页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、秒脉冲发生器电路学习目标通过本项目的学习,能够阐述寻址方式的种类和功能;能够理解汇编指令,包括数据传送指令、算术运算指令、逻辑操作指令、移位类指令、跳转指令、转移和循环控制指令、相关堆栈指令及其他各种指令;熟悉伪指令概念及用途。能够根据上述汇编指令编写简单的汇编程序。学习要求能够阐述寻址方式的种类和功能能够理解汇编指令熟悉伪指令概念及用途能够根据上述汇编指令编写简单的汇编程序项目导入由飞思卡尔MC9S08GB60单片机组成最小应用系统,产生一个秒脉冲信号,控制发光二极管(LED)每一秒亮一次。即设定控制LED发光二极管每1s亮一次,秒脉冲的周期T=1s,若每隔0.5s将PTA0端口取反,即可以

2、在PTA0端口输出1Hz的方波。如图1-1所示。项目分析1用最少的元器件构成一个单片机的最小应用系统。2LED发光二极管的“定时亮灭”控制,可以利用延时方法来实现,现常用的有两种方法:一是用定时器中断来实现(定时器的硬件和寄存器知识将在项目8介绍),二是用指令循环来实现。在系统控制内容允许的情况下,可以采用第二种方法。在动手实现利用单片机的最小应用系统控制LED发光二极管的定时亮灭(即秒脉冲发生器)时,先让我们学习飞思卡尔单片机的寻址方式和汇编指令系统的相关知识。项目分析在动手实现利用单片机的最小应用系统控制LED发光二极管的定时亮灭(即秒脉冲发生器)时,先让我们学习飞思卡尔单片机的寻址方式和

3、汇编指令系统的相关知识。相关知识3.1 寻址方式3.2 汇编指令系统及应用举例 3.3 伪指令3.4 基本程序设计范例3.1 寻址方式指令的一个重要组成部分是操作数,由它指定参与运算的数据或数据所在的存储器单元或寄存器或I/O接口的地址。指令中所规定的寻找操作数的方式就是寻址方式。每一种计算都具有多种寻址方式,寻址方式越多,单片机的功能就越强,灵活性就越大。寻址方式的多少及寻址功能是反映指令系统优劣的主要因素之一。要掌握指令系统也可从寻址方式入手。3.1 寻址方式HCS08系列单片机采用的寻址方式有7种:隐含寻址方式(INH)、相对寻址方式(REL)、立即寻址方式(#IMM)、直接寻址方式(D

4、IR)、扩展寻址方式(EXT)、变址寻址方式(间接寻址方式)。每种寻址方式分述如下:3.1 寻址方式3.1.1隐含寻址方式(INH)隐含寻址方式(Inherent addressing mode,INH)是当CPU 知道要完成指令的所有信息而源码中却没有提供地址时使用的一种寻址方式。在隐含寻址方式中,执行指令的所有信息均在操作码中,CPU不需要从寄存器、存储器中取操作数,操作数隐含在累加器、变址寄存器或状态标志寄存器中。具有隐含寻址方式的指令全为单字节指令,汇编后生成的操作码在程序存储器中只占用一个字节的空间。 3.1 寻址方式例如:INCA;累加器A中的内容加1INCX;变址寄存器X中的内容

5、加1DECA;累加器A中的内容减1SEI;中断屏蔽位I置1CLI;中断屏蔽位I清03.1 寻址方式3.1.2相对寻址方式(REL)相对寻址方式(Relative addressing mode ,REL)是将程序计数器PC中的当前内容与指令第二个字节所给出的数相加,其和为跳转指令的偏移地址。在这种寻址方式中,CPU首先测试给定的条件,如果满足条件,则发生相对转移,即把当前程序计数器PC的值加上指令码所占字节数,再加上指令操作码后的8位有符号数,使程序转移到PC指定的新地址处,否则CPU执行该条指令的下一条指令。具有相对寻址方式的指令为2字节指令,一个字节为操作码,另一个字节为相对偏移量。 3.

6、1 寻址方式例如:BRA rel;无条件转移到标号为rel的指令处执行程序BSRInit;调用子程序Init3.1.3立即寻址方式(IMM)隐含寻址方式(Immediate addressing mode ,IMM)是单片机的指令系统查找数据的一种信息定位方式,在一定程度上可以把它和高级语言的常数对应起来。字面上的解释,是指数据本身直接出现在指令中,也就是说数据本身是整个指令编码的一部分。具有立即寻址方式的指令主要用于访问常数,多为2字节指令,第一个字节为操作码,后面字节为立即数,立即数前面的符号前缀“#”说明操作码后面的是操作数值而不是操作数地址。 3.1 寻址方式例如:MOV #$100,

7、PTAD;给一个寄存器PTAD赋初值,这里的100是直接出现在指令中的操作数,它就是立即数,它的寻址方式就是立即寻址方式.如果查看它转换的对应的机器语言代码,会发现100是指令编码的一部分ADC#$30;将累加器A中的内容与十六进制立即数30进行带进位 加运算,结果存放至累加器A中立即操作数的长度是根据指令隐含的CPU 寄存器大小来定义。编译器会自动缩位或扩展操作数去匹配指令需要的长度。例如:LDA#$08;将立即操作数08传送给累加器A,立即操作数的长度 为8位操作数STAPTAD;将累加器A内容传送给寄存器PTAD,立即操作数的长 度为8位操作数LDHX#$012A;将立即操作数012 A

8、传送给变址寄存器H:X,立即操作 数的长度为16位操作数STHXVOLM;将变址寄存器H:X传送给变量VOLM:VOLM+1,操 作数的长度为16位操作数3.1 寻址方式3.1.4直接寻址方式(DIR)在直接寻址方式(Direct addressing mode ,DIR)中,操作数的有效地址包含于操作码后的一个字节中。由于操作数的有效地址公为一个字节,因此直接寻址方式只能对存储器0页的256B空间($0000$00FF)进行操作。0页存储区含有I/O控制和状态寄存器,还有部分用户数据RAM区。一般将经常要访问的数据放在0页的用户数据RAM中,以节省程序空间,提高数据访问速度。具有直接寻址方式

9、的指令为2字节指令,指令的第一个字节是操作码,第地个字节为操作数的有效地址。3.1 寻址方式例如:LDA#$00;将$0000单元中的内容送入累加器A中STA$04 ;将累加器A中的内容传送给$0004单元地址中 3.1 寻址方式3.1.5扩展寻址方式(EXT)在扩展寻址方式(Extended addressing mod,EXT)中,操作数的有效地址包含于操作码后的两个字节中。由于操作数的有效地址仅为2字节,因此,采用扩展寻址方式的指令可以访问64KB内的任何存储器空间。具有该寻址方式的指令一般为3字节指令,指令的第一个字节是操作码,第二、三个字节是操作数的有效地址。 3.1 寻址方式例如:

10、LDA$0A0D;将$0A0D单元中的内容送入累加器A中STA$0809;将累加器A中的内容送入$0809单元中 3.1 寻址方式3.1.6 变址寻址方式变址寻址方式有时被称为间接寻址方式,是以CPU 变址寄存器H:X作为参考地址加上偏移地址,其结果作为目的地址来存取操作数的寻址方式。有些情况下变址寄存器中的值会自动增加用来存取目的操作数。变址寻址方式的重要特征是:操作数地址取决于当前CPU 变址寄存器的内容而不是常数地址。变址寻址方式可分为以下几种类型:3.1 寻址方式(1)无偏移量变址方式(IX)(2)无偏移量变址、变址加1寻址方式(IX+)(3)8位偏移量变址方式(IX1)(4)8位偏移

11、量变址、变址加1寻址方式(IX1+)(5)16位偏移量变址方式(IX2)3.1 寻址方式例如:LDA$0110,X;将以H:X 寄存器中的值加上$0110所得的值为地址的存储单 元的内容送至累加器A中AND$1030,X;将以H:X 寄存器中的值加上$1030所得的值为地址的存储单 元的内容与累加器A中的值进行逻辑运算,结果存至累加器 A中 3.1 寻址方式3.1.7 堆栈寻址方式在堆栈寻址方式或,操作数的有效地址由16位堆栈指针SP中的内容和跟在操作码后的无符号偏移量决定,根据偏移量的多少,堆栈寻址又分为8位偏移量堆栈寻址和16位偏移量堆栈寻址两种寻址方式。用堆栈方式寻址的指令功能与对应变址

12、寻址指令相似,只是与堆栈指针SP有关的指令要求预先访问一个字节,因此它要比对应的变址指令多用一个时钟周期。3.1 寻址方式(1)8位偏移量堆栈寻址方式(SP1)例如:LDA$20,SP;将以SP中的值加上$20所得的和为地址的存储单元中的值送 至累加器A中INC $20,SP;将以SP中的值加上$20所得的和为地址的存储单元中的值加13.1 寻址方式(2)16位偏移量堆栈寻址方式(SP2)在这种变址方式中,无符号的16 位偏移量与堆栈指针(SP)相加,得到要访问的操作数地址。该寻址方式用于访问栈中深度超过255 的数据。如果偏移量小于或等于255,编译器将自动使用更有效率的SP1 寻址方式。

13、3.1 寻址方式例如:LDA$0110,SP;将以SP中的值加上$0110所得的和为地址的存储单元中 的值送至累加器A中 3.2汇编指令系统及应用举例HCS08系列单片机指令系统有数据传送指令、算术运算指令、逻辑操作指令、移位类指令、跳转指令、转移和循环控制指令、相关堆栈指令及其他各种指令。本节将按照类型分别介绍各条指令的功能、指令代码及其使用。 3.2汇编指令系统及应用举例3. 2.1数据传送指令这组指令主要用于CPU 寄存器、立即数、内部存储器单元之间的数据传送。在读入、存储和数据传送时指令会根据数据的值自动更新条件码,这使得BEQ、BNE、BPL 和BMI 等指令不需要运行特殊的测试或比

14、较指令就可以立即进行条件转移。3.2汇编指令系统及应用举例1.LDA指令将存储器的数值送到累加器A中 2.LDHX指令 将存储器的数值传送到变址寄存器H:X 3.LDX指令 将存储器的数值送到寄存器X(变址寄存器) 4.STA指令 将累加器A的内容传送到存储器中 3.2汇编指令系统及应用举例5.STHX指令 将变址寄存器H:X的内容送到目的地址 6.STX指令 将变址寄存器X内容送到目的地址 7.MOV指令 将存储器内容送到目的地址 8.TAX指令 将累加器A的内容送到变址寄存器X中 3.2汇编指令系统及应用举例9.TXA指令 将变址寄存器X的内容送到累加器中 10.TAP指令 将累加器A的内

15、容送到寄存器CCR中 11.TPA指令将寄存器CCR的内容送到累加器A中 12.NSA指令半字节交换累加器A的数值 3.2汇编指令系统及应用举例13.BSET指令 将存储器opr8a中的第n位置1 14.BCLR指令 将存储器opr8a中的第n位清0 3.2汇编指令系统及应用举例例如:LDA #$55 ;将十六进制立即数55送到累加器A中LDA $01 ;将$01单元中的内容送入累加器A 中(寻址范围:256B)LDHX #%010111111010 ;将二进制立即数送入变址寄存器H:X中LDHX $20 ;将$20单元的内容送入变址寄存器H,将$20+1单元的内容送入变址寄存器X中3.2汇编

16、指令系统及应用举例LDX PTAPE ;将PTAPE单元的内容送入变址寄存器X中LDX #$5A ;将十六进制数5A送入变址寄存器X中STA PTAD ;将累加器A的内容送至PTAD寄存器中STA X ;将累加器A的内容送至X寄存器中3.2汇编指令系统及应用举例STX PTEDD ;将变址寄存器X内容送到PTEDD寄存器STX DATA ;将变址寄存器X内容送到变量DATAMOV #$03,PTAD ; 将十六制立即数03传送给寄存器PTAD中 MOV #$0F,PTADD ; 将十六制立即数0F传送给寄存器PTADD中3.2汇编指令系统及应用举例LDA #$55 ;将十六进制立即数55送到累

17、加器A中 TAX ;将累加器内容55送到变址寄存器X中LDA #$55 ;将十六进制立即数55送到累加器A中 TAP ;将累加器内容送到寄存器CCR中3.2汇编指令系统及应用举例BSET 1,PTAD ;将寄存器PTAD的第1位置1BSET 7,PTCDD ;将寄存器PTCDD的第7位置1BSET TE,SCI1C2 ;将寄存器SCI1C2的第TE位置1BCLR 2,PTCD ;将寄存器PTCD的第2位清03.2汇编指令系统及应用举例3.2.2 算术运算指令算术运算指令包含了传统的加、减、乘和除操作,还包含常用的指令,如加一、减一、清零、求补(2 进制补码)、比较、测试和为处理BCD 码的十进

18、制调整指令。比较指令实际上就是减操作,影响CCR 状态位但结果不返回到CPU 寄存器。测试指令影响着N和Z 位,但是不影响被测试的数据。3.2汇编指令系统及应用举例1.ADC指令 带进位的加法运算 2. ADD指令 不带进位的加法运算 3.AIX指令 变址寄存器H:X的内容加上立即数再送入变址寄存器中, AIX 指令不影响CCR 位4.SUB指令 将累加器A 中的数据减去存储器中的数据,然后将结果存储到累加器A中。对于这个指令,进位状态位是借位指示器, 3.2汇编指令系统及应用举例5.SBC指令 将累加器A 中的数据减去由前一次操作所影响的借位,再减去存储器中的数据,然后将结果存储回寄存器A

19、中 6MUL指令 将寄存器X 中无符号8 位2 进制数与累加器A 中的无符号的8 位2 进制数相乘,然后存储16 位结果到X:A 中,高8 位的结果存储在X 中,低8 位存储在A中。这种情况下不可能发生进位(或者是溢出),其结果将总是适合X:A 的大小。因此进行这个操作后C 将被清零。 3.2汇编指令系统及应用举例7DIV指令 将H:A 中16位无符号数值除以X中无符号的8位数值,所得的结果(8位)存储到累加器A中,余数存储到H 寄存器中。在计算中,X 中的除数数值无变化,因此它能够在随后的操作中继续被使用。如果商为0 则Z 标志被置1。如果商大于255 就会有溢出发生,发生溢出或除数为0时C

20、 位将被置1。 3.2汇编指令系统及应用举例8INC指令 操作数自加 9DEC指令 操作数自减1 10CLR指令 操作数清零 11.NEG指令 取补指令执行了二进制数的补码操作,求补指令等同于将一个8 位有符号数乘以-1。功能上等同于将寄存器A、X 或者存储器中的数据全部取反,然后加一。 3.2汇编指令系统及应用举例12.CMP指令 CMP 指令是将累加器A的内容与存储器的内容进行比较,所得的结果会影响CCR寄存器的位,但其结果不会存储回累加器A中,因此累加器A和存储器的数值在运算后是不发生变化的。注意,比较指令是比较累加器A、变址寄存器X (或H:X)的内容与存储器中的内容。 3.2汇编指令

21、系统及应用举例13.CPHX指令 在CPHX 指令执行时,存储单元M指向存储单元位置的首地址,变址寄存器H与存储器位置M相对应,变址寄存器X与存储器位置M+1 相对应。CPHX 执行一个16 位减法指令时,存储结果不返回H:X 中。 3.2汇编指令系统及应用举例14.CPX指令 将X变址寄存器和存储单元相比较,运算后CCR寄存器相应的位会发生变化,但操作数不改变 15.TST指令 该指令用于测试累加器A、变址寄存器X、存储单元的值是否小于等于0,它执行减0的操作,但不改变原操作数的值,只是根据结果改变CCR寄存器的N、Z标志位。 3.2汇编指令系统及应用举例16.DAA指令 该指令用于BCD码

22、的调整。在BCD 码数值中,用十六进制数表示十进制数值0 9。当两个8 位的BCD 数值相加时,CPU 实际上执行的是普通的二进制加法,对于BCD 码,这个运算结果可能不再是一个有效的BCD 码了。DAA 指令根据加法(ADD 或ADC )指令运算所改变的标志位(如H 和C标志位)对结果进行修正,使其结果成为有效的BCD 数值 ,而且还修正了C 标志位的内容,使其正确的表示使用BCD 加法后的结果。在早期的单片机系统中,由于还没出现该条指令,要完成这些操作是非常复杂的过程,而现在,DAA 指令则能很简单的完成这个操作。 3.2汇编指令系统及应用举例;-CMP指令例子 LDA #$0F CMP

23、#$3F MOV #$0E,VOLM CMP VOLM LDHX #$0005 CMP ,X 结果是? 3.2汇编指令系统及应用举例;-NEGA指令例子 LDA #$02 NEGA NEG VOLM NEGX LDHX #$0021 NEG ,X 结果是?3.2汇编指令系统及应用举例 ;-CPHX指令例子 LDHX #$0080 STA ,X INCX STA ,X LDHX #$0201 CPHX VOLM结果是? 3.2汇编指令系统及应用举例 ;-CPX指令例子 LDX #$05 CPX #$04 ;-TST指令例子 LDA #$01 TSTA LDX #$00 TSTX结果是?3.2汇编

24、指令系统及应用举例3.2.3 逻辑操作指令这组指令执行8 位操作数的并行布尔运算,包括与操作、或操作、异或操作、取反操作和位测试操作。取反指令是将指定的寄存器或者存储器中的操作数按位取反,其他逻辑指令均包括了两个操作数,一个是累加器A,另一个是存在存储器中。立即寻址、直接寻址、扩展寻址或变址寻址等寻址方式都可应用该组指令来访问操作数。注意,累加器A的每个位都可执行与、或和异或操作,操作的结果返回累加器A中,覆盖原来的操作数。3.2汇编指令系统及应用举例1.AND指令 该指令进行逻辑与操作,将累加器A中的内容与相应的操作数进行按位与操作,再将操作结果存入累加器A中,同时把CCR寄存器中的标志位V

25、清为0,影响N、Z标志位,对其他标志位无影响 3.2汇编指令系统及应用举例2.ORA指令 该指令进行逻辑或操作,将累加器A中的内容与相应的操作数进行按位或操作,再将操作结果存入累加器A中,结果对CCR寄存器的影响同AND指令一样。 3.EOR指令 该指令进行逻辑异或操作,将累加器A中的内容与相应的操作数进行按位异或操作,再将操作结果存入累加器A中,结果对CCR寄存器的影响同AND指令一样。 3.2汇编指令系统及应用举例4.COM指令 该指令进行取反操作,该指令简单地转换操作数的每个位,但与求补指令是不同的,取反指令执行的是一条算术运算指令,即等效于与一个 -1 相乘。 3.2汇编指令系统及应用

26、举例5.BIT指令 该指令进行位测试,将相应存储地址中的操作数与累加器A的每个位进行“与操作”,但是结果不存储在累加器A中。在执行位测试指令后,根据“与操作”的结果来置位或清零CCR条件码寄存器的N 和Z 位,以实现条件跳转。如果使用“掩码”方法进行编程,则掩码中的每个对应位将被测试,执行BIT位测试指令后,若测试位均不是1,则Z 位被置位。 3.2汇编指令系统及应用举例;-DAA指令例子 LDA #$0E ADD #$06 DAA ;-AND指令例子 LDA #$5B AND #$0F LDHX #$0080 AND ,X 3.2汇编指令系统及应用举例 ;-ORA指令例子 LDA #$0C

27、ORA #$0A ;-EOR指令例子 LDA #$5A EOR #$03 STA VOLM ;-COM指令例子 LDA #$05 COMA 3.2汇编指令系统及应用举例 ;-BIT指令例子 LDA #$02 MOV #$01,VOLM BIT VOLM 3.2汇编指令系统及应用举例3.2.4 移位指令移位指令的操作是在9位的空间上进行的,这个空间是由8 位的累加器A、变址寄存器X 或者存储单元和CCR寄存器中的C 位组成。移位指令的操作包括逻辑左移、逻辑右移、算术左移、算术右移、循环左移和循环右移等操作 3.2汇编指令系统及应用举例 1. LSL指令 该指令进行逻辑左移操作,就是简单地把0移位

28、到有效值的最低位b0,有效值的最高位b7移到进位C中 3.2汇编指令系统及应用举例2.LSR指令 该指令进行逻辑右移,就是简单地把0移位到有效值的最高位b7,有效值的最低位移b0到进位C中 3.2汇编指令系统及应用举例3.ASL指令 该指令进行算术左移(和LSL相似),类似于乘2 操作,在功能上与LSL指令没有较大的区别 3.2汇编指令系统及应用举例4.ASR指令 该指令进行算术右移,类似于除2 操作。算术右移(ASR)指令复制最初的最高有效位(b7)返回到b7,以保护操作数符号 3.2汇编指令系统及应用举例5.ROL指令 该指令进行循环左移,就是简单地将有效值的最高位b7移位到进位C,进位C

29、原来的值移位到有效值的最低位b0,其余各位向左移一位 3.2汇编指令系统及应用举例6.ROR指令 该指令进行循环右移,就是简单地将有效值的最低位b0移位到进位C,进位C原来的值移位到有效值的最高位b7,其余各位向右移一位 3.2汇编指令系统及应用举例 ;-LSL指令例子 LDA #$01 LSLA LSLA ;-LSR指令例子 LDA #$80 LSRA LSRA3.2汇编指令系统及应用举例3.2.5 转移类指令这组指令分类有条件转移类指令和无条件转移类指令。有条件转移指令在条件满足时转移到程序计数器PC指定的相应地址处执行,否则顺序执行程序。有条件转移类指令又可分为累加器A比较相等转移指令、

30、减1不为转移指令、CCR转移指令、位测试转移指令等。无条件转移指令(也称跳转指令)则无条件限制,直接转移到程序计数器PC指定的地址处执行程序,例如,BRA、JMP指令。另外,循环控制指令也属于有条件转移类指令的范畴。3.2汇编指令系统及应用举例有条件转移指令和循环控制指令都使用了相对寻址方式,有条件地转移到一个与转移相关的位置。CCR寄存器根据条件分支或循环控制指令,决定执行新的地址还是继续顺序执行下一条指令。注意,BRA指令是个特殊的指令,因为无条件转移总是会发生;BRN指令也一样,因为无条件转移从不发生;BIL 和BIH指令也是很特别的,是因为它们决定是否需要转移,查看IRQ引脚的状态而不

31、是CCR寄存器中的条件位。3.2汇编指令系统及应用举例1.JMP指令 JMP指令是将其后面所接的操作数为地址值送至16位程序计数器PC,使程序跳至该指令所指定的地址处执行,该指令可以实现64KB($0000$FFFF)空间任一有效地址的跳转。它具有5种寻址方式,而且不影响CCR寄存器的标志位。 3.2汇编指令系统及应用举例2.BRA指令 该指令是无条件转移指令的其中一种,只有相对寻址方式(REL),实现无条件相对转移,由于是相对寻址,本身又为2字节指令,故其无条件相对转移的范围为相对于存放BRA机器指令码地址的-126+129字节空间。 3.2汇编指令系统及应用举例3.BRN指令 该指令无条件

32、不转移,即是不具有任何转移功能,它只是消耗3个总线周期的空操作。 3.2汇编指令系统及应用举例4.BEQ指令 该指令主要用于表格查找子程序的快速跳转,它检测累加器A中的值是否与某一立即数或存储单元的值相等,若相等则CC寄存器的Z标志位被置为1,如果(Z)=1则使程序转移到指令所指定的地址处执行,否则顺序执行下一指令,它不改变任何原操作数的值。 3.2汇编指令系统及应用举例5.BNE指令 该指令的功能恰好与BEQ指令相反,若累加器A中的值与某一立即数或存储单元的值不相等则转移指令。 3.2汇编指令系统及应用举例6.BCC指令 该指令根据CC寄存器的进位标志位C的情况决定是否转移,若进位为0则转移

33、,否则顺序执行程序。 3.2汇编指令系统及应用举例7.BCS指令 该指令的功能恰好与BCC指令相反,若进位为1则转移指令,否则顺序执行程序。 8.BPL指令 该指令根据CC寄存器的负标志位N的情况决定是否转移,若负标志位N=0则转移,否则顺序执行程序。 3.2汇编指令系统及应用举例9.BMI指令 该指令的功能恰好与BPL指令相反,若负标志位N=1则转移,否则顺序执行程序。 10.BIL指令 该指令根据IRQ引脚电平的高低来决定是否进行转移操作,如果IRQ引脚为低电平则程序计数器PC转移至指定的地址处执行程序。 3.2汇编指令系统及应用举例11.BIH指令 该指令的功能恰好与BIL指令相反,如果

34、IRQ引脚为高电平则程序计数器PC转移至指定的地址处执行程序。 12.BMC指令 该指令根据CC寄存器的中断屏蔽标志位I的情况决定是否转移,若中断屏蔽标志位I=0则转移,否则顺序执行程序 3.2汇编指令系统及应用举例13.BMS指令 该指令的功能恰好与BMC指令相反, 若中断屏蔽标志位I=1则转移,否则顺序执行程序。 14BHCC指令 该指令根据CC寄存器的半进位标志位H的情况决定是否转移,若半进位标志位H=0则转移,否则顺序执行程序。 3.2汇编指令系统及应用举例15BHCS指令 该指令的功能恰好与BHCC指令相反,根据CC寄存器的半进位标志位H的情况决定是否转移,若半进位标志位H=1则转移

35、,否则顺序执行程序。 3.2汇编指令系统及应用举例16BLT指令 该指令根据CC寄存器的溢出标志位V和负标志位N的情况决定是否转移,若溢出标志位V和负标志位N状态不一致时则转移,否则顺序执行程序。也就是两个操作数进行比较,若前一个操作数小于后一个操作数则转移。该指令通常与比较指令、减法运算指令配合使用。 3.2汇编指令系统及应用举例17BLE指令 该指令根据CC寄存器的零标志位Z、溢出标志位V和负标志位N的情况决定是否转移,若(Z) | (N V) = 1时则转移,否则顺序执行程序。也就是两个操作数进行比较,若前一个操作数小于或等于后一个操作数则转移,同样该指令也与比较指令、减法运算指令配合使

36、用。 3.2汇编指令系统及应用举例18BGE指令 该指令根据CC寄存器溢出标志位V和负标志位N的情况决定是否转移,若 (N V) = 0时则转移,否则顺序执行程序。也就是两个操作数进行比较,若前一个操作数大于或等于后一个操作数则转移。 3.2汇编指令系统及应用举例19BGT指令 该指令的功能与BLT指令相反,它根据CC寄存器的零标志位Z、溢出标志位V和负标志位N的情况决定是否转移,若(Z) | (N V) = 0时则转移,也就是两个操作数进行比较,若前一个操作数大于后一个操作数则转移。同样该指令也与比较指令、减法运算指令配合使用 3.2汇编指令系统及应用举例20BLO指令 该指令根据CC寄存器

37、的进位标志位C的情况决定是否转移,如果(C)=1,程序计数器PC则转移。也就是两个操作数进行比较,若前一个操作数小于后一个操作数则转移,它与BCS指令相似。 3.2汇编指令系统及应用举例21BLS指令 该指令根据CC寄存器的进位标志位C和零标志位Z的情况决定是否转移,如果(C) | (Z) = 1,程序计数器PC则转移。也就是两个操作数进行比较,若前一个操作数小于或等于后一个操作数则转移。 3.2汇编指令系统及应用举例22BHS指令 该指令根据CC寄存器的进位标志位C的情况决定是否转移,如果(C) = 0,程序计数器PC则转移。也就是两个操作数进行比较,若前一个操作数大于或等于后一个操作数则转

38、移,它与BCC指令相似, 3.2汇编指令系统及应用举例23BHI指令 该指令根据CC寄存器的进位标志位C和零标志位Z的情况决定是否转移,如果(C) | (Z) = 0,程序计数器PC则转移。也就是两个操作数进行比较,若前一个操作数大于后一个操作数则转移。 3.2汇编指令系统及应用举例24BRCLR指令 该指令是根据存储单元的位的状态来决定是否转移,如果存储单元中第n位为0则转移 25BRSET指令 该指令的功能与BRCLR指令相反,如果存储单元中第n位为1则转移指令 3.2汇编指令系统及应用举例CBEQ指令 CBEQ 指令是比较累加器A和某个存储单元的内容,如果它们彼此相等就转移至指定的地址处

39、执行。即是两操作数相比较,相等则转移。注意,CBEQA指令是累加器A与一个立即数相比较,CBEQX 指令是变址寄存器X与一个立即数相比较。CBEQ 指令采用变址寻址方式时,当比较累加器A和变址存储单元的内容后,变址寄存器H:X 会自动加1。 3.2汇编指令系统及应用举例27DBNZ 该指令是累加器A、变址寄存器X或存储单元的内容先进行减1操作,再判断结果是否为0,如果不为0则程序计数器PC转移指定的地址处执行程序。 3.2汇编指令系统及应用举例JMP LOOP ;跳转到标号LOOPBRA Wei ;无条件转移到标号 WeiCMP PTAD ; 寄存器PTAD与累加器相比较BEQ YY ;两者比

40、较若相等,(Z)=1,则转移到标号YCMP PTBD ; 寄存器PTBD与累加器相比较 BNE JJ ;两者比较若不相等,(Z)=0,则转移到标号JJ3.2汇编指令系统及应用举例BPL TK ;如果(N)=0则转移到标号TKBMI TT ;如果(N)=1则转移到标号TTBIH DELAY ;如果IRQ引脚=1,则程序计数器PC转移至标号 DELAY CLI ;把CC寄存器的中断屏蔽标志位I清0BMC LOOP ;经过上一条指令的执行,(I)=0,则程序计数器 PC转移至标号LOOPCLI;把CC寄存器的中断屏蔽标志位I清0 BMC LOOP;经过上一条指令的执行,(I)=0,则程 序计数器PC

41、没有转移到 标号LOOP,而是 顺序执行下一条指令 LDA #$0A;这时程序计数器PC跳到此处执行3.2汇编指令系统及应用举例ADD #$01;累加器A的内容加上二进制立即数00000001 BHCC KEY ;假设累加器A的内容00001111,运算后(H)=1,累加器A的内容00010000,此时程序计数器PC不转移至标号KEY STA PTAD ;程序计数器PC继续顺序执行程ADD #$01;累加器A的内容加上二进制立即数00000001 BHCS KEY ;假设累加器A的内容00001111,运算后(H)=1,累加器A的内容00010000,此时程序计数器PC转移至标号KEYCPM

42、#$08 ; 将累加器A的内容与十六进制立即数08进行比较 BLT LK ;若累加器A的内容小于十六进制立即数08,(N V ) =1,程序计数器PC转移至标号LK3.2汇编指令系统及应用举例 SUB #$02;将累加器A的内容减去十六进制立 即数02 BGE YY ;如果累加器A的内容大于或等于十六 进制立即数,取02 (N V) = 0, 程序计数器PC 转移至标号YYCPM #$09;将累加器A的内容与十六进制数09 相比较 BGE YY ;如果累加器A的内容大于十六进制数09, (Z) | (N V) = 0,程 序计数器PC 转移至标号YYSUB #$02;将累加器A的内容减去十六进

43、制立即数02 BLO WW ;假设累加器A的内容小于十六进制数02,(C) =1,程序计数器PC 转移至标号WW3.2汇编指令系统及应用举例3.2.6 相关堆栈指令堆栈指令包括入栈指令和出栈指令。HCS08系列单片机的堆栈指令只能将累加器A、变址寄存器H:X中的内容压入堆栈,或者将堆栈中的内容弹出到累加器A、变址寄存器H:X中。入栈操作按照先压入,后堆栈指针寄存器SP减1的规则;出栈操作先执照堆栈指针寄存器SP加1,后弹出的规则。它不影响CCR寄存器的标志位。3.2汇编指令系统及应用举例1RSP指令堆栈指针复位(RSP)指令的操作是采用隐含寻址方式,它兼容于早期的M6805系列单片机。该指令使

44、用存储单元$FF加载到堆栈指针寄存器SP 的低8 位,但不影响堆栈指针寄存器SP的高8 位。在早期的体系结构中,SP寄存器的高8 位难以改为$00,因此RSP 需要强迫堆栈指针寄存器SP复位到其原始状态($00FF)。在HCS08 系列中,$00FF 很少被用来作为堆栈的起始指针。所以,也不能够确定高半部分会保持$00,因此,RSP 在新的HCS08 程序中通常不是太常用。 3.2汇编指令系统及应用举例2PSHA 指令该指令将累加器A的内容压入堆栈,然后堆栈指针寄存器SP自减1。 3PSHH指令 该指令将变址寄存器H的内容压入堆栈,然后堆栈指针寄存器SP自减1。 4PSHX指令 该指令将变址寄

45、存器X压入堆栈,堆栈指针寄存器SP自减1。 3.2汇编指令系统及应用举例5PULA指令 该指令将累加器A的内容出栈,指令执行的步骤是:堆栈指针寄存器SP自加1,再把累加器A的内容弹出 6PULH指令 该指令将变址寄存器H的内容出栈,指令执行的步骤是:堆栈指针寄存器SP自加1,再把变址寄存器H的内容弹出。 3.2汇编指令系统及应用举例7PULX指令 该指令将变址寄存器X的内容出栈,指令执行的步骤是:堆栈指针寄存器SP自加1,再把变址寄存器X的内容弹出 8AIS指令 该指令是将堆栈指针寄存器SP加上立即数,所得的结果作为新的堆栈指针指向的地址。 3.2汇编指令系统及应用举例LDHX #$107F;

46、将十六进制立即数107F送至变址寄存器 H:XTXS;将变址寄存器H:X送至堆栈指针寄存器SP,此 时,堆栈就处于存储器中107F地址处LDA #$08;将十六进制数08适至累加器APSHA;累加器A的内容压入堆栈,堆栈指针寄存 器SP自减1,执行完 这条指令后,存储单 元107F的内容为累加器A的内容08,堆栈 指针寄存器SP指向的地址为107EPULA;堆栈指针寄存器SP自加1后指向的地址为 107F,而存储单元107F 的内容为08,再 把存储单元107F的内容传至累加器 3.2汇编指令系统及应用举例3.2.7 其他各种指令1TST指令 该指令用于测试累加器A、变址寄存器X和存储单元的内

47、容是否小于等于0,它执行减0操作,但不改变操作数的内容,只是根据结果改变N、Z标志位。 3.2汇编指令系统及应用举例2TSX指令 该指令的功能恰好与TXS指令相反,将堆栈指针寄存器SP的内容传至到变址寄存器H:X。它采用隐含寻址方式寻址。使用该指令后,若要在随后的程序访问堆栈中的变量时,可以用TXS指令恢复堆栈指针寄存器SP的内容,这在效率上比应用相关变址指令有微小的优势,因为堆栈指针寄存器SP在指向下一个堆栈可用的位置时,指针值会自动加1,很明显,这个操作占用了时间,因此TSX指令会比变址指令快。 3.2汇编指令系统及应用举例3JSR指令 该指令使程序计数器PC跳转至子程序标号处执行,执行完

48、子程序后再返回原先的地址处继续执行。它具有5种寻址方式,可调用64KB地址空间中任一有效地址处的子程序。 该指令的执行顺序是:程序计数器PC加n。其中n的取值有1、2和3,具体依据该指令的寻址方式。此步骤的目的是待子程序结束返回时能使程序计数器PC正确指向该指令的下一条指令。把程序计数器PC的低8位值压入堆栈,然后堆栈指针寄存器SP减1。把程序计数器PC的高8位值压入堆栈,然后堆栈指针寄存器SP减1。把子程序标号的地址传送至程序计数器PC。3.2汇编指令系统及应用举例4BSR指令 该指令使程序计数器PC跳转至子程序标号处执行转移到子程序,执行完子程序后再返回原先的地址处继续执行。它采用相对寻址

49、方式寻址,只能调用相对于本指令地址-126+129地址空间内的子程序。该指令的执行顺序与JSR指令相似,区别是执行该指令时,程序计数器PC是加2。 3.2汇编指令系统及应用举例5RTS指令 该指令也称为子程序返回指令。通常,它在子程序的结尾,当调用完子程序后,它使程序计数器PC指向调用处的下一条指令。该指令的执行顺序是:堆栈指针寄存器SP加1,程序计数器PC的高8位出栈。堆栈指针寄存器SP加1,程序计数器PC的低8位出栈。3.2汇编指令系统及应用举例6SWI 指令该指令也称软件中断(SWI)指令,它和JSR 指令相似,但它要把程序计数器PC、变址寄存器X、累加器A 和CCR 寄存器中的内容保存

50、到堆栈中,执行完中断服务子程序后可以返回上述几个寄存器的值。该指令的执行顺序是:程序计数器PC加1,此步骤的目的是待子程序结束返回时能使程序计数器PC正确指向该指令的下一条指令。把程序计数器PC的低8位值压入堆栈,然后堆栈指针寄存器SP减1。把程序计数器PC的高8位值压入堆栈,然后堆栈指针寄存器SP减1。把变址寄存器X的值压入堆栈,然后堆栈指针寄存器SP减1。把累加器A的值压入堆栈,然后堆栈指针寄存器SP减1。把CCR 寄存器的值压入堆栈,然后堆栈指针寄存器SP减1。屏蔽中断标志位I,即中断标志位I的值为1。把中断地址的高8位传送至程序计数器PC的高8位,把中断地址的低8位传送至程序计数器PC

51、的低8位。3.2汇编指令系统及应用举例7RTI 指令该指令也称软件中断返回指令。一般地,它处在中断服务程序的最后,当执行完中断服务程序后,它恢复了CCR 寄存器、累加器A、变址寄存器X、程序计数器PC的值,之前这些寄存器按相反的顺序被保存在堆栈中。该指令的执行顺序是:堆栈指针寄存器SP加1,CCR 寄存器的值出栈。堆栈指针寄存器SP加1,累加器A的值出栈。堆栈指针寄存器SP加1,变址寄存器X的值出栈。堆栈指针寄存器SP加1,程序计数器PC的高8位值出栈。堆栈指针寄存器SP加1,程序计数器PC的低8位值出栈。3.2汇编指令系统及应用举例8NOP指令 该指令也称空操作指令,它没有操作,只是用于产生

52、1个总线周期的延时。 9SEC指令 该指令设定CCR 寄存器的进位标志位C为1,通常用于在执行左移或右移指令前,改变进位标志 3.2汇编指令系统及应用举例10CLC指令 该指令的功能恰好与SEC指令相反,它设定CCR 寄存器的进位标志位C为0,通常用于在执行左移或右移指令前,改变进位标志 11SEI指令 该指令设定CCR 寄存器的中断屏蔽标志位I为1,主要用于禁止中断。在上电复位或其它几种复位开始,至堆栈指针和其他系统条件初始化之前的这段时间,可通过SET指令设置I 位为1来禁止中断,以防意想不到的事件发生 3.2汇编指令系统及应用举例12CLI指令 该指令的功能恰好与SEI指令相反,它设定C

53、CR 寄存器的中断屏蔽标志位I为0,主要用于开户中断。当完成系统初始化后,需要用CLI 指令来启动中断 3.2汇编指令系统及应用举例13BGND指令 该指令的用法特殊,用于CPU 停止执行新指令且不知道要持续多长时间的情况,BGND指令通常被开发系统用于设置用户调试程序,以实现软件断点。当ENBDM=1时,进入背景调试状态。相对于M68HC08系列单片机, BGND指令是HCS08的新增指令。普通用户程序中不会使用BGND,因为它强制CPU 停止处理用户指令而进入背景调试模式。要重新执行用户程序的唯一方法是通过复位,或由主机调试系统通过背景调试接口发出GO、TRACE1或AGGO等串行命令。3

54、.2汇编指令系统及应用举例14WAIT指令 该指令使CPU进入低功耗模式,使能中断,接着处于等待中断的状态。该指令被执行后,会引发CPU 关闭时钟以节省功耗,但其他的外围系统继续运行,一旦有中断源(外部的IRQ引脚或者来自内部的外围设备)到来,即可唤醒WAIT 模式下的CPU。另外,复位也可以唤醒WAIT 模式下的CPU 3.2汇编指令系统及应用举例15STOP指令 该指令与WAIT指令一样,使CPU进入低功耗模式,使能中断,停止处理相应的MCU工作,接着处于等待中断的状态。该指令被执行后,会强迫MCU 关掉所有的系统时钟以减少系统功率,达到最小的功率。在这种模式下,振荡器和时基模块的双稳态多

55、谐振荡器的时钟均已停止,因此系统功耗减至最小状态 3.2汇编指令系统及应用举例LDA#$0A;把十六进制数0A存入 累加器A中NOP ;没有操作,1个总线周期NOP ;没有操作,1个总线周期JSR DELAY ;调用子程序 DELAY3.3 伪指令汇编语言在源程序中使助记符和符号给编程带来了极大的方便,同时也给汇编带来了因难,因为汇编程序无法区分源程序中的符号是数据还是地址,也无法识别数据的类型,还不知道程序的定位、分段等情况。为了解决这些问题,汇编语言中专门设置了伪指令。伪指令只为汇编程序将符号指令编译成机器指令码提供信息,它们本身并不生成代码,汇编工作结束后它们就不再存在。 伪指令是指令助

56、记符里保留的命令字, 它可以设置一段程序的起始地址,可以使一个标号和一个值等同起来,可以确定程序变量在存储器中的位置,也可以为RAM 变量预留空间,还可以控制打印、为编译器配置选项等等。3.3 伪指令1BASE设定编译器的缺省数进制一般地,编译器默认用十进制数,但是有些编译器默认把没有前缀的数字当作16 进制数来处理。如果想使用十进制作为默认的数进制,那么可在源文件的开头使用BASE指令设置。 3.3 伪指令2INCLUDE指定附加源文件在编写工程源代码时,将一个工程项目的所有源代码放在一个单独的文件里往往是不恰当的,如果编写的源代码太多,就不容易编辑和管理这个源代码文件了,因此,可以将一个工

57、程项目拆分为两个或更多的独立源文件。而INCLUDE 伪指令就是这些独立源文件的纽带。一般地,在主源文件中使用INCLUDE 指令包含其他的源文件,当编译器遇到一个INCLUDE 指令时,它就会将附加源文件的内容转换到被包含的文件里,直到检测测到一个文件的结束信息为止。该伪指令的常用用法是包含一个芯片的定义文件(有时被称为通用文件)。这个文件定义了有关寄存器的相关地址,所以,在编写源程序时能在项目里直接使用寄存器和位名。 3.3 伪指令3.NOLIST/LIST关闭或打开文件列表在将一个程序的源文件编译成目标代码文件的同时,编译器会读一个源文件并且生成一个复合的列表文件。列表文件是一个包含了目

58、标代码和生成的行号以及原始文件信息的纯文本文件。NOLIST 和LIST 指令允许控制列表文件的产生。这些指令通常应用在编译器处理MCU 的通用文件时压缩列表 3.3 伪指令4ORG设置程序的起始位置在编译过程中,编译器保留一个“单元计数器”,这计数器可以跟踪下一个可用的存储单元以便存储代码和变量。ORG 指令可以将这个计数器设置为一个具体的地址值,在目标文件里它不产生任何实际代码,而是告诉编译器下一字节的代码或数据应该存放的内存空间位置。 3.3 伪指令5EQU赋值伪指令该指令告诉编译器某个数值或地址与一个特定的符号联系起来,表示符号与符号后的数值或地址是等值的。当EQU伪指令把一数值或地址

59、定义为一个符号常量后,在源文件中就可以用该符号常量来表示该数值或地址,使程序非常清晰、直观。 3.3 伪指令6dc.b定义存储器中字节常量指令dc.b 用来定义存储器的8 位常量。该指令设置了一个独立的存储器区域,让其关联于一个指定的8 位数值。该指令可以有一个与某个地址相关联的标号,而这个地址是用来存储常量的。3.3 伪指令7dc.w在存储器中定义16位常量dc.w 指令用来在存储器中定义16 位的常量值,它设定了两个存储器单元用来存储指定的16位数值,开头的高8 位存储在当前单元计数器指向的地址,后面的低8 位存储在下一个更高位的存储器地址。这个指令有一个和地址相关联的标号,常量的高8 位

60、存储在这个地址里。3.3 伪指令8ds.b/ ds.w定义存储(保留)内存变量字节指令ds.b 为指定的数值预留一个8 位存储器单元,以便用来存储程序变量;ds.w 指令为指定的程序变量预留16 位存储器单元。这两条指令不产生任何的目标代码。指令ds.b 使编译器与单元计数器所指向的当前地址相关联,之后按照ds.b 指令所设置的字节数调整单元计数器的值,单元计数器就指向了下一个可用的存储器单元。它通常给一个指定的程序变量预留出存储空间,也可给较大的数据结构或表设置存储空间。3.3 伪指令9标号编译器通过用户自定义标号可增强代码的可读性并且简化编程工作。一个标号只能定义一次,但是可以在一个程序中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论