Habiendo escogido los diseñadores de PIC la filosofía RISC, su juego de instrucciones es reducido (33 instrucciones en la gama baja), siendo éstas, además, sencillas y rápidas, puesto que casi todas se ejecutan en un único ciclo de máquina (equivalente a 4 del reloj principal). Sus operandos son de gran flexibilidad, pudiendo actuar cualquier objeto como fuente y como destino.
Posee tres tipos bien diferenciados de direccionamiento, estos son:
1º Inmediato: El valor del dato está incluido en el propio código OP, junto a la instrucción.
2º Directo: La dirección del dato está incluido en el propio código OP, junto a la instrucción.
3º Indirecto: La dirección de la memoria de datos que guarda el operando está contenida en un registro.
Nosotros nos centraremos en la gama media, que tiene 35 instrucciones. La mayoría son idénticas a las de la gama baja, si bien las diferencias serán convenientemente explicadas.
Ante todo es conveniente que usted tenga clara la estructura interna del micro, puesto que las instrucciones la referencian, y puesto que en cualquier micro la comprensión de la nomenclatura de sus componentes es esencial. De este modo hemos creado la siguiente tabla para ayudarle a comprender las abreviaturas:
Abreviatura Descripción |
|
|
PC
TOS
WDT
W
F
D
Dest
TO
PD
b
k
x
label
[] () ® <> Î
Z
C
DC
Itálicas
|
Contador de Programa que direcciona la memoria de instrucciones. Tiene un tamaño de 11 bits en la gama baja, de los cuales los 8 de menos peso configuran el registro PCL que ocupa el registro 0x02 del área de datos. Cima de la pila, con 2 niveles en la gama baja y 8 en la media Perro guardián (Watchdog) Registro W, similar al acumulador Suele ser un campo de 5 bits (fffff) que contiene la dirección del banco de registros, que ocupa el banco 0 del área de datos. Direcciona uno de esos registros.
Bit del código OP de la instrucción, que selecciona el destino. Si d=0, el destino es W, y si d=1 el destino es f. Destino (registro W o f) Bit “Time Out” del registro de estado Bit “Power Down” del registro de estado Suele ser un campo de 3 bits (bbb) que determinan la posición de un bit dentro de un registro de 8 bits Se trata, normalmente, de un campo de 8 bits (kkkkkkkk) que representa un dato inmediato. También puede constar de 9 bits en las instrucciones de salto que cargan al PC Valor indeterminado (puede ser un 0 o un 1). Para mantener la compatibilidad con las herramientas software de Microchip conviene hacer x = 0 Nombre de la etiqueta Opciones Contenido Se asigna a Campo de bits de un registro Pertenece al conjunto Señalizador de cero en W. Pertenece al registro de estado Señalizador de acarreo en el octavo bit del W. Pertenece al registro de estado Señaliza el acarreo en el 4 bit del W. Pertenece al registro de estado Términos definidos por el usuario
|
Sintaxis:
[label]
ADDLW k
Operandos:
0
£
k
£
255
Operación: :
(W) + (k)Þ (W)
Flags afectados:
C, DC, Z
Código OP:
11 111x kkkk kkkk
Descripción:
Suma el contenido del registro W y k, guardando el
resultado en W.
Ejemplo:
ADDLW 0xC2
Antes: W =
0x17
Después: W = 0xD9
Sintaxis:
[label]
ADDWF f,d
Operandos:
d
Î
[0,1], 0
£
f
£ 127
Operación:
(W) + (f)
Þ (dest)
Flags afectados:
C, DC, Z
Código OP:
00
0111 dfff
ffff
Descripción:
Suma el contenido del registro W y el registro f. Si d es
0, el resultado se almacena en W, si d es 1 se almacena en f.
Ejemplo:
ADDWF REG,0
Antes: W =
0x17., REG = 0xC2
Después: W =
0xD9, REG = 0xC2
Sintaxis:
[label]
ANDLW k
Operandos:
0
£
k
£
255
Operación: :
(W) AND (k)Þ (W)
Flags afectados:
Z
Código OP:
11 1001 kkkk kkkk
Descripción:
Realiza la operación lógica AND entre
el contenido del registro W y k, guardando el resultado en W.
Ejemplo:
ADDLW 0xC2
Antes: W =
0x17
Después: W = 0xD9
ANDWF
W AND F
Sintaxis:
[label]
ANDWF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
(W) AND (f)
Þ
(dest)
Flags afectados:
Z
Código OP:
00 0101
dfff ffff
Descripción:
Realiza la operación lógica AND entre los registros
W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en
f.
Ejemplo: :
ANDWF REG,0
Antes: W =
0x17., REG = 0xC2
Después: W
= 0x17, REG = 0x02 |
BCF
Borra un bit
Sintaxis:
[label] BCF
f,b
Operandos:
0
£
f
£
127, 0
£
b
£
7
Operación: :
0
Þ
(f<b>)
Flags afectados:
Ninguno
Código OP:
01 00bb bfff
ffff
Descripción:
Borra el bit b del registro f
Ejemplo: :
BCF REG,7
Antes: REG
= 0xC7
Después:
REG = 0x47 |
BSF Activa
un bit
Sintaxis:
[label] BSF f,b
Operandos:
0
£
f
£
127, , 0
£
b
£
7
Operación:
1
Þ
(f<b>)
Flags afectados:
Ninguno
Código OP:
01 01bb
bfff ffff
Descripción:
Activa el bit b del registro f
Ejemplo: :
BSF REG,7
Antes: REG
= 0x0A
Después:
REG = 0x8A |
![]()
BTFSC Test
de bit y salto
Sintaxis:
[label]
BTFSC f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
Salto si
(f<b>) = 0
Flags afectados:
Ninguno
Código OP:
01 10bb
bfff ffff
Descripción:
Si el bit b del registro f es 0, se salta una
instrucción y se continúa con la ejecución. En caso de salto, ocupará dos
ciclos de reloj.
Ejemplo:
BTFSC REG,6
GOTO NO_ES_0
SI_ES_0 Instrucción
NO_ES_0 Instrucción |
BTFSS Test
de bit y salto
Sintaxis:
[label]
BTFSS f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
Salto si
(f<b>) = 1
Flags afectados:
Ninguno
Código OP:
01 11bb
bfff ffff
Descripción:
Si el bit b del registro f es 1, se salta una
instrucción y se continúa con la ejecución. En caso de salto, ocupará dos
ciclos de reloj.
Ejemplo:
BTFSS REG,6
GOTO NO_ES_0
SI_ES_0 Instrucción
NO_ES_0 Instrucción |
CALL
Salto a subrutina
Sintaxis:
[label]
CALL k
Operandos:
0
£
k
£
2047
Operación:
PC
Þ
Pila; k
Þ
PC
Flags afectados:
Ninguno
Código OP:
10 0kkk
kkkk kkkk
Descripción:
Salto a una subrutina. La parte baja de k se carga
en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj.
Ejemplo:ORIGEN
CALL DESTINO
Antes:
PC = ORIGEN
Después:
PC = DESTINO |

