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