PIC汇编指令集概述
2010-8-4 16:23:39
PIC单片机(Peripheral Interface Controller)是一种用来开发的去控制外围设备的集成电路(IC),翻译为外设接口控制器。PIC 意思确实有点奇怪,不知道的话第一个P肯定翻译为Programable(可编程)的。
目前我接触的基本都是8位的CPU,包括AVRPIC等系列,之前我写的程序都是以C语言去写的,也从未出现过什么问题,虽然很多人说道C语言的BUG问题,我一直都不是很在意,就目前为止我从未遇到过这种问题,用AVR-GCC写的时候也曾经出现过问题,也怀疑过C语言和编译器,最终事实证明是错的,一直都是我们没有注意的语法问题的造成的。接触PIC后我开始用起了他的汇编,原因无它,只是大家都在用汇编。
这是发表的第二篇文章,处女篇给了梦梦哈,首先介绍一下PIC的单片机,PIC单片机是基于哈弗结构的精简指令集(RISC)的单片机,没啥说的,很多单片机都是的。特殊的地方就是他的指令和存储器结构,一直有个问题到底是他的指令结构决定的他的存储器结构,还是存
储器结构决定的指令结构? PIC8位机分为低中高三个档子,低档次的是PIC12系列的,指令是以12BIT结构编码的,对应的指令集有33条指令;中档的CPUPIC16系列,指令集包含35条指令,并且是以14BIT的结构编码的;高档次的PIC18系列包含58条指令,每条指令是以16BIT结构编码的。并且所有指令向下兼容。
PIC指令的语法和其他系列的一样,都是有以下几部分组成的:标号 操作码助记符 操作数操作数;注释
1。关于标号,没啥说的,和其他单片机一样,它表示一个地址,标号也是可选的,不是所有的指令都需要的,只有在被其他语句引用时才需的,在没有标号的情况下,操作码助记符前必须保留一个或以上的空格再去写指令助记符,一般使用一个TAB,如果没有标号,而操作码助记符占用了标号的位置,汇编器会把指令助记符当做标号来处理。标号必须以字母或者半角下划线开头,后面可以跟数字字符,字母等。再有不可以使用助记符当做标号,标号可以单独占用一行。还有就是标号后可以有冒号(:),也可以没有,依个人喜好而定,只是我喜欢加上,看起来舒服,清晰。
2。操作码助记符是必选项,该项可以是指令助记符、宏汇编或者伪指令组成。其作用是汇
编器在汇编的时候可以通过助记符操作码表比较,到其相应的机器码一一代替。
3。操作数由操作数的数值或者以标号表示的数值或者地址值组成;若操作数有两个,他们之间必须用隔开。当操作数是常数的时候,可以是二进制,8进制,10进制或者16进制的数,还可以是定义过的标号,字符串或者ASCII码。当以常数表示的时候,二进制要冠以B开头,8进制以O开头,10进制以D开头,16进制冠以H“H”也可以放至最后,PIC的编译器默认是以16进制表示的,16进制也可以以0x表示。在此提醒大家一点,程序中的一种进制当有几种表示方式时,最好从头到尾以一种格式表示。操作数项也是可选的,
4。注释是可选的,用来对程序做出说明,便于阅读和后期的维护。注释用区分,后面的语句不被编译。需要说明的是,子函数前应说明入口条件,出口条件和函数功能等信息。当函数用到特别的算法的时候也需要说明算法原理等,便于后期修改和阅读。
PIC16系列CPU为例介绍PIC的指令集系统:
PIC16系列具有35条指令,所有指令依据面向的对象可以分为3大类:面向字节操作类、面向位操作类、面向常数和控制操作类。如下图所示
 