CLRF
Borra un registro
Sintaxis:
[label] CLRF
f
Operandos:
0
£
f
£
127
Operación: :
0x00
Þ
(f), 1
Þ
Z
Flags afectados:
Z
Código OP:
00 0001 1fff
ffff
Descripción:
El registro f se carga con 0x00. El flag Z se
activa.
Ejemplo: :
CLRF REG
Antes: REG
= 0x5A
Después:
REG = 0x00, Z = 1 |
CLRW Borra el registro W
Sintaxis: [label] CLRW
Operandos: Ninguno
Operación: : 0x00 Þ W, 1 Þ Z
Flags afectados: Z
Código OP: 00 0001 0xxx xxxx
Descripción: El registro de trabajo W se carga con 0x00. El flag Z se
activa.
Ejemplo: : CLRW
Antes: W =
0x5A
Después: W = 0x00, Z = 1
|
CLRWDT
Borra el WDT
Sintaxis:
[label]
CLRWDT
Operandos:
Ninguno
Operación:
0x00
Þ
WDT, 1
Þ
/TO
1
Þ
/PD
Flags afectados:
/TO, /PD
Código OP:
00 0000
0110 0100 Descripción: Esta instrucción borra tanto el WDT como su preescaler. Los bits /TO y /PD del registro de estado se ponen a 1.
Ejemplo: :
CLRWDT
Después:
Contador WDT = 0,
Preescales WDT = 0,
/TO = 1, /PD = 1 |
COMF
Complemento de f
Sintaxis:
[label] COMF
f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación: :
(/ f), 1
Þ
(dest)
Flags afectados:
Z
Código OP:
00 1001 dfff
ffff
Descripción:
El registro f es complementado. El flag Z se activa
si el resultado es 0. Si d es 0, el resultado se almacena en W, si d es 1
se almacena en f..
Ejemplo: :
COMF REG,0
Antes: REG
= 0x13
Después:
REG = 0x13, W = 0XEC |
DECF
Decremento de f
Sintaxis:
[label] DECF
f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación: :
(f ) – 1
Þ
(dest)
Flags afectados:
Z
Código OP:
00 0011 dfff
ffff
Descripción:
Decrementa en 1 el contenido de f. Si d es 0, el
resultado se almacena en W, si d es 1 se almacena en f.
Ejemplo: :
DECF CONT,1
Antes:
CONT = 0x01, Z = 0
Después:
CONT = 0x00, Z = 1 |
DECFSZ Decremento y salto
Sintaxis:
[label]
DECFSZ f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
(f) -1
Þ
d; Salto si R=0
Flags afectados:
Ninguno
Código OP:
00 1011
dfff ffff
Descripción:
Decrementa el contenido del registro f. Si d es 0,
el resultado se almacena en W, si d es 1 se almacena en f. Si la resta es
0 salta la siguiente instrucción, en cuyo caso costaría 2 ciclos.
Ejemplo:
DECFSC REG,0
GOTO NO_ES_0
SI_ES_0 Instrucción
NO_ES_0
Salta instrucción anterior
|
GOTO Salto
incondicional
Sintaxis:
[label]
GOTO k
Operandos:
0
£
k
£
2047
Operación:
k
Þ
PC <8:0>
Flags afectados:
Ninguno
Código OP:
10 1kkk
kkkk kkkk
Descripción:
Se trata de un salto incondicional. La parte baja de
k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj.
Ejemplo:
ORIGEN GOTO DESTINO
Antes: PC
= ORIGEN
Después:
PC = DESTINO |
INCF
Decremento de f
Sintaxis:
[label] INCF
f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación: :
(f ) + 1
Þ
(dest)
Flags afectados:
Z
Código OP:
00 1010 dfff
ffff
Descripción:
Incrementa en 1 el contenido de f. Si d es 0, el
resultado se almacena en W, si d es 1 se almacena en f.
Ejemplo: :
INCF CONT,1
Antes:
CONT = 0xFF, Z = 0
Después:
CONT = 0x00, Z = 1 |
INCFSZ Incremento y salto
Sintaxis:
[label]
INCFSZ f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
(f) -1
Þ
d; Salto si R=0
Flags afectados:
Ninguno
Código OP:
00 1111
dfff ffff
Descripción:
Incrementa el contenido del registro f. Si d es 0,
el resultado se almacena en W, si d es 1 se almacena en f. Si la resta es
0 salta la siguiente instrucción, en cuyo caso costaría 2 ciclos.
Ejemplo:
INCFSC REG,0
GOTO NO_ES_0
SI_ES_0 Instrucción
NO_ES_0
Salta instrucción anterior |
IORLW W OR
literal
Sintaxis:
[label]
IORLW k
Operandos:
0
£
k
£
255
Operación: :
(W) OR (k)Þ
(W)
Flags afectados:
Z
Código OP:
11 1000 kkkk kkkk
Descripción:
Se realiza la operación lógica OR entre
el contenido del registro W y k, guardando el resultado en W.
Ejemplo: :
IORLW 0x35
Antes: W =
0x9A
Después: W
= 0xBF |
IORWF
W AND F
Sintaxis:
[label]
IORWF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
(W) OR (f)
Þ
(dest)
Flags afectados:
Z
Código OP:
00 0100
dfff ffff
Descripción:
Realiza la operación lógica OR entre los registros W
y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Ejemplo: :
IORWF REG,0
Antes: W =
0x91, REG = 0x13
Después: W
= 0x93, REG = 0x13
|
MOVLW Cargar
literal en W
Sintaxis:
[label]
MOVLW f
Operandos:
0
£
f
£
255
Operación:
(k)
Þ
(W)
Flags afectados:
Ninguno
Código OP:
11 00xx
kkkk kkkk
Descripción:
El literal k pasa al registro W.
Ejemplo:
MOVLW 0x5A
Después:
REG = 0x4F, W = 0x5A |
MOVF
Mover a f
Sintaxis:
[label]
MOVF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
(f)
Þ
(dest)
Flags afectados:
Z
Código OP:
00 1000
dfff ffff
Descripción:
El contenido del registro f se mueve al destino d.
Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.
Permite verificar el registro, puesto que afecta a Z.
Ejemplo:
MOVF REG,0
Después: W = REG |
MOVWF
Mover a f
Sintaxis:
[label]
MOVWF f
Operandos:
0
£
f
£
127
Operación:
W
Þ
(f)
Flags afectados:
Ninguno
Código OP:
00 0000
1fff ffff
Descripción:
El contenido del registro W pasa el registro f.
Ejemplo:
MOVWF REG,0
Antes: REG = 0xFF, W = 0x4F
Después: REG = 0x4F, W = 0x4F |
NOP
No operar
Sintaxis:
[label] NOP
Operandos:
Ninguno
Operación:
No operar
Flags afectados:
Ninguno
Código OP:
00 0000
0xx0 0000
Descripción:
No realiza operación alguna. En realidad consume un
ciclo de instrucción sin hacer nada.
Ejemplo: :
CLRWDT
Después:
Contador WDT = 0,
Preescales WDT = 0,
/TO = 1, /PD = 1 |
RETFIE Retorno de
interrup.
Sintaxis:
[label]
RETFIE
Operandos:
Ninguno
Operación: :
1
Þ
GIE; TOSÞPC
Flags afectados:
Ninguno
Código OP:
00 0000 0000
1001
Descripción:
El PC se carga con el contenido de la cima de la
pila (TOS): dirección de retorno. Consume 2 ciclos. Las interrupciones
vuelven a ser habilitadas.
Ejemplo: :
RETFIE
Después:
PC = dirección de retorno
GIE = 1 |
RETLW
Retorno, carga W
Sintaxis:
[label]
RETLW k
Operandos:
0
£
k
£
255
Operación: :
(k)Þ
(W); TOSÞPC
Flags afectados:
Ninguno
Código OP:
11 01xx kkkk kkkk
Descripción:
El registro W se carga con la constante k. El PC se
carga con el contenido de la cima de la pila (TOS): dirección de retorno.
Consume 2 ciclos.
Ejemplo: :
RETLW 0x37
Después:
PC = dirección de retorno
W = 0x37 |
RETURN Retorno de rutina
Sintaxis:
[label]
RETURN
Operandos:
Ninguno
Operación: :
TOS
Þ
PC
Flags afectados:
Ninguno
Código OP:
00 0000 0000
1000
Descripción:
El PC se carga con el contenido de la cima de la
pila (TOS): dirección de retorno. Consume 2 ciclos.
Ejemplo: :
RETURN
Después:
PC = dirección de retorno |
RLF Rota f
a la izquierda
Sintaxis:
[label]
RLF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
Rotación a la izquierda
Flags afectados:
C
Código OP:
00 1101
dfff ffff
Descripción:
El contenido de f se rota a la izquierda. El bit de
menos peso de f pasa al carry (C), y el carry se coloca en el de mayor
peso. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en
f.
Ejemplo:
RRF REG,0
Antes: REG
= 1110 0110, C = 0
Después:
REG = 1110 0110,
W =
1100 1100, C = 1 |
RRF Rota
f a la derecha
Sintaxis:
[label]
RRF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
Rotación a la derecha
Flags afectados:
C
Código OP:
00 1100
dfff ffff
Descripción:
El contenido de f se rota a la derecha. El bit de
menos peso de f pasa al carry (C), y el carry se coloca en el de mayor
peso. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en
f.
Ejemplo:
RRF REG,0
Antes: REG
= 1110 0110, C = 1
Después:
REG = 1110 0110,
W =
01110 0011, C = 0 |
SLEEP Modo bajo consumo
Sintaxis:
[label]
SLEEP
Operandos:
Ninguno
Operación:
0x00ÞWDT,
1
Þ
/ TO
0
Þ
WDT Preescaler, 0
Þ
/ PD
Flags afectados:
/ PD, / TO
Código OP:
00 0000
0110 0011
Descripción:
El bit de energía se pone a 0, y a 1 el de descanso.
El WDT y su preescaler se borran. El micro para el oscilador, llendo al
modo “durmiente”.
Ejemplo: :
SLEEP
Preescales WDT = 0,
/TO = 1, /PD = 1 |
SUBLW Resta
Literal - W
Sintaxis:
[label]
SUBLW k
Operandos:
0
£
k
£
255
Operación:
( k ) - (W)
Þ
(W)
Flags afectados:
Z, C, DC
Código OP:
11 110x
kkkk kkkk
Descripción:
Mediante el método del complemento a dos el
contenido de W es restado al literal. El resultado se almacena en W.
Ejemplos:
SUBLW 0x02
Antes:W=1,C=?. Después: W=1, C=1
Antes:W=2,C=?. Después: W=0, C=1
Antes:W=3,C=?.Después:W=FF,C=0
(El resultado es negativo) |
Sintaxis:
[label]
SUBWF f,d
Operandos:
d
Î
[0,1], 0
£ f
£ 127
Operación:
( f ) – (W )Þ (dest)
Flags afectados:
C, DC, Z
Código OP:
00
0010 dfff
ffff
Descripción:
Mediante el método del complemento a dos el contenido de W
es restado al de f. . Si d es 0, el resultado se almacena en W, si d es 1 se
almacena en f.
Ejemplos:
SUBWF REG,1
Antes: REG = 0x03, W = 0x02, C = ?
Después:REG=0x01, W = 0x4F, C=1
Antes: REG = 0x02, W = 0x02, C = ?
Después:REG=0x00, W =0x02, C= 1
Antes: REG= 0x01, W= 0x02, C= ?
Después:REG=0xFF, W=0x02, C= 0
(Resultado negativo)
SWAPF
Intercambio de f
Sintaxis:
[label]
SWAPF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación: :
(f <3: 0>)Û
(f <7:4>)
Flags afectados:
Ninguno
Código OP:
00 1110 dfff
ffff
Descripción:
Los 4 bits de más peso y los 4 de menos son
intercambiados. Si d es 0, el resultado se almacena en W, si d es 1 se
almacena en f.
Ejemplo: :
SWAPF REG,0
Antes: REG
= 0xA5
Después:
REG = 0xA5, W = 0x5A |
XORLW W OR
literal
Sintaxis:
[label]
XORLW k
Operandos:
0
£
k
£
255
Operación: :
(W) XOR (k)Þ
(W)
Flags afectados:
Z
Código OP:
11 1010 kkkk kkkk
Descripción:
Se realiza la operación lógica XOR entre
el contenido del registro W y k, guardando el resultado en W.
Ejemplo: :
XORLW 0xAF
Antes: W =
0xB5
Después: W
= 0x1A |
XORWF
W AND F
Sintaxis:
[label]
XORWF f,d
Operandos:
d
Î
[0,1], 0
£
f
£
127
Operación:
(W) XOR (f)
Þ
(dest)
Flags afectados:
Z
Código OP:
00 0110
dfff ffff
Descripción:
Realiza la operación lógica XOR entre los registros
W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en
f.
Ejemplo: :
XORWF REG,0
Antes: W =
0xB5, REG = 0xAF
Después: W
= 0xB5, REG = 0x1A |

