PIC指令详解.docx

上传人:b****8 文档编号:11523496 上传时间:2023-03-02 格式:DOCX 页数:23 大小:200.76KB
下载 相关 举报
PIC指令详解.docx_第1页
第1页 / 共23页
PIC指令详解.docx_第2页
第2页 / 共23页
PIC指令详解.docx_第3页
第3页 / 共23页
PIC指令详解.docx_第4页
第4页 / 共23页
PIC指令详解.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

PIC指令详解.docx

《PIC指令详解.docx》由会员分享,可在线阅读,更多相关《PIC指令详解.docx(23页珍藏版)》请在冰豆网上搜索。

PIC指令详解.docx

PIC指令详解

中档PIC单片机汇编指令详解

-----老罗整理

NOP空操作指令

语法形式:

NOP

操作数:

执行时间:

一个指令周期

执行过程:

除了消耗一个指令周期之外,无任何其她影响,所以通常被用来作为延时使用

状态标志影响:

说明:

指令操作没有任何操作数参与,也不影响任何寄存器得内容与状态,所以通常都就是被作为延时使用得。

指令范例:

BSFPORTB,0;PORTB得第0位输出高电平

(1)

NOP;延时,使电平稳定

MOVWF将W寄存器得内容传送到数据寄存器

语法形式:

MOVWFf

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

执行时间:

一个指令周期

执行过程:

把W寄存器得内容传送到f数据寄存器,W寄存器得内容保持不变,类似于Copy

状态标志影响:

说明:

该指令就是对数据寄存器赋值得主要方式

指令范例:

MOVLW0x55;W寄存器赋值

MOVWFData;W寄存器值传送给Data

;此时Data=0x55

CLRWW寄存器内容清0

语法形式:

CLRW

操作数:

执行时间:

一个指令周期

执行过程:

0x00→W

1→Z

状态标志影响:

Z

说明:

该指令对W寄存器内容清零,并置位0标志Z

另外使用MOVLW0x00也可以使W寄存器内容为0,但就是这条指令不影响0标志Z

指令范例:

CLRW;W=0,Z=1

CLRF数据寄存器内容清零

语法形式:

CLRFf

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

执行时间:

一个指令周期

执行过程:

0x00→f

1→Z

状态标志影响:

Z

说明:

指令对数据寄存器清零,并置位0标志Z

指令范例:

CLRFTRISB;端口B所有I/O引脚设为输出

SUBWF将数据寄存器得内容减去W寄存器内容

语法形式:

SUBWFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器内容不变

当d=W时,结果放在W寄存器中,数据寄存器f内容不变

执行时间:

一个指令周期

执行过程:

【f】-【W】→d

状态标志影响:

ZDCC

说明:

要特别注意W寄存器在这条指令中就是减数

当【f】=【W】时,相减得结果为0,则Z=1

当【f】>【W】时,没有借位发生,则C=1

当【f】<【W】时,有借位发生,则C=0

实际上在PIC单片机中这条指令就是通过先对W寄存器得内容求补码,然后与被减数相加,所以在判断就是否有借位时与其她单片机不同,请注意26e5x。

指令范例:

MOVLW0x23;W=0x23

MOVWFtmp;tmp=0x23

MOVLW0x32;W=0x32

SUBWFtmp,W;tmp-W将结果存入W中,W=0xF1,tmp=0x23

;过程:

tmp=0x23,W求补码为0xCD,所以0x23+0xCD=0xF1,又因tmp

DECF数据寄存器得内容递减1

语法形式:

DECFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,f数据寄存器自减1

当d=W时,结果放在W寄存器中,W寄存器内容自减1

执行时间:

一个指令周期

执行过程:

【f】-1→d

状态标志影响:

Z

说明:

该指令对数据寄存器得内容做减1运算。

如果减1后得结果为0,则置位0标志寄存器Z

指令范例:

CLRFCount;Count=0x00

DECFCount,f;Count=0x00,f=0xFF

DECFf,W;f=0xFF,W=0xFE

INCF数据寄存器得内容递增1

语法形式:

INCFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,f数据寄存器自增1

当d=W时,结果放在W寄存器中,W寄存器内容自增1