1ADDWF f, df寄存器内容与W寄存器相加,d=1时结果放在fd=0是结果在W,影响STATUSCDCZ标志。该条指令影响的状态与MCS51一致,有进位时C=1,有半进位时DC=1;否则相反。结果为0Z标志置位。
2ANDWF f, df寄存器内容与W寄存器相与,d=1时结果回存至fd=0时结果存至W,结果影响STATUSZ标志位。
3CLRF ( CLEAR File Register), 清空页寄存器,STATUSZ标志位置位
汇编指令有多少个4CLRW CLEAR WREG),清空W寄存器,STATUSZ标志位置位,可以用MOVLW 0H等同使用
5COMF f, df寄存器内容取反,d=1时结果存至f寄存器,d=0时结果存至W寄存器。影响Z标志位。
6DECF f, df寄存器内容自减1d=1时结果存放于fd=0时结果存放于w,影响STATUSZ标志位。
7DECFSZ  f, d f寄存器内容自减1,为0则跳行,d=1时结果在f寄存器;d=0时结果在W寄存器。不影响标志位。
8INCF f, df寄存器内容自加1d=1时结果回存至fd=0时结果在W。影响Z标志位。
9INCFSZ f, df寄存器内容自加1,结果为0则跳行。d=1时结果回存至fd=0时结果存至W寄存器。该指令不影响标志位。
10IORWF f, df寄存器内容与W寄存器相或,d=1时结果回存至fd=0时结果存至W,结果影响STATUSZ标志位。
11MOVF f, d,当d=1时,f寄存器内容不变,d=0f寄存器内容复制到W寄存器。当d=1时,只改变Z标志位,可以用与判断f寄存器内容是否为0
12MOVWF , f (MOVE WREG to File Register),很常用的一条指令,将W寄存器的内容保存到RAM中去
13NOP,没什么可说的,空操作而已,但是确实很常用的语句,短延时必须的。
14RLF f, d,循环左移指令,f的最高位移到C,原来C的内容移到f的最低位。与MSC51的循环左移指令功能一致。结果影响C标志。
15RRF f, d 循环右移指令,f的最低位移到C,原来C的内容移到f的最高位。与MCS51的循环右移指令功能一直。结果影响C标志。
16SUBWF f, d f-W结果存放取决于d,当d=1时结果存在f里,0时存在W里,指令影响
STATUSCDCZ标志位,有借位时C=0,有半借位时DC=0;无借位和半借位时真好相反。这点与MCS51系列的单片机有些不同,用时需注意。当两数相等时Z=1
17SWAWF  f, d 字节交换指令,f的高低字节交换,结果不影响标志位。该条指令在中断断点保存和恢复中很重要,而且只能使用該指令。在下篇將給出介紹。
18XORWF f, df寄存器内容与W寄存器异或,d=1时结果存至fd=0时结果存至W,影响STATUSZ标志位,该条指令我常用来比较是否与一个数相等,利用同01的原理。
19BCF  f, b,清零f寄存器的第b位。指令不影响任何标志位,四条位操作指令在程序设计中有极其重要的作用,被广泛应用。
20BSF  f, b,置位f寄存器的第b位。指令不影响任何标志位。
21BTFSC  f, b,测试f寄存器的第b位,为0则跳行,指令不影响任何标志位。
22BTFSS  f, b,测试f寄存器的第b位,为1则跳行,指令不影响任何标志位。
23ADDLW  kW加立即数k,结果在W寄存器内,有进位,半进位时CDC1,否则0;结果为0Z=1
24ANDLW  kW与立即数k相与,结果在W寄存器,影响Z标志位。
25CALL  k,调用子程序,k为子程序的入口地址,不影响任何标志位,但是改指令执行需要两个指令周期,因为在跳转之前需要保存当前得返回地址。
26CLRWDT 看门狗定时器清0,影响STATUS寄存器的TOPD标志位。两个标志位均置位。
27GOTO  k,跳转到指定地址处,不影响标志位。双周期指令。
28IORLW kW寄存器与立即数k相或,结果在W寄存器,影响Z标志位。
29MOVLW k,立即数k赋给W寄存器,不影响标志位。
30RETFIE,中断返回指令,没啥说的。中断服务程序最后一句。
31RETLW k,立即数kW寄存器,子程序返回,该条指令很特别哈,也比较有意思的饿,查表必用。
32RETURN,子程序返回指令。
33SLEEP,进入休眠模式。影响STATUSTOPD标志位,TO=1PD=0
34SUBLW, k,立即数减去W,结果在W寄存器,标志位影响与SUBWF指令一致,不再赘述。
35XORLW k,立即数kW寄存器异或,结果在W寄存器,影响Z标志位。
以上为PIC16中档系列的指令集,总共35条指令,还有一条TRIS指令,是为了保持与PIC16C5x系列代码兼容而出的,不推荐使用。
下面给出PIC汇编的一般格式,或者说套路吧:
INCLUDE<PIC16Fxx.inc>    ;包含必要的头文件
__CONFIG  xxxxH        ;配置字,可以不要,在烧录时修改,建议使用
ERRORLEVEL xH        ;编译器错误,警告等级设定,以上为宏汇编,关于宏汇编在下篇介绍
;Reset handler
    ORG 0H            ;程序起始地址,复位向量
    NOP            ;无意义,某仿真器必须的语句
    GOTO MAIN        ;跳转到用户代码区   
;Interrupt  handler
    ORG 04H        ;中断向量
    ;user code here
    RETFIE
    ORG xxH        ;用户代码起始地址,可以不要
MAIN:
    ;Initialization function here
MAINLP:
    ;user code here
    GOTO MAINLP        ;死循环,C语言的while(1)
    END            ;程序结束
至此,关于PIC汇编指令的介绍就结束了哈,下篇主要介绍PIC的宏汇编使用,大家多多指教哈。
 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。