ADDWF W寄存器内容和f数据寄存器内容相加
语法形式:ADDWF f,d
操作数:f为数据寄存器的低7位地址(0x00~0x7F)
d为目的寄存器的低7位地址(0x00~0x7F)
当d=f时,结果放在f数据寄存器,W寄存器的内容不变
当d=W时,结果放在W寄存器中,f数据寄存器的内容不变
执行时间:一个指令周期
执行过程:【f】+【W】→d
状态标志影响:Z DC C
说明:数据寄存器内容和W寄存器内容相加,结果放入d指定的地方
指令范例:
MOVLW 0x55 ;W=0x55,假定Sum=0xAA
ADDWF Sum,f ;W不变,Sum=0xFF
MOVF 传送f数据寄存器的内容到目的寄存器
语法形式:MOVF f,d
操作数:f为数据寄存器的低7位地址(0x00~0x7F)
d为目的寄存器的低7位地址(0x00~0x7F)
当d=f时,把数据寄存器的内容放回自己本身,目的用于判断数据寄存器的内容是否为0。
当d=W时,结果放在W寄存器中,将数据寄存器f的内容传送至W寄存器
执行时间:一个指令周期
执行过程:【f】→d
状态标志影响:Z
说明:将数据寄存器的内容传送至它处,或者对f数据寄存器的内容做判0操作,如果传送的数据是0,则置位Z标志。
指令范例:
例1:数据传送
MOVF Var1,W ;Var1内容传送至W寄存器
MOVWF Var2 ;W寄存器内容传送至Var2,此时Var1=Var2
例2:数据判0
MOVF Var3,f ;Var3寄存器内容被送往自身,其他寄存器内容不变,但是影 响Z标志
BTFSC STATUS,Z ;如果Var3不等于0,则跳过下一条指令
GOTO Var3Zero ;如果Var3等于0,则转向其他操作
COMF f数据寄存器内容取反
语法形式:COMF f,d
操作数:f为数据寄存器的低7位地址(0x00~0x7F)
d为目的寄存器的低7位地址(0x00~0x7F)
当d=f时,结果放在f数据寄存器,W寄存器的内容不变
当d=W时,结果放在W寄存器中,f数据寄存器的内容不变
执行时间:一个指令周期
执行过程:!【f】→d
状态标志影响:Z
说明:求数据寄存器内容的反码,求一个数的补码可以使用这个指令完成(按位求反再加一)
指令范例:
COMF num,f ;对num变量取反码
INCF num,f ;反码加1就是其补码
DECFSZ 数据寄存器内容递减1,并作判0标志
语法形式:DECFSZ f,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,此时程序将会跳过紧跟其后的第一条指令,去执行紧跟其后的第二条指令,本次指令操作耗费两个指令周期。该指令常用于计数次数或者循环次数的控制。
指令范例:
MOVLW 0x10 ;准备给循环计数器赋初值
MOVWF Count ;此时循环计数器Count=0x10
Loop:DECFSZ Count,f ;Count递减1,结果放入Count中,并进行Z标志判 GOTO Loop ;断,如果递减后结果不为0,继续执行Loop操作, ;总共循环0x10(16进制)次。
NOP ;如果递减后结果为0,就跳到这条指令