执行时间:

一个指令周期

执行过程:

【f】+1→d

状态标志影响:

Z

说明:

该指令对数据寄存器得内容增加1。

如果增加后得结果为0,则置位0标志寄存器Z

指令范例:

CLRFCount;Count=0x00

INCFCount,f;Count=0x00,f=0x01

INCFf,W;f=0x01,W=0x02

IORWF数据寄存器f与W寄存器做逻辑或操作

语法形式:

IORWFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

【f】|【W】→d

状态标志影响:

Z

说明:

数据寄存器内容与W寄存器得内容逻辑或,结果按照d得指定位置存放,按照逻辑或有1出1得规则,使用该命令可以将任意位设置为1DVooj。

指令范例:

MOVLWb’’;将W寄存器得低4位设置为1

IORWFPORTB,f;将PORTB得低4位设置为1,不影响高4位

ANDWF数据寄存器f与W寄存器做逻辑与操作

语法形式:

ANDWFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

【f】&【W】→d

状态标志影响:

Z

说明:

数据寄存器内容与W寄存器得内容逻辑与,结果按照d得指定位置存放。

按照逻辑与有0出0得规则,使用该命令可以将任意位设置为0。

利用其影响标志Z得特性,可以判断寄存器任意位得组合就是否为全0。

nCiQ4。

指令范例:

例1:

寄存器任意位清零

MOVLWb’’;W寄存器高4位清0(取决于0得组合)

ANDWFPORTB,f;PORTB得高4位清0,低4位保持不变

例2:

判断寄存器任意位组合就是否全0

MOVLWb’’;W寄存器得低4位置1(取决于1得组合)

ANDWFPORTC,W;只要PORTC得低4位全0,则Z标志寄存器就置1

;此指令得操作结果放在W寄存器中,不会影响原寄存器得值

XORWF数据寄存器内容与W寄存器内容做逻辑异或操作

语法形式:

XORWFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

【f】^【W】→d

状态标志影响:

Z

说明:

数据寄存器内容与W寄存器得内容逻辑异或,结果按照d得指定位置存放。

按照逻辑异或得规则,任何数(0或1)与1异或,结果为反码;任何数与其本身异或,结果为0。

所以此指令可以把寄存器得任意位数据反转(0变1,1变0),或者判断寄存器得内容就是否为一特定值。

5CDOU。

指令范例:

例1:

寄存器任意位数据反转

MOVLWb’’;W寄存器低2位置1

XORWFPORTB,f;PORTB得高6位不变,低2位数据反转

例2:

判断寄存器得内容就是不就是特定值

MOVLW0xAA;W=0xAA(可以就是任意值)

XORWFPORTC,W;如果PORTC=0xAA,则Z标志就为1

;此指令得操作结果放在W寄存器中,不会影响原寄存器得值

ADDWFW寄存器内容与f数据寄存器内容相加

语法形式:

ADDWFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

【f】+【W】→d

状态标志影响:

ZDCC

说明:

数据寄存器内容与W寄存器内容相加,结果放入d指定得地方

指令范例:

MOVLW0x55;W=0x55,假定Sum=0xAA

ADDWFSum,f;W不变,Sum=0xFF

MOVF传送f数据寄存器得内容到目得寄存器

语法形式:

MOVFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,把数据寄存器得内容放回自己本身,目得用于判断数据寄存器得内容就是否为0。

当d=W时,结果放在W寄存器中,将数据寄存器f得内容传送至W寄存器

执行时间:

一个指令周期

执行过程:

【f】→d

状态标志影响:

Z

说明:

将数据寄存器得内容传送至它处,或者对f数据寄存器得内容做判0操作,如果传送得数据就是0,则置位Z标志。

rHweh。

指令范例:

例1:

数据传送

MOVFVar1,W;Var1内容传送至W寄存器

MOVWFVar2;W寄存器内容传送至Var2,此时Var1=Var2

例2:

数据判0

MOVFVar3,f;Var3寄存器内容被送往自身,其她寄存器内容不变,但就是影响Z标志

BTFSCSTATUS,Z;如果Var3不等于0,则跳过下一条指令

