PIC单片机采用的RISC精简指令集是由生产厂家规定的。其汇编指令可分为3类:面向字节的指令、面向位的指令、常数和控制操作指令。基本级产品有33条指令,中级产品有35条指令,高级产品有58条指令。指令均向下兼容。另外,在汇编过程中往往还需要一些伪指令,其作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用。本文以中级产品的指令集为例,介绍PIC 8位单片机的指令系统。
面向字节的指令是指参与指令的操作数为字节类型。
操作码 f,d
操作码是PIC汇编指令的助记符,说明操作完成的功能;f代表一个文件寄存器指示符, 文件寄存器指示符规定了该指令使用哪一个文件寄存器;d表示一个目标指示符,目标指示符规定了操作的结果存放在哪里。如果d=0,则结果存于工作寄存器W(累加器)中;如果d=1,则结果存于由指令所规定的文件寄存器f中,缺省值d=1。
2. 指令说明(见表1)
3. 举例
例1: ADDWF FSR,0
若指令执行前W=0x17、FSR=0xC2,这条指令使用FSR文件寄存器,目标指示符d为0,操作结果存于W中,则指令执行后W=0xD9、FSR=0xC2。
例2: ANDWF FSR,1
若指令执行前W=0x17、FSR=0xC2,则指令执行后W=0x17、FSR=0x02。
例3: COMF REG1,0
若指令执行前REG1=0x13,则指令执行后REG1=0x13、W=0xEC。
例4: INCF CNT,1
若指令执行前CNT=0xFF,则指令执行后CNT=0x00。
例5: MOVWF OPTION
若指令执行前OPTION=0xFF、W=0x4F,则指令执行后OPTION=0x4F、W=0x4F。
例6: RLF REG1,0
若指令执行前REG1=1110 0110、C=0,则指令执行后REG1=11101100、C=1、W=1100 1100。
例7: SUBWF REG2,1
若指令执行前REG2=3、W=2,则指令执行后REG2=1、W=2、C=1结果为正。
若指令执行前REG2=1、W=2,则指令执行后REG2=FF、W=2、C=0结果为负。
二、 面向位的指令
面向位的指令是指参与指令的操作数为位类型。
1. 面向位的指令的一般格式:
操作码 f,b
操作码是PIC汇编指令的助记符,说明操作完成的功能;f代表该位所在的文件寄存器的地址; b代表了一个位指示符,它选定被操作所影响的位数,从0~7。
2. 面向位的指令说明(见表2)
3.举例
例8: BCF FLAG_REG,7
若指令执行前FLAG_REG=0xC7,则指令执行后FLAG_REG=0x47。
例9: HERE BTFSC FLAG,1
FALSE GOTO PR_CODE
TRUE
若指令执行前PC=HERE 标号地址,则指令执行后如果FLAG的位1为0,PC=TRUE标号的地址,跳过下一条GOTO指令;如果FLAG的位1为1,PC=FALSE标号的地址。
三、 常数和控制操作
1. 常数和控制操作指令的一般格式:操作码 k
k:对于GOTO和CALL指令,它代表11位常数或标号,对于其他指令则为8位常数。
2.常数和控制操作指令说明(见表3)
3.举例
例10: ADDLW 0x15
若指令执行前W=0x10,则指令执行后W=0x25。
例11: MOVLW 0x5A
指令执行后W=0x5A。
例12: SUBLW 0x08
若指令执行前W=0x07,则指令执行后W=0x01、C=1,结果为正。
若指令执行前W=0x08,则指令执行后W=0x00、C=1,结果为零。
若指令执行前W=0x09,则指令执行后W=0xFF、C=0,结果为负。
例13: CLRWDT
指令执行后WDT计数器=0x00、WDT预分频器=0、TO=1、PD=1。
例14: MOVLW 03H ;
CALL TABLE ;调用查表子程序
…
TABLE ADDWF PC ;PC为下一条指令的地址
RETLW 10H ;表的开始
RETLW 11H
RETLW 12H
RETLW 13H
RETLW 14H
…
这段指令执行前W=0x03;这段指令执行后W=0x13。
例15: RETFIE
指令执行后,堆栈顶的内容被弹出并装入PC,返回中断前地址,GIE=1(中断打开)。
例16: RETURN
指令执行后,堆栈顶的内容被弹出并装入PC,从子程序返回。它与RETLW指令都是从子程序返回指令,它们的区别就在于RETLW可以带参数从子程序返回。
在基本级产品的指令系统中有两条指令:OPTION和TRIS,这两条指令的功能是将W寄存器的内容装入OPTION或TRIS寄存器中。OPTION和TRIS是可读/写寄存器,在中、高级产品中就取消了这两条指令,可用MOVWF OPTION或MOVWF TRIS来代替这两条指令。ADDLW、RETFIE、RETURN和SUBLW这4条指令是基本级产品没有的。
四、 伪指令
在PIC单片机的汇编程序(MPASM)中支持4类伪指令:数据伪指令、列表伪指令、控制伪指令和宏汇编伪指令。下面介绍几条常用的伪指令。
1. ORG存放单元起始地址
格式:ORG <地址表达式>
说明:ORG伪指令用于指定该伪指令后面的源程序存放的起始地址。如果ORG后面无地址表达式,则默认为0。在一个源程序中,可以根据需要多次使用该伪指令来定位源程序。
例17: ORG 3FFH ;
GOTO START
表示GOTO START指令存放在地址3FFH单元。
2. EQU是对寄存器f和标号赋值
格式:<标号> EQU <表达式>
说明:给标号或寄存器赋值,标号一旦被EQU指令赋值,在此源程序中就不能再重新定义。
例18: COUNTER EQU 20H ;给COUNTER寄存器赋值20H
3. LIST列表选择指令
格式:LIST <选择项>,… ,<选择项>
说明:设置各种汇编参数用来控制汇编过程,此伪指令的参数只能在一行内完成,用逗号隔开。选择项包括:固化编程的文件格式,用f=<格式>表示;单片机类型, 用p=<类型>表示;数制的基数,用r=<基数>表示。
例19: LIST f=INHX8M,p=16C54,r=HEX;规定固化编程格式为INHX8M,单片机类型为PIC16C54,设置数制的基数为十六进制。
4. END源程序结束指令
END伪指令放在整个程序的最后。汇编程序遇到END指令后,结束对源程序的汇编。即使后面还有语句,也不再予以汇编。
5. INCLUDE包含其他外部源文件
格式:INCLUDE“文件名”或 INCLUDE<文件名>
说明:用于把指定文件读入源程序中作为源程序代码的一部分,直到检测到文件结束符为止,再恢复到原源程序中的代码处。文件名必须用双引号或尖括号给出。
例20:INCLUDE“PIC12C508A.INC”
以上我们介绍了PIC系列单片机中级产品的指令集,更多关于PIC单片机硬件、指令方面的信息读者可到上期我们推荐的各网站上去查找,而上述指令系统的具体应用将在以后的案例教程中介绍。下期,我们将为大家介绍PIC12C508的看门狗定时器和低功耗方式特点以及它在一个低功耗无线收发控制系统中的应用。

