3.2 PIC16F87X指令集

1.数据传送指令

① 立即数传送指令

        句法:         MOVLW     k     操作范围:     0<k<255
        指令周期:     0                 影响标志位:    无
        操作内容:     k→W
        操作说明:     把8位立即数传送给W寄存器。

② f寄存器传送指令

        句法:     MOVF      f,d       操作范围:     0<f127,d∈[0,1]
        指令周期:  1                    影响标志位:    Z
        操作内容:  f→d
        操作说明:将f寄存器内容传送给f本身(d=1)或W寄存器(d=0)。

③ W寄存器传送指令

        句法:     MOVWF    f          操作范围:     0<f<127
        指令周期:  1
        正影响标志位:无
        操作内容:  W→f
        操作说明:将W寄存器内容传送给f寄存器。

2.算术运算指令

(1)加法运算指令

① 立即数加法指令

        句法:     ADDLW    k      操作范围:         0<k<225
        指令周期:  1                 影响标志位:       C、DC、Z
        操作内容:  k+W→W
        操作说明:将立即数与W寄存器内容相加,结果传送给W寄存器。

② W寄存器加法指令

        句法:     ADDWF    f,d    操作范围:         0<f<127,d∈[0,1]
        指令周期:  1                 影响标志位:    C、DC、Z
        操作内容:  W+f→d
        操作说明:将W寄存器内容与f寄存器内容相加,结果传送给f本身(d=l)或W寄
    存器(d=0)。

③ f寄存器加1指令

        句法:     INCF       f,d    操作范围:         0<f<127,d∈[0,1]
        指令周期:  1                 影响标志位:Z
        操作内容:  f+1→d
        操作说明:将f寄存器内容加1,结果传送给f本身(d=1)或W寄存器(d=0)。

(2)减法运算指令

① 立即数减法指令

        句法:         SUBLW  k      操作范围:         0<k<225
        指令周期:     1             影响标志位:       C、DC、Z
        操作内容:     k-W→W
        操作说明:将立即数与W寄存器内容相减,结果传送给W寄存器。

② W寄存器减法指令

        句法:     SUBWF   f,d     操作范围:         0<f<127,d∈[0,1]
        指令周期:  1                 影响标志位:       C、DC、Z
        操作内容:  f-W→d

操作说明:将f寄存器内容与W寄存器内容相减,结果传送给f本身(d=l)或W寄存器(d=0)。

③ f寄存器减1指令

        句法:     DECF  f,d        操作范围:         0<f<127,d∈[0,1]
        指令周期:  1                 影响标志位:       Z
        操作内容:  f-1→d
        操作说明:将f寄存器内容减1,结果传送给f本身(d=1)或W寄存器(d=0)。

3.逻辑指令

(1)逻辑运算指令

① 寄存器取反指令

        句法:     COMF   f,d       操作范围:         0<f<127,d∈[0,1]
        指令周期:  1                 影响标志位:       Z
        操作内容:  f取反→d
        操作说明:将f寄存器内容取反,结果传送给f本身(d=1)或W寄存器(d=0)。

② 寄存器半字节交换指令

        句法:     SWAPE   f,d      操作范围:         0<f<127,d∈[0,1]
        指令周期:  1          影响标志位:无
        操作内容:  f<0,3>→d<4,7>,f<4,7>→d<0,3>
        操作说明:将f寄存器内容高4位和低4位交换,结果传送给f本身(d=1)或W寄
    存器(d=0)。

③ 立即数逻辑与指令

        句法:ANDLW   k      操作范围:     0<k<255
        指令周期:1            影响标志位:    Z
        操作内容:k∧W→W
        操作说明:将8位立即数与W寄存器内容相“与”,结果传送给W寄存器。

④ 立即数逻辑或指令

        句法:     IORLW k   操作范围:     0<k<255
        指令周期:  1          影响标志位:    Z
        操作内容:  k∨W→W
        操作说明:将8位立即数与W寄存器内容相“或”,结果传送给W寄存器。

⑤ 立即数逻辑异或指令

        句法:XORLW      k   操作范围:     0<k<255
        指令周期:  1          影响标志位:    Z
        操作内容:k + W→W
        操作说明:将8位立即数与W寄存器内容相“异或”,结果传送给W寄存器。

⑥ 寄存器逻辑与指令

        句法:     ANDWF f,d    操作范围:     0<f<127,d∈[0,1]
        指令周期:  1             影响标志位:    Z
        操作内容:f∧W→d
        操作说明:将f寄存器内容与W寄存器内容相“与”,结果传送给f本身(d=1)或W
    寄存器(d=0)。

⑦ 寄存器逻辑或指令

        句法:     IORWF  f,d    操作范围:     0<f<127,d∈[0,1]
        指令周期:  1             影响标志位:    Z
        操作内容:  f∨W→d
        操作说明:将f寄存器内容与W寄存器内容相“或”,结果传送给f本身(d=l)或
    W寄存器(d=0)。

⑧ 寄存器逻辑异或指令

        句法:     XORWF  f,d      操作范围:     0<f<127,d∈[0,1]
        指令周期; 1                 影响标志位:    Z
        操作内容:  f + W→d
        操作说明:将f寄存器内容与W寄存器内容相“异或”,结果传送给f本身(d=1)
    或W寄存器(d=0)。

(2)移位指令

        ① 寄存器带进位循环左移指令
        句法:     RLF    f,d       操作范围:     0<f<127,d∈[0,1]
        指令周期:  1                 影响标志位:    C
        操作内容:  f(n)→d(n+l),  f(7)→C,C→d(0)
        操作说明:将f寄存器内容带进位循环左移一位,结果传送给f本身(d==l)或W
    寄存器(d=0),如图3-1所示。