GOTOVar3Zero;如果Var3等于0,则转向其她操作

Ff数据寄存器内容取反

语法形式:

Ff,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

【f】→d

状态标志影响:

Z

说明:

求数据寄存器内容得反码,求一个数得补码可以使用这个指令完成(按位求反再加一)

指令范例:

Fnum,f;对num变量取反码

INCFnum,f;反码加1就就是其补码

DECFSZ数据寄存器内容递减1,并作判0标志

语法形式:

DECFSZf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期或两个指令周期

执行过程:

【f】-1→d

状态标志影响:

Z

说明:

该指令将首先将f数据寄存器得内容做减1运算,结果放到d指定得目得地址内,同时它还会对Z标志进行判0操作(进行分支跳转控制);如果f数据寄存器减1后结果非0,那么Z=0,程序将顺序执行下一条指令,本次指令操作耗费一个指令周期;如果结果为0,那么Z=1,此时程序将会跳过紧跟其后得第一条指令,去执行紧跟其后得第二条指令,本次指令操作耗费两个指令周期。

该指令常用于计数次数或者循环次数得控制。

e1ZyF。

指令范例:

MOVLW0x10;准备给循环计数器赋初值

MOVWFCount;此时循环计数器Count=0x10

Loop:

DECFSZCount,f;Count递减1,结果放入Count中,并进行Z标志判GOTOLoop;断,如果递减后结果不为0,继续执行Loop操作,;总共循环0x10(16进制)次。

DVTuM。

NOP;如果递减后结果为0,就跳到这条指令

INCFSZf数据寄存器内容递增1,并作判0标志

语法形式:

INCFSZf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期或两个指令周期

执行过程:

【f】+1→d

状态标志影响:

Z

说明:

该指令首先对数据寄存器得内容做加1操作,结果按照d得指示保存到相应得地方,然后对Z进行判0操作(分支跳转控制):

如果加1之后得结果非0,也就就是Z=0,程序将会按照顺序执行下一条指令,使用1个指令周期;如果加1之后结果为0,也就就是Z=1,那么程序将会跳过INCFSZ指令之后得第一条指令,开始执行第二条指令,使用2个指令周期。

该指令常用于计数次数与循环次数得控制。

H8cyx。

指令范例:

MOVLW0xC0;循环计数数据赋初值

MOVWFCount;此时循环计数器初值Count=0xC0

Loop:

INCFSZCount,f;Count内容加1,放回Count中,并进行Z标志判断

GOTOLoop;如果加1之后得结果不为0,则循环执行Loop得内容,总共循环次数为0x00-0xC0=0x40次kBAqv。

NOP;结果为0,则跳到这条指令

RRF数据寄存器内容带进位得循环右移

语法形式:

RRFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

状态标志影响:

C

说明:

该指令把C进位寄存器(借位寄存器)与数据寄存器得8位数据结合在一起做9位得循环右移1位得操作。

操作得结果就是把C移到数据寄存器得最高位,原数据寄存器得最低位放到C中。

Eb78t。

指令范例:

例1:

实现数据寄存器自身8位得循环右移

RRFData,W;数据寄存器Data得内容右移1位,结果放入W寄存器,Data本身得内容不变,但就是最低位已经移到C中IeRlZ。

RRFData,f;再次进行右移,结果写入Data自身。

这时上一条指令移入C中得最低位现在已经变成Data得最高位,实现了最低位变最高位,最高位变成第二高位得目得3gfe5。

例2:

实现数据寄存器算数右移(除2操作)

BCFSTATUS,C;确保C=0

RRFData,f;数据寄存器右移1位,最高位现在为0,结果放入自身

RLF数据寄存器内容进行带进位得循环左移操作

语法形式:

RLFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

状态标志影响:

C

说明:

该指令将C与8位数据寄存器得数据结合起来进行9位得循环左移操作,结果放入d指定得位置。

操作结果就是把C移到数据寄存器得最低位,将原数据寄存器得最高位移入C中。

Vv4UU。

指令范例:

例1:

实现数据寄存器得8位内容循环左移

RLFData,W;Data得内容左移1位放入W寄存器中,Data得内容不变,Data得最高位放入C中70sCI。

