MicrochipPIC18家家家家族族族族指指指指令令令令集集集集PIC18系列家族指令集1PIC18系列家族指令快速索引指令指令说明影响旗号参考说明页数字字字字节节节节运运运运算算算算指指指指令令令令(BYTE-ORIENTEDFILEREGISTEROPERATIONS)ADDWFf,d,a将W与f做相加,并将结果放至W或f。C,DC,Z,OV,N7ADDWFCf,d,a将W与C做相加,并将结果放至W或f。C,DC,Z,OV,N10ANDWFf,d,a将W与f做AND运算,并将结果放至W或f。Z,N14CLRFf,a将f内的值都清为0。Z31COMFf,d,a将f内的值取补码,并将结果放至W或f。Z,N33CPFSEQf,a若f与W的值相等,则跳过下一个指令。无35CPFSGTf,a若f大于W,则跳过下一个指令。无36CPFSLTf,a若f小于W,则跳过下一个指令。无37DECFf,d,a将f内的值减1,并将结果放至W或f。C,DC,Z,OV,N40DECFSZf,d,a将f内的值减1,若为0则跳过下一个指令,并将结果放至W或f。无43DCFSNZf,d,a将f内的值减1,若不为0则跳过下一个指令,并将结果放至W或f。无45INCFf,d,a将f内的值加1,并将结果放至W或f。C,DC,Z,OV,N48INCFSZf,d,a将f内的值加1,若为0则跳过下一个指令,并将结果放至W或f。无51INFSNZf,d,a将f内的值加1,若不为0则跳过下一个指令,并将结果放至W或f。无53IORWFf,d,a将W与f做OR运算,并将结果放至W或f。Z,N57MOVFf,d,a将f内的值搬到W或f。Z,N61MOVFFdsf,f将sf内的资料搬到df中。无63MOVWFf,a将W内的值搬到f中。无66MULWFf,a将W与f做相乘。无68NEGFf,a将f内的值取2的补码。C,DC,Z,OV,N70RLCFf,d,a将f内的值与C一起做左移动作,并将结果放至W或f。C,Z,N80RLNCFf,d,a将f内的值做左移动作,并将结果放至W或f。Z,N82RRCFf,d,a将f内的值与C一起做右移动作,并将结果放至W或f。C,Z,N84RRNCFf,d,a将f内的值做右移动作,并将结果放至W或f。Z,N86SETFf,a将f内的值设为0xFF。无88SUBFWBf,d,a将W内的值减掉C及f,并将结果放至W或f。C,DC,Z,OV,N90SUBWFf,d,a将W内的值减掉f,并将结果放至W或f。C,DC,Z,OV,N94SUBWFBf,d,a将f内的值减掉W及C,并将结果放至W或f。C,DC,Z,OV,N96SWAPFf,d,a将f内的值高4位与低4位对调,并将结果放至W或f。无98TSTFSZf,a测试f内的值是否等于0,若为0则跳过下一个指令。无105XORWFf,d,a将W与f做XOR运算,并将结果放至W或f。Z,N108位位位位运运运运算算算算指指指指令令令令(BIT-ORIENTEDFILEREGISTEROPERATIONS)BCFf,b,a将f内某个位(Bit)设定为0。无17BSFf,b,a将f内某个位(Bit)设定为1。无24BTFSCf,b,a测试f内某个位(Bit)的值是否等于0,若为0则跳过下一个指令。无25BTFSSf,b,a测试f内某个位(Bit)的值是否等于1,若为1则跳过下一个指令。无26BTGf,d,a将f内某个位(Bit)做NOT运算。无27f表示缓存器。Note:b表示缓存器的第b个位。d表示资料存放的地方,d=0表示存放在W累加器;d=1表示存放在f缓存器。k表示8位常数。n表示程序内存的地址。a表示数据存放在那个内存位置,a=0表示放在目前的内存位置;a=1表示放在BSR缓存器内所指定的内存位置。PIC18系列家族指令集2PIC18系列家族指令快速索引(续)指令指令说明影响旗号参考说明页数程程程程序序序序流流流流程程程程控控控控制制制制指指指指令令令令(CONTROLOPERATIONS)BCn若C=1则跳到地址n去。无16BNn若N=1则跳到地址n去。无18BNCn若C=0则跳到地址n去。无19BNNn若N=0则跳到地址n去。无20BNOVn若OV=0则跳到地址n去。无21BNZn若Z=0则跳到地址n去。无22BOVn若OV=1则跳到地址n去。无28BRAn无条件跳到地址n去(1023n1024≤≤−)。无23BZn若Z=1则跳到地址n去。无29CALLn,s将下一个指令的PC值存到堆栈的最上层,并跳到地址n去(1048575n0≤≤)。无30CLRWDT将看门狗定时器清为0。无32DAW将W内的值做BCD调整。无38GOTOn无条件跳到地址n去(1048575n0≤≤)。无47NOP空指令。无72POP将堆栈最上层的值取出来。无73PUSH将下一个指令的PC值存到堆栈的最上层。无74RCALLn将下一个指令的PC值存到堆栈的最上层,并跳到地址n去(1023n1024≤≤−)。无75RESET利用软件将系统重置。无76RETFIEs由中断子程序返回主程序,并将堆栈最上层的值取出来放至PC中,而主程序由目前PC值开始执行。无77RETURNs由子程序返回主程序,并将堆栈最上层的值取出来放至PC中,而主程序由目前PC值开始执行。无79SLEEP进入睡眠状态。无89f表示缓存器。Note:b表示缓存器的第b个位。d表示资料存放的地方,d=0表示存放在W累加器;d=1表示存放在f缓存器。k表示8位常数。n表示程序内存的地址。a表示数据存放在那个内存位置,a=0表示放在目前的内存位置;a=1表示放在BSR缓存器内所指定的内存位置。PIC18系列家族指令集3PIC18系列家族指令快速索引(续)指令指令说明影响旗号参考说明页数立立立立即即即即常常常常数数数数寻寻寻寻址址址址(LITERALOPERATIONS)ADDLWk将常数k与W做相加。C,DC,Z,OV,N4ANDLWk将常数k与W做AND运算。Z,N12IORLWk将常数k与W做OR运算。Z,N55LFSRf,k将常数k(12-bit)搬到第f个FSR缓存器去(f=0~2)。无59MOVLBk将常数k搬到BSR缓存器去。无64MOVLWk将常数k搬到W去。无65MULLWk将常数k与W做乘法运算。无67RETLWk将堆栈最上层的值取出来放至PC中,并将W的值设为k(255k0≤≤),而主程序由目前PC值开始执行。无78SUBLWk将常数k与W做减法。C,DC,Z,OV,N92XORLWk将常数k与W做XOR运算。Z,N106程程程程序序序序内内内内存存存存读读读读写写写写指指指指令令令令(DATAMEMORY-PROGRAMMEMORYOPERATIONS)TBLRD*以TBLPTRH与TBLPTRL记录器之内容为地址指针,读取程序内存之内容至TABLAT缓存器中。无99TBLRD*+以TBLPTRH与TBLPTRL记录器之内容为地址指针,读取程序内存之内容至TABLAT缓存器中,然后将地址指针自动加1。无99TBLRD*-以TBLPTRH与TBLPTRL记录器之内容为地址指针,读取程序内存之内容至TABLAT缓存器中,然后将地址指针自动减1。无99TBLRD+*先将TBLPTRH与TBLPTRL记录器先加1,然后以TBLPTRH与TBLPTRL记录器之内容为地址指针,读取程序内存之内容至TABLAT缓存器中。无99TBLWT*以TBLPTRH与TBLPTRL记录器之内容为地址指针,将TABLAT缓存器内的值写入程序内存中。无102TBLWT*+以TBLPTRH与TBLPTRL记录器之内容为地址指针,将TABLAT缓存器内的值写入程序内存中,然后将地址指针自动加1。无102TBLWT*-以TBLPTRH与TBLPTRL记录器之内容为地址指针,将TABLAT缓存器内的值写入程序内存中,然后将地址指针自动减1。无102TBLWT+*先将TBLPTRH与TBLPTRL记录器先加1,然后以TBLPTRH与TBLPTRL记录器之内容为地址指针,将TABLAT缓存器内的值写入程序内存中。无102f表示缓存器。Note:b表示缓存器的第b个位。d表示资料存放的地方,d=0表示存放在W累加器;d=1表示存放在f缓存器。k表示8位常数。n表示程序内存的地址。a表示数据存放在那个内存位置,a=0表示放在目前的内存位置;a=1表示放在BSR缓存器内所指定的内存位置。PIC18系列家族指令集4指令名称:ADDLW原意:ADDliteraltoW语法:[label]ADDLWk运算元:255k0≤≤运算说明:(W)+K-W影响旗标:N,OV,C,DC,Z指令说明:W累加器中的值与k值相加,并将运算结果放回W累加器中。类别:立即常数寻址法。组别:数学运算加法指令。范例一:ADDLW0x11;将0x11的值与W累加器相加,结果放回W累加器中。执行前:W=0x1F;假设执行前W累加器的值为0x1F。N=OV=C=DC=Z=0;假设执行前状态缓存器的值皆为0。执行后:W=0x30;执行后W累加器的值为0x30。N=OV=C=0,DC=1;半进位旗标等于1,因为低四位相加之后有进位的情形发生,因此半进位旗标DC等于1其余旗标状态不变。PIC18系列家族指令集5范例二:ADDLW0x11;将0x11的值与W累加器相加,结果放回W累加器中。执行前:W=0x7F;假设执行前W累加器的值为0x7F。N=OV=C=DC=Z=0;假设执行前状态缓存器的值皆为0。执行后:W=0x90;执行后W累加器的值为0x90。N=OV=DC=1,Z=C=0;半进位旗标DC等于1,因为低四位相加后有进位情形发生;溢位旗标OV等于1,因为两数相加后第7个位有进位情形发生;负号旗标N等于1,因为两数相加后结果大于127,因为使用2的补码作运算,所以结果大于127便算是负号。范例三:ADDLW0x11;将0x11的值与W累加器相加,结果放回W累加器中。执行前:W=0x9F;假设执行前W累加器的值为0x9F。N=OV=C=DC=Z=0;假设执行前状态缓存器的值皆为0。执行后:W=0xB0;执行后W累加器的值为0xB0。N=DC=1,OV=Z=C=0;半进位旗标DC等于1,因为低四位相加后有进位情形发生;负号旗标N等于1,因为使用2的补码作运算,因此两数相加后结果大于127,N等于1。范PIC18系列家族指令集6例二与范例三之不同是在于范例二在相加前第七个位为0,相加后第七个位为1,因此溢位旗标OV等于1(根据Microchip的定义),而范例三不同的是在相加前第七个位为1,相加后第七个位为1,因此溢位旗标OV不变,依然是等于0。范例四:ADDLW0x01;将0x01的值与W累加器相加,结果放回W累加器中。执行前:W=0xFF;假设执行前W累加器的值为0xFF。N=OV=C=DC=Z=0;假设执行前状态缓存器的值皆为0。执行后:W=0x00;执行后W累加器的值为0x00,因为累加器为8bits的缓存器,因此相加后结果超过255(0xFF)便会归0。N=OV=0,C=DC=Z=1;由于两数相加后结果超过255(0xFF),因此进位旗标C会被设定为1;又相加后W累加器的值为0x00,因此零位旗标Z会被设定为1;又由于低四位相加后有进位情形发生,因此半进位旗标DC被设定为1。PIC18系列家族指令集7指令名称:ADDWF原意:ADDWtof语法:[label]ADDWFf,d,a运算元:255f0≤≤]1,0[d∈]1,0[a∈运算说明:(W)+(f)-dest影响旗标:N,OV,C,DC,Z指令说明:W累加器中的值与f缓存器中的值相加,并将运算结果放回’d’所指定的缓存器中。若d=0,则运算后的结果放到W累加器中;若d=1,则运算后的结果放到f缓存器中,存放运算结果的缓存器若是存放到W累加器中,我们也可以写成W(表W累加器);若存放运算结果的缓存器若是存放到缓存器中,