② 寄存器带进位循环右移指令

图3-1 带进位循环左移指令示意图

        句法:     RRF   f,d     操作范围:  0<f<127 d∈[0,l]
        指令周期:  1             影响标志位:C
        操作内容:  f(n)→d(n-l),  f(0)→C,  C→d(7)
        操作说明:将f寄存器内容带进位循环右移一位,结果传送给f本身(d=1)或W寄
    存器(d=0),如图3-2所示。

4.控制转移指令

图3-2 带进位循环右移指令示意图

        ① 递增跳转指令
        句法:     INCFSZ   f,d      操作范围:0<f<127,dE∈[0,1]
        指令周期:  1或2             影响标志位:无
        操作内容:   f+1→d,f+1= 0则PC+1→PC
        操作说明:f寄存器内容加1,结果传送给f本身(d=1)或W寄存器(d=0):如果
    结果为0则跳过下一条指令;否则顺序执行。

② 递减跳转指令

        句法:     DECFSZ   f,d     操作范围:0<f<127,d∈[0,1]
        指令周期:  1或2             影响标志位:无
        操作内容:  f-1-d,f-1=0则PC+1→PC
        操作说明:f寄存器内容减1,结果传送给f本身(d=1)或W寄存器(d=0),如果

结果为0则跳过下一条指令;否则顺序执行。

③ 子程序调用指令

        句法:     CALL k     操作范围:  0<k<2047
        指令周期:  2          影响标志位:无
        操作内容:  PC+1→堆栈,k→PC(10~0) PCLATH(4,3)→PC(12,11)
        操作说明:将PC+1的值送入堆栈,然后将11位常数k值送入PC(10~0),同时将
    PCLATH的第4、3位送PC的第12、11位,从而将于程序入口地址送给PC。

④ 无条件跳转指令

        句法:     GOTO      k      操作范围:0<k<2047
        指令周期:  2                 影响标志位:无
        操作内容:k→PC(10~0),PCLATH(4,3)→PC(12,11)
        操作说明:将11位常数k值送入PC(10~0),同时将PCLATH的第4、3位送PC
    的第12、11位,从而将新的地址送给PC。

⑤ 子程序返回指令

        句法:RETURN     操作范围:无
        指令周期:2        影响标志位:无
        操作内容:TOS→PC
        操作说明:将栈顶(TOS)内容弹出送给PC。

⑥ 子程序带参数返回指令

        句法:     RETLW      k     操作范围:  0<k<255
        指令周期:  2                 影响标志位:无
        操作内容:TOS→PC,  k→W
        操作说明:将栈顶(TOS)内容弹出送给PC,且将立即数k送给W寄存器。

⑦ 中断服务子程序返回指令

        句法:RETFIE      操作范围:无
        指令周期:2        影响标志位:无
        操作内容:TOS→PC,1→GIE
        操作说明:将栈顶(TOS)内容弹出送给PC,且将全局中断使能位GIE置1,重新开
    启中断。

5.位操作指令

① 位清零指令

        句法:     BCF    f,b    操作范围:     0<f<127,0<b<7
        指令周期:  1             影响标志位:无
        操作内容:  0→f(b)
        操作说明:将寄存器f的第b位清零。

② 位置1指令

        句法:     BSF    f,b    操作范围:  0<f<127,0<b<7
        指令周期:  1             影响标志位:无
        操作内容:  1→f(b)
        操作说明:将寄存器f的第b位置1。

③ 位测试为0跳转指令

        句法:BTFSC  f,b      操作范围:  0<f<127,0<b<7
        指令周期:1或2        影响标志位:无
        操作内容:若f(b)=0,则PC+1→PC
        操作说明:若寄存器f的第b位为零,则跳过下一条指令;否则顺序执行。

④ 位测试为1跳转指令

        句法:    BTFSS  f,b  操作范围:  0<f<127,0<b<7
        指令周期:1或2        影响标志位:无
        操作内容:若f(b)=1,则PC+1→PC
        操作说明:若寄存器f的第b位为1,则跳过下一条指令;否则顺序执行。

6.清零指令

① 看门狗定时器清零指令

        句法:CLRWDT     操作范围:无
        指令周期:1        影响标志位:TO,PD
        操作内容:0→WDT,0→WDT预分频器,1→TO,1→PD
        操作说明:将WDT寄存器及其预分频器全部清零。

② 寄存器清零指令

        句法:CLRF     f      操作范围:  0<f<127
        指令周期:1            影响标志位:Z
        操作内容:0→f,1→Z
        操作说明:将寄存器f清零。

③ W寄存器清零指令

        句法:CLRW    f      操作范围:无
        指令周期:1            影响标志位:Z
        操作内容:0→W,1→Z
        操作说明:将寄存器W清零。

7.处理器控制指令

① 进入低功耗睡眠状态指令

        句法:SLEEP   操作范围:无
        指令周期:1    影响标志位:TO,PD
        操作内容:0→WDT,0→WDT预分频器,1→TO,0→PD
        操作说明:将WDT寄存器及其预分频器全部清零,掉电标志位PD清零,定时
        时间溢出标志位TO置1,芯片进入低功耗睡眠状态,芯片振荡器停止工作。

② 空操作指令

        句法:NOP     操作范围:无
        指令周期:1     影响标志位:Z
        操作内容:无
        操作说明:不产生任何操作,仅使PC加1,消耗一个指令周期。