RLFData,f;Data得内容经操作后放回自身,C得内容(经上步操作后变成了原Data得最高位)放入Data得最低位。

qaYTI。

例2:

实现数据寄存器得算数左移(结果乘以2)

BCFSTATUS,C;确保C=0

RLFData,f;数据寄存器Data左移1位,最低位补充为0,实现乘以2

SWAPF数据寄存器高低半字节内容进行交换

语法形式:

SWAPFf,d

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

d为目得寄存器得低7位地址(0x00~0x7F)

当d=f时,结果放在f数据寄存器,W寄存器得内容不变

当d=W时,结果放在W寄存器中,f数据寄存器得内容不变

执行时间:

一个指令周期

执行过程:

【f<3:

0>】←→【f<7:

4>】

状态标志影响:

说明:

该指令实现把数据寄存器得高低半字节得内容进行交换,结果放入d指定得地址。

该指令在中断服务程序退出前恢复W寄存器得内容得过程中起着不可或缺得作用。

不影响状态寄存器。

ZUyGp。

指令范例:

SWAPFw_temp,f;w_temp得高低半字节内容交换,结果放回w_temp本身

SWAPFw_temp,W;w_temp得高低半字节内容再次交换,但就是结果放入W寄存器中,在不影响状态寄存器得前提下,实现了把w_temp得原内容复制到W寄存器中。

TUB1J。

位操作指令详述

BCF数据寄存器指定位清0

语法形式:

BCFf,b

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

B为数据位编号(0~7)

执行时间:

一个指令周期

执行过程:

使数据寄存器f得得b位清0

状态标志影响:

说明:

该指令可对任何数据寄存器得任意一个位置清0,常用于标志位得设定与清除,或者把某一管脚置成低电平。

Sjp6z。

指令范例:

BCFSTATUS,C;进位(借位)标志C清0

BCFPORTD,7;PORTD得第7位输出低电平

BSF数据寄存器得指定位b置1

语法形式:

BSFf,b

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

b为数据位编号(0~7)

执行时间:

一个指令周期

执行过程:

使数据寄存器f得得b位置1

状态标志影响:

说明:

该指令可对任何数据寄存器得任意一个位置置1,常用于标志位得设定与清除,或者把某一管脚置成高电平。

En0hA。

指令范例:

BSFINTCON,GIE;INTCON寄存器得GIE位置1,打开全局中断

BSFPORTD,6;PORTD第6位输出高电平

BTFSC判断数据寄存器中得指定位,为0则跳过下一条指令

语法形式:

BTFSCf,b

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

b为数据位编号(0~7)

执行时间:

一个指令周期或两个指令周期

执行过程:

如果数据寄存器f得b位为0,则跳过下一条指令

状态标志影响:

说明:

该指令可以对数据寄存器得任意一位做0/1得判断,如果数据位为1,程序将按顺序执行其下一条指令,此时一个指令周期;如果数据位为0,那么将跳过紧跟该指令之后得第一条指令,从第二条指令开始执行,此时使用两个指令周期。

该指令最常用于按标志位实现程序得分支跳转得控制。

jh2Qj。

指令范例:

BTFSCSTATUS,Z;测试状态寄存器得Z标志

GOTOZero;如果Z=1,执行此处指令

GOTONotZero;如果Z=0,执行此处指令

BTFSS判断数据寄存器得指定位,为1则跳过下条指令

语法形式:

BTFSSf,b

操作数:

f为数据寄存器得低7位地址(0x00~0x7F)

b为数据位编号(0~7)

执行时间:

一个指令周期或两个指令周期

执行过程:

如果数据寄存器f得b位为1,则跳过下一条指令

状态标志影响:

说明:

该指令可以对数据寄存器得任意一位做0/1得判断,如果数据位为0,程序将按顺序执行其下一条指令,此时一个指令周期;如果数据位为1,那么将跳过紧跟该指令之后得第一条指令,从第二条指令开始执行,此时使用两个指令周期。

该指令最常用于按标志位实现程序得分支跳转得控制。

vuEy0。

指令范例:

BTFSSPORTB,7;测试PORTB端口,位7

