PIC16系列指令集 |
一、字节操作指令(d=0时目标寄存器为W;d=1时目标寄存器为F) |
指令 | 指令名称 | 指令操作说明 | 范例 |
ADDWF f,d | 寄存器加法指令 | W寄存器中的值和f寄存器中的值相加,结果存于目标寄存器 | ADDWF FSR,0 ;W中的值加FSR的中的值 |
SUBWF f,d | 寄存器减法指令 | f寄存器中的值减去W寄存器中的值,运算存于目标寄存中 | SUBWF REG1,1;REG1减去W中的值(结果为正C=1、Z=0;结果为零C=1,Z=0;结果为负时C=0、Z=0 |
INCF f,D | 寄存器加1指令 | f寄存器中的值递增1,操作算存于目标寄存中 | INCF CNT,1 ;CNT=0xFF(Z=0)时执行后CNT=0x00(Z=1) |
DECF f,d | 寄存器减1指令 | f寄存器中的值递减1,操作算存于目标寄存中 | DECF CNT,1 ;CNT=0x01(Z=0)时执行后CNT=0x00(Z=1) |
ANDWF f,d | 寄存器与指令 | W寄存器中的值和f寄存器中的值做AND运算,结果存于目标寄存器中 | ANDWF FSR,1 ;W=0x17,FSR=0xC2时执行后W=0x17,FSR=0x02(做运算时要把十六进制转成二进制)(全真为真,有假为假) |
IORWF f,d | 寄存器或指令 | W寄存器中的值和f寄存器中的值做OR运算,结果存于目标寄存器中 | IORWF RESULT,0;RESULT=0x13,W=0x91时执行后RESUL=0x13,W=0x93(有真为真,全假为假) |
XORWF f,d | 寄存器异或指令 | W寄存器中的值和f寄存器中的值做XOR运算,结果存于目标寄存器中 | XORWF REG,1;REG=0xAF,W=0xB5时执行后REG=0x1A, W=0xB5(XOR两个值不相同异或结果为真,反之,为假) |
COMF f,d | 寄存器取反指令 | f寄存器中的值做补码运算后,运算结果存于目标寄存器中 | COMF REG1,0;REG1=0x13时执行后REG1=0x13,W=0xEC(CO运算时位补1,其它取反。 |
CLRF Clear f | 寄存器清零指今 | f寄存器中的值清0,Z标志位值1 | XCLRF FLAG_REG ;FLAG_REG =0x5时执行后FLAG_REG =0x00,Z=1 |
CLRW | W清零指令 | f寄存器中的值清0,Z标志位值1 | CLRW ;W=0x1D时执行后W=0x00,Z=1 |
MOVF f,d | f寄存器传送指令 | 把f寄存器中的值存于目标寄存器中,当目标寄存器也是f时,可以用来测试f内容是否为零 | MOVF FSR,0 FSR=0x1A时执行后W=0x1A |
MOVWF f | W寄存器传送指令 | 把W寄存器中的值传送到目标寄存器f中 | MOVWF OPTION ;OPTION=0xFF,W=0xE5时执行后OPTION=0xE5,W=0xE5 |
INCFSZ f,d | 寄存器加1,为零时跳指令 | f寄存器中值加1,结果存于目标寄存器,结果为1执行下一条指令,结果为0忽略并用NOP代替. | HERE INCFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER执行后, CNT=CNT加1,当CNT=0,PC=CONTINUE,当CNT≠0时PC=HERE加1 |
DECFSZ f,d | 寄存器减1,为零时跳指令 | f寄存器中值减1,结果存于目标寄存器,结果为1执行下一条指令,结果为0忽略并用NOP代替. | HERE DECFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER执行后, CNT=CNT减1,当CNT=0,PC=CONTINUE,当CNT≠0时PC=HERE减1 |
RLF f,d | 带进位左移指令 | C位放在f值的MSB之前当作9位,然后每个位向左移,C位移到0,结果存于目标寄储器 | RLF REG1,0;REG1=1110 0110,C=0时执行后 REG1=1110 0110,W=11001100,C=1 |
RRF f,d | 带进位左移指令 | C位放在f值的MSB之前当作9位,然后每个位向左移,0位移到C,结果存于目标寄储器 | RRF REG1,0;REG1=1110 0110,C=0时执行后 REG1=1110 0110,W=0111 0011,C=0 |
SWAPF f,d | 寄存器交换指令 | F寄存器中的上半字节与下半字节内容调换,运算结果存于目标寄存器 | SWAPF REG,0;REG=0x1F时执行后REG=0x1F,W=0xF1 |
二、位操作指令 |
指令 | 指令名称 | 指令操作说明 | 范例 |
BCF f,b | 位清0指令 | f寄存器中位b清0 | BCF REG,7;REG=0xF1时执行后REG=0xF1,W=71 |
BSF f,b | 位置1指令 | f寄存器中位b置1 | BSF REG,7;REG=0x04K时执行后REG=0x84 |
BTFSC f,b | 位测试,为0则跳指令 | 查f寄存器b位,为1时执行下一条,为0时跳过下一条并执行NOP代替 | HERE BTFSC FLAG,1;FALSE GOTO PE;TRUE: ;PC=HERE时执行后,当FLAG=0时,PC=TRUE;当FLAG=1,PC=FALSE |
BTFSS f,b | 位测试,为1则跳指令 | 查f寄存器b位,为0时执行下一条,为1时跳过下一条并执行NOP代替 | HERE BTFSS FLAG,1;FALSE GOTO PE;TRUE: ;PC=HERE时执行后,当FLAG=1时,PC=TRUE;当FLAG=0,PC=FALSE |
三、常数和控制操作类指令 |
指令 | 指令名称 | 指令操作说明 | 范例 |
ADDLW k | 常数加法指令 | W寄存器中的值和k相加,结果存W寄存器中 | ADDLW 0xD1;W=0x11时执行后W=0xE2 |
SUBLW k | 常数减法指令 | W寄存器中的值和k相减,结果存W寄存器中 | SUBLW 0xD1;W=0x11时执行后W=0xC0 |
ANDLW k | 常数与指令 | W寄存器中的值和k做与运算,结果存W寄存器中 | ANDLW 0x5F;W=0xA3时执行后W=0x03 |
IORLW k | 常数或指令 | W寄存器中的值和k做或运算,结果存W寄存器中 | IORLW 0x35;w=0x9A时执行后W=0xBF |
XORLW k | 常数异或指令 | W寄存器中的值和k做异或运算,结果存W寄存器中 | XORLW 0xAF;W=0xB5时执行后W=0x1A |
CLRWDT | 看门狗计数器清0令 | 复位看门狗定时器、WDT预分频(清0),TO、PD位置1 | CLRWDT ;WDT Counter=?时执行后WDT Counter=0x00,WDT Prescaler=0,TO=1,PD=1 |
MOVLW k | 常数传送指令 | 把k值传送到W寄存器中 | MOVLW 0x5A ;时执行后W=0x5A |
CALL k | 子程序调用指令 | 首先将返回地址((PC)+1)压栈保护,再转入所调用的子程序入口地址执行 | HERE CALL THERE;PC=HERE时执行后PC=THERE,TOS=HERE+1 |
GOTO k | 无条件跳转指令 | 无条件跳转,11个位的k值放PC(10:0),PC(12:11)值从PCLATH(4:3) | GOTO HERE 执行后PC=HERE |
RETURN | 子程序返回指令 | 从子程序中返回,堆栈顶端的值会存放PC中 | RETURN ;执行后PC从子程序返回 |
RETLW k | 子程序带参数返回指令 | W寄存器中会放入k值,堆栈中弹出值放入PC | CALL ABC;ABC:ADDWF PC;RETLW k1;RETLW k2…;W=0x07时执行后W=K? |
RETFIE | 中断服务子程序返回指令 | 从中断程序中返回,堆栈顶的值会存入PC中,全局中断位置1 | RETFIE ;PC从中断子程序返回,GIE=1 |
SLEEP | 睡眠指令 | 省电状态清0超时位置1,看门狗、预分频清0,振荡器无输出 | SLEEP |
NOP | 空操作指令 | 不做任何操作 | NOP |
| | | |