PIC16系列指令集 |
一、字節(jié)操作指令(d=0時目標(biāo)寄存器為W;d=1時目標(biāo)寄存器為F) |
指令 | 指令名稱 | 指令操作說明 | 范例 |
ADDWF f,d | 寄存器加法指令 | W寄存器中的值和f寄存器中的值相加,結(jié)果存于目標(biāo)寄存器 | ADDWF FSR,0 ;W中的值加FSR的中的值 |
SUBWF f,d | 寄存器減法指令 | f寄存器中的值減去W寄存器中的值,運算存于目標(biāo)寄存中 | SUBWF REG1,1;REG1減去W中的值(結(jié)果為正C=1、Z=0;結(jié)果為零C=1,Z=0;結(jié)果為負(fù)時C=0、Z=0 |
INCF f,D | 寄存器加1指令 | f寄存器中的值遞增1,操作算存于目標(biāo)寄存中 | INCF CNT,1 ;CNT=0xFF(Z=0)時執(zhí)行后CNT=0x00(Z=1) |
DECF f,d | 寄存器減1指令 | f寄存器中的值遞減1,操作算存于目標(biāo)寄存中 | DECF CNT,1 ;CNT=0x01(Z=0)時執(zhí)行后CNT=0x00(Z=1) |
ANDWF f,d | 寄存器與指令 | W寄存器中的值和f寄存器中的值做AND運算,結(jié)果存于目標(biāo)寄存器中 | ANDWF FSR,1 ;W=0x17,FSR=0xC2時執(zhí)行后W=0x17,FSR=0x02(做運算時要把十六進(jìn)制轉(zhuǎn)成二進(jìn)制)(全真為真,有假為假) |
IORWF f,d | 寄存器或指令 | W寄存器中的值和f寄存器中的值做OR運算,結(jié)果存于目標(biāo)寄存器中 | IORWF RESULT,0;RESULT=0x13,W=0x91時執(zhí)行后RESUL=0x13,W=0x93(有真為真,全假為假) |
XORWF f,d | 寄存器異或指令 | W寄存器中的值和f寄存器中的值做XOR運算,結(jié)果存于目標(biāo)寄存器中 | XORWF REG,1;REG=0xAF,W=0xB5時執(zhí)行后REG=0x1A, W=0xB5(XOR兩個值不相同異或結(jié)果為真,反之,為假) |
COMF f,d | 寄存器取反指令 | f寄存器中的值做補碼運算后,運算結(jié)果存于目標(biāo)寄存器中 | COMF REG1,0;REG1=0x13時執(zhí)行后REG1=0x13,W=0xEC(CO運算時位補1,其它取反。 |
CLRF Clear f | 寄存器清零指今 | f寄存器中的值清0,Z標(biāo)志位值1 | XCLRF FLAG_REG ;FLAG_REG =0x5時執(zhí)行后FLAG_REG =0x00,Z=1 |
CLRW | W清零指令 | f寄存器中的值清0,Z標(biāo)志位值1 | CLRW ;W=0x1D時執(zhí)行后W=0x00,Z=1 |
MOVF f,d | f寄存器傳送指令 | 把f寄存器中的值存于目標(biāo)寄存器中,當(dāng)目標(biāo)寄存器也是f時,可以用來測試f內(nèi)容是否為零 | MOVF FSR,0 FSR=0x1A時執(zhí)行后W=0x1A |
MOVWF f | W寄存器傳送指令 | 把W寄存器中的值傳送到目標(biāo)寄存器f中 | MOVWF OPTION ;OPTION=0xFF,W=0xE5時執(zhí)行后OPTION=0xE5,W=0xE5 |
INCFSZ f,d | 寄存器加1,為零時跳指令 | f寄存器中值加1,結(jié)果存于目標(biāo)寄存器,結(jié)果為1執(zhí)行下一條指令,結(jié)果為0忽略并用NOP代替. | HERE INCFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER執(zhí)行后, CNT=CNT加1,當(dāng)CNT=0,PC=CONTINUE,當(dāng)CNT≠0時PC=HERE加1 |
DECFSZ f,d | 寄存器減1,為零時跳指令 | f寄存器中值減1,結(jié)果存于目標(biāo)寄存器,結(jié)果為1執(zhí)行下一條指令,結(jié)果為0忽略并用NOP代替. | HERE DECFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER執(zhí)行后, CNT=CNT減1,當(dāng)CNT=0,PC=CONTINUE,當(dāng)CNT≠0時PC=HERE減1 |
RLF f,d | 帶進(jìn)位左移指令 | C位放在f值的MSB之前當(dāng)作9位,然后每個位向左移,C位移到0,結(jié)果存于目標(biāo)寄儲器 | RLF REG1,0;REG1=1110 0110,C=0時執(zhí)行后 REG1=1110 0110,W=11001100,C=1 |
RRF f,d | 帶進(jìn)位左移指令 | C位放在f值的MSB之前當(dāng)作9位,然后每個位向左移,0位移到C,結(jié)果存于目標(biāo)寄儲器 | RRF REG1,0;REG1=1110 0110,C=0時執(zhí)行后 REG1=1110 0110,W=0111 0011,C=0 |
SWAPF f,d | 寄存器交換指令 | F寄存器中的上半字節(jié)與下半字節(jié)內(nèi)容調(diào)換,運算結(jié)果存于目標(biāo)寄存器 | SWAPF REG,0;REG=0x1F時執(zhí)行后REG=0x1F,W=0xF1 |
二、位操作指令 |
指令 | 指令名稱 | 指令操作說明 | 范例 |
BCF f,b | 位清0指令 | f寄存器中位b清0 | BCF REG,7;REG=0xF1時執(zhí)行后REG=0xF1,W=71 |
BSF f,b | 位置1指令 | f寄存器中位b置1 | BSF REG,7;REG=0x04K時執(zhí)行后REG=0x84 |
BTFSC f,b | 位測試,為0則跳指令 | 查f寄存器b位,為1時執(zhí)行下一條,為0時跳過下一條并執(zhí)行NOP代替 | HERE BTFSC FLAG,1;FALSE GOTO PE;TRUE: ;PC=HERE時執(zhí)行后,當(dāng)FLAG=0時,PC=TRUE;當(dāng)FLAG=1,PC=FALSE |
BTFSS f,b | 位測試,為1則跳指令 | 查f寄存器b位,為0時執(zhí)行下一條,為1時跳過下一條并執(zhí)行NOP代替 | HERE BTFSS FLAG,1;FALSE GOTO PE;TRUE: ;PC=HERE時執(zhí)行后,當(dāng)FLAG=1時,PC=TRUE;當(dāng)FLAG=0,PC=FALSE |
三、常數(shù)和控制操作類指令 |
指令 | 指令名稱 | 指令操作說明 | 范例 |
ADDLW k | 常數(shù)加法指令 | W寄存器中的值和k相加,結(jié)果存W寄存器中 | ADDLW 0xD1;W=0x11時執(zhí)行后W=0xE2 |
SUBLW k | 常數(shù)減法指令 | W寄存器中的值和k相減,結(jié)果存W寄存器中 | SUBLW 0xD1;W=0x11時執(zhí)行后W=0xC0 |
ANDLW k | 常數(shù)與指令 | W寄存器中的值和k做與運算,結(jié)果存W寄存器中 | ANDLW 0x5F;W=0xA3時執(zhí)行后W=0x03 |
IORLW k | 常數(shù)或指令 | W寄存器中的值和k做或運算,結(jié)果存W寄存器中 | IORLW 0x35;w=0x9A時執(zhí)行后W=0xBF |
XORLW k | 常數(shù)異或指令 | W寄存器中的值和k做異或運算,結(jié)果存W寄存器中 | XORLW 0xAF;W=0xB5時執(zhí)行后W=0x1A |
CLRWDT | 看門狗計數(shù)器清0令 | 復(fù)位看門狗定時器、WDT預(yù)分頻(清0),TO、PD位置1 | CLRWDT ;WDT Counter=?時執(zhí)行后WDT Counter=0x00,WDT Prescaler=0,TO=1,PD=1 |
MOVLW k | 常數(shù)傳送指令 | 把k值傳送到W寄存器中 | MOVLW 0x5A ;時執(zhí)行后W=0x5A |
CALL k | 子程序調(diào)用指令 | 首先將返回地址((PC)+1)壓棧保護(hù),再轉(zhuǎn)入所調(diào)用的子程序入口地址執(zhí)行 | HERE CALL THERE;PC=HERE時執(zhí)行后PC=THERE,TOS=HERE+1 |
GOTO k | 無條件跳轉(zhuǎn)指令 | 無條件跳轉(zhuǎn),11個位的k值放PC(10:0),PC(12:11)值從PCLATH(4:3) | GOTO HERE 執(zhí)行后PC=HERE |
RETURN | 子程序返回指令 | 從子程序中返回,堆棧頂端的值會存放PC中 | RETURN ;執(zhí)行后PC從子程序返回 |
RETLW k | 子程序帶參數(shù)返回指令 | W寄存器中會放入k值,堆棧中彈出值放入PC | CALL ABC;ABC:ADDWF PC;RETLW k1;RETLW k2…;W=0x07時執(zhí)行后W=K? |
RETFIE | 中斷服務(wù)子程序返回指令 | 從中斷程序中返回,堆棧頂?shù)闹禃嫒隤C中,全局中斷位置1 | RETFIE ;PC從中斷子程序返回,GIE=1 |
SLEEP | 睡眠指令 | 省電狀態(tài)清0超時位置1,看門狗、預(yù)分頻清0,振蕩器無輸出 | SLEEP |
NOP | 空操作指令 | 不做任何操作 | NOP |
| | | |