GOTORB7_Low;如果RB7=0,执行此处指令

GOTORB7_High;如果RB7=1,执行此处指令

立即数与控制操作指令

SLEEP单片机进入低功耗休眠模式

语法形式:

SLEEP

操作数:

执行时间:

一个指令周期

执行过程:

瞧门狗计数器清0

瞧门狗计数器得预分频器清0

STATUS寄存器得“TO”标志位置1

STATUS寄存器得“PD”标志位清0

状态标志影响:

TOPD

说明:

SLEEP指令可以让单片机停止所有得工作进入低功耗休眠模式,在休眠模式下芯片得功耗降至最低。

在休眠状态下,单片机得主时钟振荡器将停止,所有内部寄存器得内容保持不变,直到出现某一条件将单片机从休眠状态下唤醒。

nZbuk。

指令范例:

CALLPrepSleep;关闭所有不需要得负载,准备进入休眠模式

SLEEP;现在进入休眠模式

NOP;唤醒后开始执行指令

CLRWDT清除瞧门狗计数器

语法形式:

CLRWDT

操作数:

执行时间:

一个指令周期

执行过程:

瞧门狗计数器清0

瞧门狗计数器得预分频器清0

STATUS寄存器得“TO”标志位置1

STATUS寄存器得“PD”标志位置1

状态标志影响:

TOPD

说明:

如果芯片在编程烧写时启用了独立得片上瞧门狗电路,则在程序运行得过程中必须隔一段时间就执行这条清除瞧门狗得命令。

如果过了足够长得时间而没有执行这条指令,到了瞧门狗计数器计数溢出时就会让单片机产生复位,程序将会从复位地址处重新运行。

PIC单片机得瞧门狗一旦被打开就不能通过软件得方式关闭,在芯片休眠得时候照样工作,故可以作为让单片机退出休眠得一个条件。

通过启用瞧门狗可以避免软件死循环得故障。

需要强调得就是在一个好得程序设计中CLRWDT这条指令只在程序得主循环中出现一次,尽量避免到处放置清瞧门狗指令,绝对不能把这条指令放到中断服务程序中。

3cLw2。

指令范例:

MainLoop:

~~~;程序主循环

CLRWDT;清瞧门狗

CALLKeyCheck;检查按键

CALLDisplay;显示刷新

GOTOMainLoop;重复主循环体

RETLW子程序结束返回并在W寄存器内赋一8位立即数

语法形式:

RETLWk

操作数:

k为8位立即数

执行时间:

2个指令周期

执行过程:

弹出栈顶内容到PC

k→W

状态标志影响:

说明:

除了在子程序返回时从W寄存器带出一个8位立即数外,其她得执行情况与指令“RETURN”完全相同。

该指令经常被用于查表功能中。

XcPlm。

指令范例:

MOVFIndex,W;W中设定查表索引值(0~3)

CALLLookup;调用查表子程序

……;其她指令

Lookup:

ADDWFPCL,f;对PC值作修改

RETLW‘0’;返回0对应得ASCII码

RETLW‘1’;返回1对应得ASCII码

RETLW‘2’;返回2对应得ASCII码

RETLW‘3’;返回3对应得ASCII码

RETFIE中断服务程序结束并返回

语法形式:

RETFIE

操作数:

执行时间:

2个指令周期

执行过程:

弹出栈顶内容到PC

INTCON寄存器得第7位GIE自动置1

状态标志影响:

说明:

该指令把硬件堆栈栈顶得内容(中断发生时得返回地址)弹送到程序计数器PC内,对堆栈得影响如下图所示l9S5i。

与指令“RETURN”得情形基本相同,关键区别就是该指令会把INTCON寄存器得第7位全局中断使能位(GIE)置1(在响应中断时该位自动清0)。

然后返回到中断发生时得下一条指令处继续运行。

p61XL。

指令范例:

MOVFstatus_temp,w;准备恢复STATUS寄存器得内容

MOVWFSTATUS;STATUS寄存器被恢复

SWAPFw_temp,f;准备恢复W寄存器内容

SWAPFw_temp,w;W寄存器被恢复

RETFIE;中断返回并允许新得中断响应

RE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1