第三章PIC单片机指令系统和汇编语言程序设计3.1指令系统概述3.2字节操作指令3.3位操作指令3.4常数和控制操作类指令3.5汇编语言程序设计3.1指令系统概述3.1.1指令的表示方法1.机器指令的表示方法指令,用于规定计算机的基本操作。一台计算机所能执行的指令集合就是它的指令系统。指令共有两种表示方法:分别是机器语言表示方法和汇编语言表示方法。不同种类的单片机有不同的一套命令(即所谓“指令系统”)。2.PIC16F87X单片机指令系统特点采用精简指令集(RISC)结构,指令效率高,功能强。它的指令为单字的宽字位(14)指令,取指令效率高,生成的程序代码短。指令条数少,仅有35条。大部分为单周期指令,少数为2周期指令1.机器代码的格式和表示方法有以下不同类型的指令代码格式:(1)面向字节操作类(2)面向位操作类(3)常数操作和控制类操作。不同指令类型的格式2.1.2PIC单片机指令的寻址方式寻址,就是寻找操作数的存放地址。寻址方式,就是给操作数定位的方式。1.寄存器间接寻址所谓寄存器间接寻址指的是INDF不是物理上实际存在的寄存器,而是一个标志,任何寻址INDF的指令都是以FSR寄存器内容为地址,以此找到RAM单元中存放的操作数据。1.寄存器间接寻址2.立即数寻址所谓立即寻址就是操作数在指令中直接给出。通常把出现在指令中的操作数称之为立即数(literal),因此就把这种寻址方式称之为立即寻址。ADDLW21H3.直接寻址操作数所在的存储单元地址直接在指令中形式给出,就称之为直接寻址。这种方式可以对任何一个寄存器进行直接寻址访问。4.位寻址这种寻址方式是对寄存器中的任一位(bit)进行操作。例3-1ADDLW16H例2-2IORWF26H,0d=0—w1—f例2-3XORWF0,1例2-4BSF26H,4指令符号的意义说明1.PIC汇编语言指令格式每条汇编语言指令由4个部分组成,其书写格式如下:[标号]操作码助记符[操作数][;注释](Lable)(Opcode)(Operand)(Comment)2.指令符号的意义说明在PIC系列单片机指令中常把数据存储器RAM当作寄存器来使用(处理)并用字母f(或F)表示。d代表操作数的目标选择,定义d=0,结果存入W;d=1结果存入(文件)寄存器f,当使用汇编程序指令d缺省时,默认d=1。b代表(文件)寄存器(8位)的位地址(0~7取值)。如寄存器的8位为b7、b6……b1、b0,若b=1代表寄存器的第b1位。k代表立即数、常数和数据标号。指令集字节操作指令1.寄存器加法指令0=w1=fdequ0FSRequ04HAddwffsr,d00011100000100字节操作指令2.寄存器减法指令字节操作指令3.寄存器加1指令CNT+1--CNT字节操作指令4.寄存器减1指令字节操作指令5.寄存器与指令字节操作指令6.寄存器或指令字节操作指令7.寄存器异或指令字节操作指令8.寄存器取反指令字节操作指令9.寄存器清零指令字节操作指令10.W清零指令字节类传送操作指令11.f寄存器传送指令字节操作指令12.W寄存器传送指令字节操作指令13.寄存器加1,结果为零则跳指令字节操作指令14.寄存器减1,结果为零则跳指令字节操作指令15.带进位左移指令字节操作指令16.带进位右移指令RRF2.2字节操作指令17.寄存器交换指令位操作指令1.位清零指令bEQU7BCFFLAG_REG,b位操作指令2.位置1指令位操作指令3.位测试,为零则跳指令位操作指令4.位测试,为1则跳指令常数和控制操作类指令1.常数加法指令思考:能否一个常数和一个f寄存器相加常数和控制操作类指令2.常数减法指令常数和控制操作类指令3.常数与指令常数和控制操作类指令4.常数或指令常数和控制操作类指令5.常数异或指令常数和控制操作类指令6.看门狗计数器清零指令常数和控制操作类指令7.常数传送指令常数和控制操作类指令8.子程序调用指令常数和控制操作类指令9.无条件跳转指令常数和控制操作类指令10.子程序返回指令常数和控制操作类指令11.子程序带参数返回指令0000HK10001HK20002HK3…..WPC+W-PCPC+1-PC常数和控制操作类指令12.中断服务子程序返回指令常数和控制操作类指令13.睡眠(进入低功耗状态)指令常数和控制操作类指令14.空操作指令汇编语言程序设计1.汇编语言源程序的结构汇编语言提供了一种符号化语言,不涉及实际存储器地址和机器指令编码,编写源程序的有效方法。我们需要掌握的是:汇编语言的程序格式、语句格式、助记符、伪指令。程序的4种基本结构:顺序、分支、循环和子程序。汇编语言程序设计2.PIC汇编语言的程序流程图(1)程序流程图常用的图形符号圆角矩形框为起始/终止框,表示一个程序的开始或结束。矩形框为任务框,表示要处理的任务。菱形框为判断框,表示要判断的因素,判断结果将导致程序走入不同的分支。指向线为带有箭头的线段,表示程序的走向。汇编语言程序设计(2)程序流程图的画法①顺序程序结构顺序程序结构在流程图中表示为任务框一个一个地串行连接。在计算机执行程序时表现为,从头至尾严格按照次序一条语句一条语句地顺序执行,并且每一条语句均被执行一遍。汇编语言程序设计②分支程序流程图分支程序流程图包含1个判断框和两个或两个以上的出口。从而形成程序的2个或多个分支。汇编语言程序设计③循环程序流程图循环程序的结构包含以下4个组成部分:循环初始化部分:为循环程序作准备。如循环条件变量、初始值设置。循环体:要求重复执行的程序段,即循环程序的主体部分。循环控制部分:循环控制就是根据循环结束条件,判断是否跳出循环。结束部分:对循环结果进行分析、处理和保存。汇编语言程序设计PIC汇编语言的伪指令(参看94页)所谓伪指令就是“假”指令的意思,不是单片机的指令系统中的真实指令。伪指令与指令系统中的助记符的不同之处是没有机器码与它对应。[符号名]伪指令助记符[操作数][;注释]最常用的伪指令介绍(1)INCLUDE功能:读入外部源文件格式:INCLUDE文件名说明:用于把指定文件读入到当前源程序中作为源程序代码的一部分。文件名必须用双引号或尖括号给出,如果被指定文件非当前工作目录下,则需要指令完整的路径。最常用的伪指令介绍(2)EQU功能:对符号名赋值格式:符号名EQU表达式说明:使EQU两端的8位值相等,即给符号名赋予一个特定值或者说是给符号名定义一个数值。最常用的伪指令介绍(3)#DEFINE功能:定义文本替换标号格式:#DEFINE名字[字符串]说明:用于定义文本替换标号,在汇编时把源代码中的名字替换成字符串。最常用的伪指令介绍(4)ORG功能:存放程序单元的起始地址格式:[符号名]ORG表达式说明:用于指定该伪指令后面的源程序存放的起始地址,也就是汇编后的机器码目标程序在单片机的程序存储器中开始存放的首地址。最常用的伪指令介绍(5)END功能:程序结束伪指令格式:END说明:这条伪指令通知汇编器MPASM结束对源程序(.ASM)的汇编,即使在后面还有语句,也将不予继续汇编。例:赋值伪指令的应用;**********************************************************************;**功能:编写一个双字节无符号数加法子程序,并将双字节加法产生的进位位放入寄存器STATUS的C位中。;**说明:运行程序,通过View菜单下Watch窗口观察寄存器STATUS的C位变化情况。;**********************************************************************;**#includep16f877a.incP1EQU20H;加数高位寄存器P2EQU21H;加数低位寄存器Q1EQU22H;被加数高位寄存器Q2EQU23H;被加数低位寄存器;**********************************************************************ORG00HNOP;空指令GOTOMAIN;**;**********************************************************************MAINMOVLW0xAA;加数高位赋值MOVWFP1MOVLW0x89;加数低位赋值MOVWFP2MOVLW0xFF;被加数高位赋值MOVWFQ1MOVLW0xAA;被加数低位赋值MOVWFQ2MOVFP2,w;取出加数的低字节P2ADDWFQ2,f;先将低字节P2和Q2相加,此时低位的进位位在C中MOVFP1,w;取出加数的高字节P1,注意这条指令是不会影响上一句;产生的低字节加法进位位的BTFSCSTATUS,C;根据进位位来判断是否执行下一句INCFSZP1,w;ADDWFQ1,f;执行高字节加法延时的计算PIC为什么是单周期指令为什么会有2周期指令那些是2周期指令参考103页16位无符号数加法运算程序设计;--------------------------------------------;16位加法(按字节加);--------------------------------------------STATUSEQU03HALEQU20HAHEQU21H;被加数BLEQU22HBHEQU23H;加数CLEQU24HCHEQU25H;结果JHEQU27H;高8位进位ORG000HNOPGOTOSTARTSTARTMOVLW15HMOVWFALMOVLW25HMOVWFAH;赋值被加数MOVLW0F5HMOVWFBLMOVLW30HMOVWFBH;赋值加数CLRFCLCLRFCHCLRFJH;清零结果装置BCFSTATUS,0;清零标志