![]()
![]()
![]()
![]()
![]()
![]()
![]()
La gama baja carece
de 4 de las instrucciones de la gama media. Estas son ADDLW, RETFIE, RETURN y
SUBLW. En cambio, y puesto que los registros OPTION y TRIS no son accesibles, se
añaden las dos siguientes:
OPTION Carga del reg. option
Sintaxis:
[label] OPTION
Operandos:
Ninguno
Operación:
(W)
Þ
OPTION
Flags afectados:
Ninguno
Código OP:
0000
0000 0010
Descripción:
El contenido del registro W se carga en el registro
OPTION, registro de sólo lectura en el que se configura el funcionamiento
del preescaler y el TMR0.
Ejemplo: :
OPTION
Antes:
W= 0x06, OPTION = 0x37
Después: W=
0x06, OPTION = 0x06 |
TRIS Carga
del registro TRIS
Sintaxis:
[label] TRIS
f
Operandos:
5
£
f
£
7
Operación:
(W)Þ
Registro TRIF<f>
Flags afectados:
Ninguno
Código OP:
0000
0000 0fff
Descripción:
El contenido del registro W se carga en el registro
TRISA, TRISB o TRISC, según el valor de f. Estos registros de sólo lectura
configuran las patillas de un puerto como de entrada o salida.
Ejemplo: :
TRIS
PORTA
Antes:
W=0xA5, TRISA=0x56
Después: W=0xA5, TRISA=0xA5 |

Observe que el código OP de las instrucciones de la gama baja sólo ocupan 12 bits, no correspondiéndose, por tanto, con el de la gama media.
Otras diferencias fundamentales entre ambas gamas son, por ejemplo, que en la baja el vector de reset (la primera línea que se ejecuta tras un reset) es la última de la memoria correspondiente, mientras que en la media es la 0x00. El vector de interrupción (situado en la 0x04) no existe en la gama baja.
En la gama baja se necesita emplear los bits PA2-PA0 como parte alta de la dirección de programa en las instrucciones CALL y GOTO.
Las páginas de la gama baja son más pequeñas, y se deben revisar todas las escrituras de los registros OPTION, ESTADO y FSR en la conversión del código.
Por tanto, fácilmente comprobamos que el código entre ambas gamas no es 100% compatible.