Vous êtes sur la page 1sur 43

Repertorio 35 instrucciones

Las 35 instrucciones mnemnicos de la gama media de Microchip las encontraremos


resumidas en la siguiente tabla. w es el acumulador, f representa un registro cualquiera
y C, DC, Zlos flags del registro STATUS.
Instrucciones orientadas a registros
MNEMNICO
OPERANDOS

DESCRIPCIN

CDIGO OP

BANDERAS NCIC NOTAS

ADDWF f,d

w+fd

00 0111 dfff ffff C, DC, Z

1,2

ANDWF f,d

w AND f d

00 0101 dfff ffff Z

1,2

CLRF

00 h f

00 0001 1fff ffff Z

CLRW

00 h w

00 0001 0xxx xxxx Z

COMF

f,d

Complemento de f d

00 1001 dfff ffff Z

1,2

DECF

f,d

f-1d

00 0011 dfff ffff Z

1,2

DECFSZ f,d

f - 1 d (si es 0 salta)

00 1011 dfff ffff Ninguna

1(2)

1,2,3

INCF

f,d

f+1d

00 1010 dfff ffff Z

1,2

INCFSZ

f,d

f + 1 d (si es 0 salta)

00 1111 dfff ffff Ninguna

1(2)

1,2,3

IORWF

f,d

w OR f d

00 0100 dfff ffff Z

1,2

MOVF

f,d

fd

00 1000 dfff ffff Z

1,2

MOVWF f

wf

00 0000 1fff ffff Ninguna

NOP

No operacin

00 0000 0xx0 0000 Ninguna

RLF

f,d

Rota f izq por carry d

00 1101 dfff ffff C

1,2

RRF

f,d

Rota f dcha por carry d

00 1100 dfff ffff C

1,2

SUBWF

f,d

f-wd

00 0010 dfff ffff C,DC,Z

1,2

SWAPF

f,d

Intercambia nibbles de f d 00 1110 dfff ffff Ninguna

1,2

w XOR f d

1,2

XORWF f,d

00 0110 dfff ffff Z


Instrucciones orientadas a bit

MNEMNICO
OPERANDOS

DESCRIPCIN

CDIGO OP

BANDERAS NCIC NOTAS

BCF

f,b

Pone a 0 bit b de registro f 01 00bb bfff ffff Ninguna

1,2

BSF

f,b

Pone a 1 bit b de registro f 01 01bb bfff ffff Ninguna

1,2

BTFSC

f,b

Salto si bit b de reg.f es 0

01 10bb bfff ffff Ninguna

1(2)

BTFSS

f,b

Salto si bit b de reg.f es 1

01 11bb bfff ffff Ninguna

1(2)

Su amigable compaero el Barra Bas

Instrucciones con literales y de control


MNEMNICO
OPERANDOS

DESCRIPCIN

CDIGO OP

BANDERAS NCIC NOTAS

ADDLW

k w+kw

11 111x kkkk
kkkk

C,DC,Z

ANDLW

k w AND k w

11 1001 kkkk
kkkk

CALL

k Llamada a subrutina k

10 0kkk kkkk
kkkk

Ninguna

CLRWDT

00 0000 0110
0100

TO,PD

GOTO

k Ir a direccin k

10 1kkk kkkk
kkkk

Ninguna

IORLW

k w OR k w

11 1000 kkkk
kkkk

MOVLW

k kw

11 00xx kkkk
kkkk

Ninguna

RETFIE

00 0000 0000
1001

Ninguna

RETLW

k Retorno con k en w

11 01xx kkkk
kkkk

Ninguna

RETURN

Retorno de una subrutina

00 0000 0000
1000

Ninguna

SLEEP

Modo Standby

00 0000 0110
0011

TO, PD

SUBLW

k k-ww

11 110x kkkk
kkkk

C,DC,Z

XORLW

k w XOR k w

11 1010 kkkk
kkkk

Borra temporizador del WDT

Retorno de una interrupcin

Notas:
1. Al modificar un registro de E/S con una operacin sobre l mismo (por ejemplo
MOVF PORTB,1), el valor utilizado es el que se halle presente en las patillas del
PORTB. Por ejemplo, si el biestable tiene un "1" para una patilla configurada como
entrada y se pone a nivel bajo desde el exterior, el dato se volver a escribir como
"0".
2. Si se ejecuta esta instruccin sobre el TMR0 y d=1, se borrar el conteo de la
preescala asignada (preescaler), si est asignado al TMR0, pero no se borrar la
preescala asignada en OPTION_REG, que controla Timer0.
3. Si se modifica el Contador de Programa PC o una condicin de prueba es
verdadera, la instruccin requiere dos ciclos mquina. El segundo ciclo se ejecuta
como un NOP.
Su amigable compaero el Barra Bas

En las tablas siguientes, por orden alfabtico, veremos todos los datos de inters
sobre las 35 instrucciones.
Algunos son de poca importancia. En cambio otros, como la operacin, la sintaxis, el
comportamiento del registro STATUS y los ejemplos, son imprescindibles para
comprender su funcionamiento.
Aparte de estas 35 instrucciones, hay otro tipo de instrucciones usadas para
simplificar la tarea de programar, y que generalmente estn formadas por dos
instrucciones bsicas. Estas no las trataremos a fondo, pero las veremos en un resumen
despus de comprender el funcionamiento de las 35 instrucciones bsicas.

ADDLW

ADDLW

ADD Literal to w
Operacin

w+kw

Sintaxis

[Etiqueta] ADDLW k

Operadores

0 < k < 255

Ciclos

OPCODE

11

Descripcin

Suma el contenido del registro w al literal k, y almacena el resultado


en w.Si se produce acerreo el flag C se pone a "1".

111x

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

kkkk

kkkk

C Se pone a 1 si se produce un Acarreo


desde el bit de mayor peso.
DC Se pone a 1 si se genera un Acarreo
del bit 3 al bit 4.
Z Se pone a 1 si el resultado de la
operacin es cero.

EJEMPLO:
ADDLW 0x15
Si antes de la instruccin:
w = 10h = 0001 0000 b
Al ejecutarse la instruccin
w = 10 h + 15 h = 25 h
w = 0001 0000 b + 0001 0101 b = 0010 0101 b
00010000b
00010101b
0010 0101 b

Su amigable compaero el Barra Bas

ADDWF

ADDWF

ADD w to F
Operacin

w+fd

Sintaxis

[Etiqueta] ADDWF f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

OPCODE

00

Descripcin

Suma el contenido del registro w al contenido del registro f, y almacena el


resultado en w si d = 0, y en el registro f si d = 1.

0111

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

dfff

ffff

C Se pone a 1 si se produce un Acarreo


desde el bit de mayor peso
DC Se pone a 1 si se genera un Acarreo
del bit 3 al bit 4.
Z Se pone a 1 si el resultado de la
operacin es cero

EJEMPLO:
ADDWF FSR,0
Si antes de la instruccin. w = 17 h y FSR = C2 h como d=0
Al ejecutarse:
w = 17 h + C2 h = D9 h
FSR = C2 h
00010111b
11000010b
1101 1001 b

ANDLW

ANDLW

AND Literal and w


Operacin

w AND k w

Sintaxis

[Etiqueta] ANDLW k

Operadores

0 < f < 255

Ciclos

OPCODE

11

1001

kkkk

Su amigable compaero el Barra Bas

kkkk

Efecta la operacin AND lgico entre el contenido del registro w y el


literal k, y almacena el resultado en w.
Esta instruccin realiza la operacin AND bit a bit.

Descripcin
Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z Se pone a 1 si el resultado de la
operacin es cero

EJEMPLO:
ANDLW 0x5F
Si antes de la instruccin. w = A3 h
Al ejecutarse:
w = 0101 1111 b AND 1010 0011 b = 0000 0011 b = 03 h
01011111b
10100011b
0000 0011 b

ANDWF

ANDWF

AND w with F
Operacin

w AND f d

Sintaxis

[Etiqueta] ANDWF f,d

Operadores

0< f <127
d [0,1]

Ciclos

OPCODE

00

Descripcin

Efecta la operacin AND lgico entre el contenido del registro w y el


contenido del registro f, y almacena el resultado en w si d = 0, y en f si d
= 1.
Esta instruccin realiza la operacin AND bit a bit.

0101

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

dfff

ffff

Z Se pone a 1 si el resultado de la
operacin es cero

EJEMPLO:
ANDWF FSR,1
Si antes de la instruccin. w = 17 h = 0001 0111 b y FSR = C2 h = 1100 0010 h
Al ejecutarse:
w = 17 h = 0001 0111 b
Su amigable compaero el Barra Bas

FSR = 0001 0111 b AND 1100 0010 b = 0000 0010 b = 02 h


00010111b
11000010b
0000 0010 b

BCF

BCF

Bit Clear F
Operacin

0 (f<b>)

Sintaxis

[Etiqueta] BCF f,b

Operadores

0< f <127
0<b<7

Ciclos

OPCODE

01

Descripcin

Pone a cero el bit nmero b del registro f.

00bb

bfff

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
BCF
FLAG_REG, 7
Si antes de la instruccin el registro:
FLAG_REG = C7 h = 1100 0111 b
Al ejecutarse la instruccin, el registro queda con el valor:
FLAG_REG = 47b = 0100 0111 b

BSF

BSF
Bit Set F
Operacin

1 (f<b>)

Sintaxis

[Etiqueta] BSF f,b

Operadores

0< f <127
0<b<7

Ciclos

1
Su amigable compaero el Barra Bas

11bb

OPCODE

01

Descripcin

Pone a 1 el bit b del registro f

bfff

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
BSF
FLAG_REG, 7
Si antes de la instruccin el registro tiene el valor:
FLAG_REG = 0A h = 0000 1010 b
Al ejecutarse la instruccin, el registro queda con el valor:
FLAG_REG = 8A h = 1000 1010 b

BTFSC

BTFSC

Bit Test, Skip if Clear


Operacin

Salta si (f<b>) = 0

Sintaxis

[Etiqueta] BTFSC f,b

Operadores

0 < f < 127


0 < b <7

Ciclos

1 (2)

OPCODE

01

Descripcin

Si el bit nmero b del registro f es cero, la instruccin que sigue a sta se


ignora y se trata como un NOP (skip). En este caso, y slo en este caso, la
instruccin BTFSC precisa dos ciclos para ejecutarse.

10bb

bfff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
INICIO BTFSC FLAG,1
ES_1 GOTO PROCESO
ES_0
Si antes de la instruccin. PC = direccin INICIO
Al ejecutarse:
if FLAG<1> = 0,
PC = direccin ES_0 y seguir la ejecucin del programa.
Su amigable compaero el Barra Bas

ffff

if FLAG<1> = 1,
PC = direccin ES_1 y el programa continuar en PROCESO

BTFSS

BTFSS

Bit Test, Skip if Set


Operacin

Salta si (f<b>) = 1

Sintaxis

[Etiqueta] BTFSS f,b

Operadores

0 < f < 127


0 < b <7

Ciclos

1 (2)

OPCODE

01

Descripcin

Si el bit nmero b del registro f est a 1, la instruccin que sigue a sta se


ignora y se trata como un NOP (skip). En este caso, y slo en este caso, la
instruccin BTFSS precisa dos ciclos para ejecutarse.

11bb

bfff

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
INICIO BTFSS FLAG,1
ES_0 GOTO PROCESO
ES_1
Si antes de la instruccin. PC = direccin INICIO
Al ejecutarse:
if FLAG<1> = 0,
PC = direccin ES_0 y el programa continuar en PROCESO.
if FLAG<1> = 1,
PC = direccin ES_1 y seguir la ejecucin del programa.

CALL

CALL

Subrutine Call

Operacin

PC + 1 TOS
k PC <10:0>
PCLATCH (<4:3>) PC (<12,11>)

Su amigable compaero el Barra Bas

Sintaxis

[Etiqueta] CALL k

Operandos

0 = k = 2047

Ciclos

OPCODE

10

Descripcin

Salvaguarda la direccin de vuelta en la Pila y despus llama a la


subrutina situada en la direccin cargada en el PC.
El modo de clculo de la direccin efectiva difiere segn la familia PIC
utilizada. Tambin hay que posicionar PA2, PA1 y PA0 (PIC 16C5X) o el
registro PCLATCH (En los dems PIC) antes de ejecutarse la instruccin.

0kkk

kkkk

kkkk

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
INICIO CALL SUB_1
Si antes de la instruccin:
PC = direccin INICIO
Al ejecutarse:
PC = direccin SUB_1
TOS = direccin INICIO +1
CLRF

CLRF

Clear f
Operacin

00 h f
1Z

Sintaxis

[Etiqueta] CLRF f

Operadores

0 < f < 127

Ciclos

OPCODE

00

Descripcin

Se borra el contenido del registro f y el flag Z se activa

0001

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

1fff

ffff

Z Se pone a 1 si el resultado de la
operacin es cero

Su amigable compaero el Barra Bas

EJEMPLO:
CLRF REG
Si antes de la instruccin:
REG = 5A h
Al ejecutarse:
REG = 00 h
flag Z = 1

CLRW

CLRW

Clear w
Operacin

00 h w
1Z

Sintaxis

[Etiqueta] CLRW

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

El registro de trabajo w se carga con 00h. El flag Z se pone a 1

0001

0000

0011

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z Se pone a 1 si el resultado de la operacin es cero


EJEMPLO
CLRW
Si antes de la instruccin. w= 5Ah
Al ejecutarse:
w = 00
flag Z = 1

CLRWDT

CLRWDT

Clear watchdog Timer

Operacin

00 h WDT
1 T0#
1 PD#
Su amigable compaero el Barra Bas

Sintaxis

[Etiqueta] CLRWDT

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

Se borra tanto el registro WDT (watchdog) como su preescaler. Los bits


T0# y PD# del registro de estado se ponen a "1".

0000

0110

0100

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

T0# Se pone a 1 cuando se ejecuta la instruccin CLRWDT o SLEEP. Se pone a 0 si el


temporizador watchdog se desborda
PD# Se pone a 1 cuando se ejecuta la instruccin CLRWDT o SLEEP
EJEMPLO
CLRWDT
Si antes de ejecutarse la instruccin
WDT = ?
Al ejecutarse: WDT = 00 h
Preescaler WDT = 0
bit de estado T0 = 1
bit de estado PD = 1

COMF

COMF

Complement f
Operacin

Complemento de f d

Sintaxis

[Etiqueta] COMF f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

OPCODE

00

Descripcin

Hace el complemento del contenido del registro f bit a bit. El resultado se


almacena en el registro f si d=1 y en el registro w si d=0, en este caso f no
vara.

1001

dfff

Su amigable compaero el Barra Bas

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z Se pone a 1 si el resultado de la
operacin es cero

EJEMPLO:
COMF REG1,0
Si antes de la instruccin:
REG1 = 13 h como d= 0
Al ejecutarse:
REG1 = 13 h = 0001 0011 b
w = EC h = 1110 1100 b
flag Z = 0
00010011b
1110 1100 b

DECF

DECF

Decrement f
Operacin

f-1d

Sintaxis

[Etiqueta] DECF f,d

Operadores

0< f <127
d [0,1]

Ciclos

OPCODE

00

Descripcin

Se decrementa el contenido del registro f en una unidad. El resultado se


almacena en f si d=1 y en w sid=0, en este caso f no vara.

0011

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

dfff

ffff

Z Se pone a 1 si el resultado de la
operacin es cero

EJEMPLO:
DECF CNT,1
Si antes de la instruccin:
CNT = 01 h
Z=0
Al ejecutarse:
CNT = 00 h
bit Z = 1
Su amigable compaero el Barra Bas

DECFSZ

DECFSZ

Decrement f , Skip if 0
Operacin

f - 1 d, salta si resultado = 0

Sintaxis

[Etiqueta] DECFSZ f,d

Operadores

0< f <127
d [0.1]

Ciclos

1 (2)

OPCODE

00

Descripcin

Decrementa el contenido del registro f en una unidad, el resultado se


almacena en f si d=1 y en w si d=0, en este caso, f no vara. Si el
resultado es cero, se ignora la siguiente instruccin y, en ese caso la
instruccin tiene una duracin de dos ciclos.

1011

dfff

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
INICIO

DECFSZ CNT,1
GOTO
LOOP

CONTINUAR
si antes de la instruccin:
PC = direccin INICIO
Al ejecutarse: CNT = CNT -1
Si CNT = 0 entonces PC = direccin CONTINUAR
Si CNT no = 0 entonces PC = direccin INICIO + 1

GOTO

GOTO

Unconditional Branch
Operacin

k PC <10:0>
(PCLATH <4:3>) (PC <12:11>)

Sintaxis

[Etiqueta] GOTO k

Operadores

0 < k < 2047

Ciclos

2
Su amigable compaero el Barra Bas

OPCODE

10

1kkkk

kkkk

kkkk

Descripcin

Salto incondicional, normalmente se utiliza para llamar a la subrutina


situada en la direccin que se carga en PC.
El modo de clculo de la instruccin carga desde el bit 0 al 10 de la
constante k en el PC y los bits 3 y 4 del registro PCLATH en los 11 y 12
del PC

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
GOTO SEGUIR
Al ejecutarse:
PC = direccin SEGUIR

INCF

INCF

Increment f
Operacin

f+1d

Sintaxis

[Etiqueta] INCF f,d

Operadores

0 < f < 127


d [0,1]
f+1d

Ciclos

OPCODE

00

Descripcin

Se incrementa en una unidad el contenido del registro f, si d=1 el


resultado se almacena en f, si d=0 el resultado se almacena en w, en este
caso el resultado de f no vara.

1010

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
INCF CNT,1
Si antes de la instruccin:
CNT = FF h
flag Z = 0

dfff

ffff

Z Se pone a 1 si el resultado de la
operacin
es
cero
al
haber
desbordamiento

Al ejecutarse:
FF h + 1 h = 00 h
CNT = 00
flag Z = 1
Su amigable compaero el Barra Bas

INCFSZ

INCFSZ

Increment f, SkIP if 0
Operacin

f +1 d, salta si resultado = 0

Sintaxis

[Etiqueta] INCFSZ f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

1 (2)

OPCODE

00

Descripcin

Incrementa el contenido del registro f en una unidad, el resultado se


almacena de nuevo en f si d=1, y en w sid=0, en este caso, f no vara. Si el
resultado es cero, se ignora la siguiente instruccin y, en ese caso la
instruccin tiene una duracin de dos ciclos.

1111

dfff

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
INICIO

INCFSZ CNT,1
GOTO SALTO

CONTINUAR
Si antes de la instruccin:
PC = direccin INICIO
Al ejecutarse: CNT = CNT+1
Si CNT = 0
Entonces PC = direccin CONTINUAR
Si CNT no = 0
Entonces PC = direccin INICIO + 1

IORLW

IORLW

Inclusive OR Literal with w


Operacin

w OR k w

Sintaxis

[Etiqueta] IORLW k

Su amigable compaero el Barra Bas

Operadores

0 < k < 255

Ciclos

OPCODE

11

Descripcin

Se realiza la operacin lgica OR entre el registro w y el literal k. El


resultado se almacena en el registro w.
Esta instruccin realiza la operacin OR bit a bit.

1000

kkkk

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

kkkk

Z Se pone a 1 si el resultado de la
operacin es cero.

EJEMPLO:
IORLW 0x35
Si antes de la instruccin:
w = 9A h
Al ejecutarse:
w = 1001 1010 b + 0011 0101 b = 1011 1111 b = BF h
10011010b
00110101b
1011 1111 b

IORWF

IORWF

Inclusive OR w with f
Operacin

w OR f d

Sintaxis

[Etiqueta] IORWF f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

OPCODE

00

Descripcin

Efecta la operacin lgica OR entre el contenido del registro w y el


contenido del registro f, y almacena el resultado en f si d=1 y
en w si d=0.
Esta instruccin realiza la operacin OR bit a bit.

0100

dfff

Su amigable compaero el Barra Bas

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z Se pone a 1 si el resultado de la operacin es cero.


EJEMPLO:
IORWF RESUL,0
Si antes de la instruccin
RESUL = 13 h = 0001 0011 b
w = 91 h = 1001 0001 b
Al ejecutarse:
RESUL= 0001 0011 b OR 1001 0001 b = 1001 0011 b = 93 h
00010011
10010001b
1001 0011 b

MOVLW

MOVLW

Move literal to w
Operacin

kw

Sintaxis

[Etiqueta] MOVLW k

Operadores

0 < f < 255

Ciclos

OPCODE

11

Descripcin

El registro w se carga con el valor de 8 bits del literal k

00xx

kkkk

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
MOVLW 0x5A
Al ejecutarse:
w = 5A h

Su amigable compaero el Barra Bas

kkkk

MOVF

MOVF

Move f
Operacin

fd

Sintaxis

[Etiqueta] MOVF f,d

Operadores

0
d [0,1]

Ciclos

OPCODE

00

Descripcin

El contenido del registro f se carga en el registro destino dependiendo del


valor de d. Si d=0 el destino es el registro w, si d=1 el destino es el propio
registrof. Esta instruccin permite verificar dicho registro ya que el
flag Z queda afectado.

<f<

10000

127

dfff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

ffff

Z Se pone a 1 si el resultado de la
operacin
es
cero.

EJEMPLO:
MOVF FSR,0
Al ejecutarse:
w = al valor del FSR

MOVWF

MOVWF

Move w to f
Operacin

wf

Sintaxis

[Etiqueta] MOVWF f

Operadores

0 < f < 127

Ciclos

OPCODE

00

Descripcin

Mueve el contenido del registro w al registro f

0000

1fff

Su amigable compaero el Barra Bas

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
MOVWF OPCION
Si antes de la instruccin:
OPCION = FF h
w = 4F h
Al ejecutarse:
OPCION = 4F h
w = 4F h

NOP

NOP

No operation
Operacin

no operacin

Sintaxis

[Etiqueta] NOP

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

No realiza operacin alguna, pero sirve para consumir un ciclo de


instruccin, equivalente a 4 de reloj.

0000

0xx0

0000

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
Si usamos un cristal de cuarzo de 4 Mhz en el oscilador, podremos obtener un retardo
igual a un microsegundo por cada instruccin NOP que insertemos en el cdigo del
programa:
RETARDO NOP
NOP
NOP
RETURN
Cada vez que llamemos a la subrutina RETARDO, obtendremos 3 microsegundos de
demora.

Su amigable compaero el Barra Bas

RETFIE

RETFIE

Return from Interrupt


Operacin

TOS PC
1 GIE

Sintaxis

[Etiqueta] RETFIE

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

Carga el PC con el valor que se encuentra en la parte alta de la Pila,


asegurando as la vuelta de la interrupcin. Pone a 1 el bit GIE, con el fin
de autorizar de nuevo que se tengan en cuenta las interrupciones.

0000

0000

1001

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
RETFIE
Al ejecutarse:
PC = TOS
GIE = 1

RETLW

RETLW

Retur with Literal in w


Operacin

k w;
TOS PC

Sintaxis

[Etiqueta] RETLW k

Operadores

0 < k < 255

Ciclos

OPCODE

11

Descripcin

Carga el registro w con el literal k, y despus carga el PC con el valor que


se encuentra en la parte superior de la PILA, efectuando as un retorno de
subrutina.

01xx

kkkk

Su amigable compaero el Barra Bas

kkkk

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
MOVLW 0x07 ;Se carga 07 h en w
CALL
TABLA ;Tabla de valores
...
;w contiene en valor recogido
...
TABLA ADDWF PC
;Se aade a PC el desplazamiento (offset) de w
RETLW k1
;Nueva Tabla
RETLW k2
...
...
...
RETLW kn
;Fin de tabla
Al ejecutarse la instruccin w = toma el valor de k7

RETURN

RETURN

Return from Subroutine


Operacin

TOS PC

Sintaxis

[Etiqueta] RETURN

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

Carga el PC con el valor que se encuentra en la parte superior de la PILA,


efectuando as un retorno de subrutina

0000

0000

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
RETURN

Su amigable compaero el Barra Bas

1000

RLF

RLF

Rotate Left f through Carry

Operacin

Sintaxis

[Etiqueta] RLF f,d

Operadores

0
d [0,1]

Ciclos

OPCODE

00

Descripcin

Rotacin de un bit a la izquierda del contenido del registro f, pasando por


el bit de acarreo C, desde los bits menos significativos a los ms
significativos. El bit D7 pasa al CARRY del registro STATUS, el
contenido del CARRY pasa al D0, el D0 al D1, etc. Es como si
multiplicramos por dos el contenido del registro.
Si d=1 el resultado se almacena en f, si d=0 el resultado se almacena
en w.

<f<

1101

dfff

127

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLOS:
Si tenemos el registro VALOR = 0000 0001 b y aplicamos la instruccin RLF VALOR,1
Entonces el resultado ser VALOR = 0000 0010 b y el bit C = 0.
Si tenemos el registro VALOR = 1110 0110 b y aplicamos la instruccin RLF VALOR
El resultado ser VALOR = 1100 1100 b y el bit C = 1.
Si antes de la instruccin REG1 = 1110 0110 b y flag C = 0 y aplicamos la
instruccin RLF REG1,0, como d = 0 el resultado queda en w, al ejecutarse:
REG1 = 1110 0110 b
w = 1100 1100 b
flag C = 1

Su amigable compaero el Barra Bas

RRF

RRF
Rotate Right f through Carry

Operacin

Sintaxis

[Etiqueta] RRF f,d

Operadores

0
d [0,1]

Ciclos

OPCODE

00

Descripcin

Rotacin de un bit a la derecha del contenido del registro f, pasando por el


bit de acarreo C, desde los bits ms significativos a los menos
significativos. El bit C del registro STATUS pasa al D7, el D0 pasa al bit
C, el D1 al D0, etc. Es como si dividiramos por dos el contenido del
registro.
Si d=1 el resultado se almacena en f, si d=0 el resultado se almacena en w

<f<

1100

dfff

127

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLOS:
Si tenemos el registro VALOR = 0000 0001 b y aplicamos la instruccin RRF VALOR,1
Entonces el resultado ser VALOR = 0000 0000 b y el bit C = 1.
Si tenemos el registro VALOR = 1000 0000 b y aplicamos la instruccin RRF VALOR,1
El resultado ser VALOR = 0100 0000 b y el bit C = 0.
Si antes de la instruccin, REG1 = 1110 0110 b y flag C = 1 y aplicamos la
instruccin RRF REG1,0, como d = 0 el resultado queda en w, al ejecutarse:
REG1 = 1110 0110 b
w = 0111 0011 b
flag C = 0

Su amigable compaero el Barra Bas

SLEEP

SLEEP

Sleep

Operacin

00
0
1
0 PD#

h
WDT

Sintaxis

[Etiqueta] SLEEP

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

Pone al circuito en modo Sleep (bajo consumo) con parada del oscilador.
Pone a 0 el flag PD# (Power Down) y el flag TO# (Timer Out) se pone a
1. Se puede salir de este estado por:
1. Activacin de MCLR para provocar un Reset.
2. Desbordamiento del watchdog si qued operativo en el modo
reposo.
3. Generacin de una interrupcin que no sea TMR0 ya que sta se
desactiva con la instruccin SLEEP.

0000

WDT
prescaler
TO#

0110

0011

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

Z#

DC

TO Se pone a 1 al ejecutar la instruccin SLEEP o CLRWDT


PD Se pone a 0 al ejecutar la instruccin SLEEP.
EJEMPLO:
SLEEP

SUBLW

SUBLW

Subtract w from Literal


Operacin

k-ww

Sintaxis

[Etiqueta] SUBLW k

Operadores

0 < k < 255

Ciclos

1
Su amigable compaero el Barra Bas

OPCODE

11

110x

kkkk

kkkk

Descripcin

Resta en complemento a dos del contenido del literal kel contenido del
registro w, y almacena el resultado enw.

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z Se pone a 1 si el resultado de la operacin es cero


DC Se pone a 1 si se genera un acarreo del bit 3 al grupo de 4 bits superior
C Se pone a 1 si se genera un acarreo del bit de mayor peso.
EJEMPLO:
SUBLW 0x02 ;k - w w, 02 h - w w
a) Si antes de la instruccin w = 01 h y flag C = ? al ejecutarse:
02 h - 01 h = 01 h
w = 01 h
flag C = 1 ; el resultado es positivo
b) Si antes de la instruccin w = 02 h, flag C = ? y flag Z = ? al ejecutarse:
02 h - 02 h = 00 h
w = 00 h
flag C = 1
flag Z = 1 ;el resultado es cero
c) Si antes de la instruccin w = 03 h y flag C = ? al ejecutarse:
02 h - 03 h = -01 h = - 0000 0001 b
C1(0000 0001 b)=1111 1110 b; 1111 1110 b + 1 b = 1111 1111 b = FF h
w = FF h
flag C = 0 ; el resultado es negativo

SUBWF

SUBWF

Subtract w from f
Operacin

f-wd

Sintaxis

[Etiqueta] SUBWF f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

OPCODE

00

Descripcin

Resta en complemento a dos el contenido del registro fmenos el


contenido del registro w almacena el resultado en w si d=0 y en f si d=1.

0010

dfff

Su amigable compaero el Barra Bas

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z
Se
pone
a
1
si
el
resultado
de
la
operacin
es
cero
DC Se pone a 1 si se genera un acarreo del bit 3 al grupo de 4 bits superior
C Se pone a 1 si se genera un acarreo del bit de mayor peso.
EJEMPLO:
SUBWF REG1,1 ;f - w f, REG1 - w REG1
a) Si antes de la instruccin, REG1 = 03 h, w = 02 h y flag C = ?, al ejecutarse:
03 h - 02h = 01 h
REG1 = 01h
w = 02 h
flag C = 1 ; el resultado es positivo
b) Si antes de la instruccin, REG1 = 02 h, w = 02 h y flag C = ?, al ejecutarse:
02 h - 02h = 00 h
REG1 = 00h
w = 02 h
flag C = 1
fal0 Z = 1 ; el resultado es cero
c) Si antes de la instruccin, REG1 = 01 h, w = 02 h y flag C = ?, al ejecutarse:
01 h - 02 h = -01 h = - 0000 0001 b
C1(0000 0001 b)=1111 1110 b; 1111 1110 b + 1 b = 1111 1111 b = FF h
REG1 = FF h
w = 02 h
flag C = 0 ; el resultado es negativo

SWAPF

SWAPF

Swap Nibbles in f
Operacin

(f<3:0>) (d <7:4>)
(f<7:4>) (d <3:0>)

Sintaxis

[Etiqueta] SWAPF f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

OPCODE

00

Descripcin

Los cuatro bits de ms peso del registro f se intercambian con los 4


bits de menos peso del mismo registro. Si d=0 el resultado se almacena
en w, si d=1el resultado se almacena en f.

1110

dfff

Su amigable compaero el Barra Bas

ffff

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
SWAPF REG1,0
Si antes de la instruccin:
REG1 = A5 h = 1010 0101 h
Como d=0 el resultado se almacenar en w
Al ejecutarse la instruccin:
REG1 = A5 h = 1010 0101 b
w = 5A h = 0101 1010 b

XORLW

XORLW

Exclusive OR Literal with k


Operacin

w XOR k w

Sintaxis

[Etiqueta] XORLW k

Operadores

0 < f < 255

Ciclos

OPCODE

11

Descripcin

Realiza la funcin OR-Exclusiva entre el contenido del registro w y la


constante k de 8 bits. El resultado se almacena en w.
Esta instruccin realiza la operacin EXOR bit a bit.

1010

kkkk

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

Z Se pone a 1 si el resultado de la ltima operacin es cero.


EJEMPLO:
XORLW 0xAF
Si antes de la instruccin:
w = 1011 0101 b = B5 h
Al ejecutarse la instruccin:
w = 1011 0101 b 1010 1111 b = 0001 1010 b = 1A h
1011 0101 b
1010 1111 b
0001 1010 b
Su amigable compaero el Barra Bas

kkkk

XORWF

XORWF

Exclusive OR w with f
Operacin

w XOR f d

Sintaxis

[Etiqueta] XORWF f,d

Operadores

0 < f < 127


d [0,1]

Ciclos

Descripcin

Realiza la funcin OR-Exclusiva entre el contenido del registro w y el


contenido del registro f, y almacena el resultado en f si d=1 y
en w si d=0.
Esta instruccin realiza la operacin EXOR bit a bit.

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
XORWF REG1,1
Si antes de la instruccin:
REG1 = AF h = 1010 1111 b
w = B5 h = 1011 0101 b
Como d=1, el resultado se almacena en REG1
Al ejecutarse:
REG1 = 1010 1111 1011 0101 =0001 1010 = 1A h
w = B5 h
1010 1111
1011 0101
0001 1010

Instrucciones OPTION y TRIS


Entre las instrucciones anteriores no se han incluido dos que no pertenecen
estrictamente hablando al repertorio de 35 instrucciones de la gama media. Estas
instrucciones son OPTION yTRIS . La razn por la cual no pertenecen a estas 35
instrucciones es por que fueron creadas pensando en la gama baja, que carece de 4 de
las instrucciones de la gama media: ADDLW,RETFIE, RETURN y SUBLW.
A pesar de todo las instrucciones TRIS y OPTION existen, en principio, en la gama
media, pero Microchip recomienda no utilizarlas, para mantener la compatibilidad con
todos los PIC de la gama media y los que puedan aparecer.
Su amigable compaero el Barra Bas

OPTION

OPTION

Guarda el valor del acumulador en el registro OPTION


Operacin

w OPTION

Sintaxis

[Etiqueta] OPTION

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

Esta instruccin guarda en el registro especial OPTIONel valor


contenido en el acumulador w. No modifica ningn bit de estado.

0000

0110

0010

Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
MOVLW 10H
; carga el acumulador con el valor 10h.
OPTION
; carga el registro OPTION con el acumulador.
Esta instruccin existe para mantener la compatibilidad con los PIC producidos con
anterioridad, y como en el futuro podra dejar de implementarse, Microchip aconseja
realizar el ejemplo anterior de esta otra forma:
BSF
STATUS,RP0
; activa el banco 1.
MOVLW 10H
; carga el acumulador con 10h
MOVWF OPTION_REG
; carga OPTION con el acumulador.

TRIS

TRIS

Guarda el acumulador en uno de los registros de TRIS.


Operacin

w f(TRISA TRISB)

Sintaxis

[Etiqueta] TRIS f

Operadores

No tiene

Ciclos

OPCODE

00

Descripcin

Esta instruccin guarda el valor del acumulador w en uno de los


registros especiales TRIS (TRISA o TRISB) que indicamos en el

0000

0110

Su amigable compaero el Barra Bas

1111

parmetro f. No modifica ningn bit de estado.


Los registros TRIS determinan el funcionamiento como entrada y
salida de las lneas I/O del PIC.
Registro de STATUS
PA2

PA1

PA0

TO#

PD#

DC

EJEMPLO:
MOVLW 16h
; carga el acumulador W con el valor 16h
TRIS PORTA ; carga el registro PORTA con el acumulador.
Esta instruccin existe para mantener la compatibilidad con los PIC producidos
anteriormente, y como en el futuro podra dejar de implementarse, Microchip aconseja
realizar el ejemplo anterior de esta otra forma (aunque ocupa ms memoria...):
BSF
STATUS,RP0
; activa el banco 1.
MOVLW 16h
; carga el acumulador con el valor 16h
MOVWF TRISA
; carga el registro PORTA con W.

Su amigable compaero el Barra Bas

SSu amigable compaero el Barra Bas

ADDLW Esto significa: Agregar (sumar) el Literal al registro W (acumulador o registro de


trabajo) resultado en W.
ADDLW 00 al FF Un nmero fijo (llamado literal) es sumado al registro W (registro de
trabajo). El literal (nmero) puede estar comprendido entre el 00 y FF. En el registro STATUS se
ven afectadas tres banderas (o flags) por la orden ADDLW (Z, DC y C), ver debajo.
C Se pone a 1 si se produce un acarreo desde el bit de mayor peso
(desbordamiento).
DC Se pone a 1 si se genera un acarreo del bit 3 al bit 4.
Z Se pone a 1 si el resultado de la operacin es cero.
Esta instruccin no est disponible para el '508A. Si quiere usar esta instruccin en el '508A o
un programa en l la requiere/contiene, emplee las 3 instrucciones siguientes:
Por ejemplo en el F84:
ADDLW 80

; mueve 80h a W

Sustityala en el '508A por:


MOVWF 13h
MOVLW 80h
ADDWF 13h

; Mueve W a cualquier archivo


;poner 80h en W
;sumar el archivo 13h a W

ADDWF Esto significa: Suma aritmtica de W y un archivo (f).


ADDWF 00 a FF,0 El resultado es almacenado en el registro de trabajo W, debido al valor
0 en la instruccin.

ADDWF 00 a FF,1 El resultado es almacenado en el mismo archivo, debido al valor 1 del


designador en la instruccin.
ADDWF (sumar) el contenido del registro W con el contenido de un archivo. El resultado
puede ser guardado en el registro W (designador = 0) o emplazado en el archivo llamado
(designador = 1). Con la orden ADDWF, en el registro STATUS se ven afectados los
bits: C (Carry), Z (Cero) y el DC (Dgito Carry).
Si el resultado de una instruccin ADD rebasa FF, la bandera C (Carry) es puesta a 1, si tiene
cualquier otro valor es 0.
Si el resultado de una instruccin ADD es cero 0000 0000, la bandera Z (Cero) se pone a 1 y
0 si tiene cualquier otro valor.
La suma se realiza en aritmtica binaria pura y sin signo. Si hay un (desborde) acarreo del bit
7, es decir que el resultado es mayor de 255, el bit C (bandera Carry) resulta 1, en caso
contrario resulta 0. El PIC supervisa si hay acarreo del bit 3, es decir que, la suma de los dos
(nibbles) mitades menos significativas (bits 0 a 3) resulta mayor de 15, el bit DC (digit carry) se
pone a 1, en caso contrario se pone a 0.
Por ejemplo: Si agregamos 21h a 3Ch, el resultado es 5Dh, esto no afecta la bandera
Carry, por lo que la bandera DC (dgito carry) ser puesta a 1, pero si a 2Dh le agregamos 3Eh,
el resultado es 6Bh, lo que desborda el contador (6B>FF) por lo que la bandera C (Carry) ser
puesta a 1.
Su amigable compaero el Barra Bas

Ejemplos :

banderas
1010 0010
+ 0100 1111 C DC Z
1111 0001 0 1 0

banderas
1101 0000
+ 0110 1111
0011 1111

C DC Z
1 0 0

ANDLW Esto significa: producto lgico AND del Literal con el registro W. Ver
tambin ANDWF.
ANDLW 00 a FF El objetivo de la operacin es, descubrir cuantos bits de L y W, en
binarios estn a 1. Si ambos bits son cero, el resultado es cero y la instruccin usada en este
caso es XOR. Esta instruccin hace un AND lgico entre un nmero fijo (literal) y el contenido
del registro W, el resultado es colocado en el registro W. Con la orden ANDLW, en el
registro STATUS se ven afectados los bits: C (Carry), Z (Cero) y el DC (Dgito Carry). El literal
puede ir de 00 a FF.
La operacin AND puede decirse que se usa para enmascarar (separar o quitar) los bits que
nos interesen. Por ejemplo:
0Fh enmascarar (quita) los cuatro bits altos (nibble alto) y
F0h quitar los cuatro bits bajos (nibble bajo). Veamos como se usa:
Utilizacin del 0Fh: ANDLW 0x0F
Primer nmero:
1001 0011 [Nmero en W anterior a la instruccin ANDLW]
Segundo nmero (0F): 0000 1111 [Nmero L Mscara]
Respuesta al AND:
0000 0011 [Al aplicar la funcin AND entre ambos] (ANDed)
Utilizacin del F0h: ANDLW 0xF0
Primer nmero:
1001 0011 [Nmero en W anterior a la instruccin ANDLW]
Segundo nmero (F0): 1111 0000 [Nmero L Mscara]
Respuesta al AND:
1001 0000 [Al aplicar la funcin AND entre ambos] (ANDed)

ANDWF Esto significa: Operacin AND producto lgico de W con el archivo f [ AND'ed entre
W y f]. Ver tambin ANDLW.
ANDWF (00 a FF), 0 El resultado se almacena en el registro W, por el valor 0 en la
instruccin.
ANDWF (00 a FF), 1 El resultado se almacena en el archivo f, por el valor en la instruccin.
Al registro W se le aplica el producto AND con un archivo f. Como dos archivos juntos no se
pueden operar (AND), un archivo debe ponerse en W y se hace AND con el segundo archivo.
Vase arriba para hacer operaciones de enmascarar con la operacin AND. Con la
instruccin ANDWF, slo se afecta la bandera Z (cero). Si la respuesta es cero, la bandera Z en
el registro STATUS se pone a 1, si la respuesta es distinta de cero, la bandera se pone a 0.

BCF Esto significa: Bit Clear File (pon a "0" o aclara el bit indicado (detrs de la coma) en el
archivo f ). Ver tambin BSF.
BCF (00 a FF), bit Hay sobre 300 instrucciones (incluidas en los micros, trabajando
internamente) para esta orden. Hay 79 archivos en el PIC16F84A, los 13 primeros archivos se
Su amigable compaero el Barra Bas

llaman Registros de Funcin Especial (SFR's), el resto (66) se llaman Archivos de Propsito
General (GPR's) del 0Ch a 4Fh. No afecta los bits de STATUS.
BCF se usa para limpiar [clear] un bit (pone a 0 el bit identificado en el
archivo f). Por ej.: BCF 06h,5 significa que el bit 5 del archivo 06 debe ser
puesto a "0" (aclarado), el resto de bits no se influyen. Ver figura de la derecha.
El archivo 6 contiene lneas de E/S comnmente se llaman I/O del puerto.

BSF Esto significa: Bit Set File (poner a 1 el bit indicado, en el archivo f). Ver tambin BCF.
BSF 00 a FF, bit Hay casi 300 instrucciones para esta orden. Hay 79 archivos en el
PIC16F84A, de las que los primeros 13 son losSFR's y los siguientes 66 son los conocidos GPR's.
Estos GPR's ocupan del 0Ch al 4Fh y cada uno tiene 8 bits. BSF significa poner a 1 lgico el bit
especifico en el archivo f. No afecta los bits de STATUS.
Por ejemplo: BSF 06h,5 indica que el bit 5 del archivo 6 ser puesto a 1, este archivo 6
contiene 8 lneas E/S, comnmente se llaman lneas I/O del puerto. El resultado es la inversa a
la instruccin anterior, el 0 se sustituye por un 1.

BTFSC Esto significa: Bit Test, Skip if Clear ( Bit de Test, Salta si es "0").
BTFSC 00 a FF, bit Hay casi 300 instrucciones para esta orden, para cubrir los 79
archivos, cada uno con 8 bits. BTFSC significa, comprobar el bit identificado en el
registro llamado y si es 0 saltar una instruccin (no ejecuta la instruccin que sigue). No afecta
los bits de STATUS.
Se ve mejor con un ejemplo: BTFSC 06h,4 es la forma de comprobar si el bit 4 en el archivo 6
es "0", si es cero, salta la prxima instruccin (pasar sin ejecutar) y continuar con la posterior.
Etiqueta: BTFSC 06h,4
; comprueba si el bit 4 es 0
GOTO Etiqueta2 ; si no es 0, salta hasta Etiqueta2
CALL Dlay
; si es 0, llama a subrutina Dlay.

BTFSS Esto significa: Bit Test, Skip if Set (Bit de Test, Salta si es "1").
BTFSS 00 a FF, bit Tambin hay casi 300 instrucciones para esta orden, para cubrir los 79
(4Fh) archivos, cada uno con 8 bits. BTFSS significa, comprobar el bit identificado en el registro
llamado y salta la prxima instruccin si es 1. No afecta los bits de STATUS.
En BTFSS 3,2 comprobamos el bit 2 del registro 3 y si dicho bit es 1, salta la prxima
instruccin, si no, continua con la siguiente.
Etiqueta: BTFSS 03h,2
GOTO Etiqueta2
CALL Dlay
sigue.

; comprueba si el bit 2 es 1
; si no, va a Etiqueta2
; si es 1, llama a subrutina Dlay para seguir. ; si es 1 viene a esta instruccin y

CALL Esto significa: Llamada incondicional a subrutina.


Su amigable compaero el Barra Bas

En un programa, esto se escribe como: CALL Salida o CALL Tono1, etc. donde Salida o Tono1
son etiquetas. Un RETURN debera encontrarse al final de la subrutina CALL para que el micro
vuelva a la siguiente instruccin despus de la instruccin CALL que la llam, de lo contrario se
producir un desborde de pila, con el consiguiente bloqueo del programa. No afecta los bits de
STATUS.

CALL Etiqueta Los programas deberan ser escritos de forma que las pocas primeras
instrucciones pongan al micro en el Inicio dePrograma Principal. El "Programa Principal" se
localizar fsicamente al final del listado y ste puede estar en el final de la memoria o a mitad del
camino, si el programa es aproximadamente 250 bytes de largo.
Despus de las primeras instrucciones que llevan al micro a: GOTO Inicio, se colocan todas las
subrutinas necesarias para el programa. Con una orden CALL se llamar a las subrutinas y al final
de cada subrutina debe tener una instruccin RETURN. Una llamada remota puede hacer de
subrutina pero esta segunda subrutina no puede llamar otra subrutina.
Cada vez que se ejecuta una instruccin CALL, un valor de direccin es colocado (empujado) en
la Pila (Stack), entonces el micro sabe donde volver despus de ejecutada la subrutina, la Pila slo
puede tener 8 niveles de alto, entonces es necesario llevar cuidado para no quedarse sin Pila
(Stack). Ver tambin GOTO, RETURN y RETLW.
Ejemplo:
Loop2: BTFSS 05,2 ;esta apretado el pulsador?
GOTO Loop2 ;No. Salta a Loop2
MOVLW 01
;S.
XORWF 06,1 ; encender el LED
CALL Delay
;Llamada a rutina de Retardo
GOTO Loop1 ; para ver LED encendido.
Delay: DECFSZ 1Bh,1
; Subrutina anidada de Retardo
GOTO Delay ; retardo exterior
DECFSZ 1Ch,1
; retardo interior
GOTO Delay
RETURN

CLRF Esto significa: Clear f [Limpia f] (poner a 0 los 8 bits del archivo f)
CLRF 00 a FF El contenido de un archivo se pone a 0 (Clear) y el bit Z del
registro STATUS es puesto a 1, esto es, los ocho bits se ponen a "0". Por esto hay que tener
en cuenta el bit Z (cero, flag Z). Los 12 primeros archivos son SRF's y los siguientes 68, del 07h
al 4Fh son los llamados GPR's.

CLRW Esto significa: Clear W (limpiar el registro de trabajo - llamado acumulador en otros
micros)

CLRW El registro W (de trabajo) es aclarado, todos los bits son puestos a 0. Cuando el W es
puesto a 0, la bandera cero (flag Z) es puesta a 1, en otras palabras la bandera Z del
registro STATUS es puesta a 1.
Su amigable compaero el Barra Bas

CLRWDT Esto significa: aClarado (puesta a 0) del Temporizador Perro Guardin (El
bit WDT = 0).

CLRWDT La instruccin repone (resetea) el Temporizador Perro Guardin, esto tambin


repone el preescaler del WDT y consume 2 ciclos maquina. Ejemplo:
Operacin:
00h WDT
0 WDT prescaler,
1 TO
1 PD
Afecta Status: TO, PD

COMF Esto significa: Complemento del archivo f.


COMF (00 a FF),0 El resultado estar en W por el valor 0 detrs de la coma.
COMF (00 a FF),1 El resultado estar en f. El contenido f es complementado (los 0's se
cambian a 1's y los 1's a 0's).

DECF Esto significa: Decremento del archivo f .


DECF (00 a FF),0 El resultado estar en W. El contenido del archivo f es decrementado y
puesto "W".

DECF (00 a FF),1 Aqu, el resultado estar en f. El contenido del archivo "f" es decrementado,
significa que es deducido (tomado) 1 del archivo. Si el archivo es 0000 0000 esto da la vuelta a
1111 1111 (255) afectando a la bandera Z. Cuando el archivo es 0000 0001 y se ejecuta una
instruccin DECF, el archivo pasa a 0000 0000 y la bandera Z (cero) del STATUS se pone a 1, en
otro caso es 0.

DECFSZ Esto significa: DECrement f, Skip if Zero (Decrementa el archivo f y salta si es 0).
DECFSZ (00 a FF),0 El resultado estar en W.
DECFSZ (00 a FF), 1 El resultado estar en f. La instruccin DECFSZ tiene muchos empleos.
Un empleo importante est en una subrutina de retardo. En esta rutina la
instruccin DECFSZ crea un lazo en el que el micro es enviado a una instruccin por encima-delprograma y se ejecutar un juego de instrucciones una y otra vez, esta es una tctica de perdida
de tiempo para crear un retardo. No afecta al registro STATUS.
Cada vez que el micro llega a DECFSZ, el contenido del archivo es decrementado y si el archivo
no es cero, se ejecutar la siguiente instruccin en el programa. La siguiente instruccin es
normalmente GOTO y sta enva de nuevo al micro por encima-del-programa. Por ej.:
ret: DECFSZ 0Ch,0
; Decrementa 0C y si es 0, salta una lnea
GOTO ret
; no es 0, ejecuta esta lnea
...
; si es 0, viene hasta aqu.
...
;sigue programa

GOTO Esto significa: Bifurcacin Incondicional.


Su amigable compaero el Barra Bas

GOTO k GOTO es la bifurcacin incondicional en la que el micro es enviado a la direccin


especificada. Esta instruccin carga simplemente la constante k en el registro PC (contador de
programa). Esta es la tpica instruccin de salto incondicional a cualquier posicin de la memoria
de programa. La constante literal k es la direccin de destino del salto, es decir la nueva direccin
de memoria de programa a partir de la cual comenzarn a leerse las instrucciones despus de
ejecutar la instruccin GOTO. No afecta al registro STATUS.
Tambin se usa $-n o $+n donde n es el nmero de lneas que ha de, volver atrs o avanzar en
el programa. Por ej.
ret DECFSZ 0Ch,0 ; decrementa 0Ch, si es 0 salta 1 instruccin
GOTO $-1
; No, vuelve 1 lnea atrs. No requiere etiqueta.
...
; Si, sigue programa

INCF Esto significa: Incrementar el archivo f.


INCF (00 a FF),0 El resultado del incremento estar en W.
INCF (00 a FF),1 El resultado estar en f. El contenido del archivo 'f' es incrementado, esto
simplemente significa que se agrega 1 al archivo, si el archivo es 1111 1111 (255) esto da la vuelta
a 0000 0000. Cuando el archivo es FFh y se ejecuta la instruccin INCF, el archivo pasa a 0000
0000 y la bandera Z (cero) es puesta a 1 en otro caso es 0.

INCFSZ Esto significa: INCrement f and Skip if 0 (Incrementar el archivo f y salta si es 0).
INCFSZ (00 a FF),0 El resultado estar en W.
INCFSZ (00 a FF),1 El resultado estar en f. Normalmente la funcin de decremento
DECFSZ se usa para crear un retardo, pero tambin se puede usar un INCFSZ. No afecta al
registro STATUS.
Esto trabaja as: Si el contenido de un archivo es incrementado y el resultado no es 0, entonces
la siguiente instruccin es ejecutada con un GOTO una direccin anterior y ejecutar otro INCFSZ.
Eventualmente el archivo ser 1111 1111 y el prximo incremento lo devolver a 0000 0000, el
resultado ser cero y la instruccin GOTO ser ignorada, ejecutndose la siguiente instruccin.

IORLW Esto significa: Inclusive OR Literal con W.


IORLW 00 a FF El contenido del archivo W es sumado (lgico) [OR'ed] con un nmero. El
resultado es colocado en registro de trabajo W, el nmero literal puede ser desde 00 a FF. Afecta
al bit Z del registro STATUS.
Esto es simplemente una operacin OR (suma lgica) y el objeto de su realizacin es cambiar
dos o ms bits a "1", si un bit es ORed con 0, la respuesta no se altera, si el bit es ORed con 1,
el resultado es 1.
Ejemplo: Si el registro W
se carga con 1111 0000 (es una mscara de 4 bits altos F0h) y
un nmero como 0100 1110 (4Eh) es ORed con W,
el resultado es 1111 1110 (FEh).

Su amigable compaero el Barra Bas

IORWF Esto significa: Inclusive OR con el archivo f


IORWF (00 a FF),0 El resultado estar en W.
IORWF (00 a FF),1 El resultado estar en f. El contenido del registro W es ORed con el
archivo f, esto simplemente es una operacin "OR" y el objeto de su realizacin es cambiar dos o
ms bits a "1". Si un bit es ORed con 0, la respuesta no se altera, si el bit es ORed con un 1 el
resultado es 1. Afecta al bit Z del registro STATUS.
Ejemplo: Si el registro W es cargado con 1111 0000 (F0h es una mscara de 4 bits altos) y un
archivo con un nmero como 0100 1110 (4Rh) es ORed
con W, el resultado es 1111 1110 (FEh).

MOVF Esto significa: Mueve el contenido del archivo 00 a 1F dentro y fuera del archivo o al
W.

MOVF (00 a FF),0 El contenido del archivo es movido al W. El resultado estar en W.


MOVF (00 a FF),1 El resultado estar en f. Para esta instruccin MOVF 00 a 1F,1 el
contenido es movido fuera del archivo y devuelto a l otra vez, pero no entra en W. Esto es una
prueba til ya que la bandera Z (cero) del STATUS se ve afectada. Si el contenido es cero, la
bandera Z es puesta a 1, si el contenido es 1, la bandera Z es 0.

((((((((MOVFW Esta forma de instruccin, no es vlida (no se recomienda su uso), a pesar de


que el propio MPLAB la admita, significa mover el contenido del archivo F, al registro de trabajo W.
Cando se encuentre esta forma de expresin, debe modificarse por:
MOVF f,W donde f es un registro entre 00 y FF. Tambin puede usarse MOVF f,0 que viene a
ser lo mismo.)))))))))))))))))))))))))) OJO

MOVLW Esto significa: Mueve Literal a W.


MOVLW (00 a FF) Un nmero f (Literal) es cargado en el registro W. El Literal puede ser 00
a FF. No afecta al registro STATUS.

MOVWF Esto significa: Copia W al archivo llamado f.


MOVWF (00 a FF) Esta instruccin copia datos del registro W al archivo f. No afecta al
registro STATUS.

NOP Esto significa: Ninguna operacin. Es decir, el micro no realiza ninguna operacin, slo
consume el tiempo de 1 instruccin.
(((((((((OPTION Esto significa: Carga registro OPTION. El contenido del registro W es
cargado en el registro OPTION.)))))))))) PIC16F84 ESPECIFICAMENTE

Su amigable compaero el Barra Bas

RETFIE Esto significa: Cuando hay una interrupcin, RETURN con valor de lo alto de la Pila
y lo deja en el PC.
RETFIE Carga el PC con el valor que se encuentra en la parte superior de la pila,
asegurando as la vuelta de la interrupcin. Pone a 1 el bit GIE, con el fin de autorizar o habilitar
de nuevo que se tengan en cuenta las interrupciones. TOS PC, 1 GIE. No afecta al registro
STATUS.
RETLW Esto significa: RETURN con Literal en W.
RETLW (00 a FF) El registro W es cargado con el valor del literal, normalmente devuelve un
dato procedente de una tabla. El Contador de Programa (PC) es cargado de la cima de la pila
(Stack), que corresponde a la direccin de RETURN de programa. No afecta al registro
STATUS.

RETURN Esto significa: Retorno de Subrutina. Esta instruccin est al final de una rutina o
subrutina. No afecta al registro STATUS.
RLF Esto significa: Rotar el archivo f a Izquierda con aCarreo (Carry).
RLF (00 a FF),0 El resultado se almacena en W.
RLF (00 a FF),1 Resultado se almacena en f. El contenido de un archivo, es rotado un bit a la
izquierda por la bandera Carry (acarreo), esto requiere de 9 desplazamientos para recuperar el
valor original del archivo. Afecta al bit C del STATUS.
El uso de: RLF.....Reg, Destino........; rota los bits de un registro un lugar la izquierda.
Si Reg = b'00010110'
Despus de la instruccin: Reg = b'0010110C' donde C es el valor del bit STATUS,C en el
momento de ejecutarse la instruccin RLF.
Veamos en mas detalle, cmo trabaja la funcin RLF:
Un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1 B0
Al aplicar la instruccin RLF.....Reg,F ocurre que: (STATUS,C <== B7) <== B6 B5 B4 B3 B2
B1 B0 (C <== STATUS,C)
Esto significa que, todos los bits de Reg son rotados (desplazados) una posicin hacia la
izquierda. El espacio generado a la derecha de Reg es decir, el bit0 (B0) del registro, es ocupado
por el valor que tena en ese momento el bit C del registro STATUS. A su vez, el Bit7 (B7) de Reg
sale del Registro y se rellena con el bit C del registro STATUS.
Repasemos otra vez. Reg = b'00001100' (Ch = .12) y STATUS,C = 0
Aplicamos; RLF Reg,F Entonces: Reg = b'00011000' (18h = .24) y STATUS,C = 0
Podemos comprobar que antes de aplicar la RLF, Reg vala 12 en sistema decimal. Despus de
la instruccin RLF Reg vale 24. Hemos multiplicado a Reg por dos, utilizando la instruccin RLF.
Ahora, consideremos el siguiente caso:
Reg = b'00001100' (Ch) y STATUS,C = 1
Su amigable compaero el Barra Bas

Aplicamos; RLF Reg,F Entonces: Reg = b'00011001' (19h = .25) y STATUS,C = 0


En este caso, antes de la aplicacin de RLF Reg vala 12 en decimal y despus de aplicar la
instruccin Reg vale 25 en decimal, por qu ocurre este error si hemos aplicado la misma
instruccin al mismo registro Reg. Debemos considerar el motivo.
El motivo radica en que el bit C del registro STATUS, antes de ejecutar la instruccin RLF,
vala 1, en el segundo caso y ocup el bit0 del
Reg al ejecutar la instruccin RLF. Por tanto, en este segundo caso, al hacer RLF Reg,F equivale a
hacer Reg * 2 + 1.
Precauciones a tener en cuenta para evitar incurrir en este error. Para asegurarnos en una
multiplicacin por dos, siempre limpiaremos el bit C del STATUS antes de aplicar la instruccin
RLF, asegurndonos as que el bit STATUS,C no "corrompa" la operacin.
Ej.: BCF STATUS,C
RLF Registro,F

;Limpiar STATUS,C para asegurar que no "ensucia" la multiplicacin


;y ahora, si. Rotar el Registro a la izquierda.

Se puede rotar ms veces a la izquierda, lo que en buena lgica es lo mismo que hacer Reg *
2 * 2, etc.

RRF Esto significa: Rotar el archivo a la Derecha por Carry (aCarreo).


RRF (00 a FF),0 En este caso el resultado se almacena en W.
RRF (00 a FF),1 Y en este el resultado se almacena en f. El contenido de un archivo es rotado
un bit a la derecha por la bandera Carry (acarreo), esta instruccin corrompe el registro al
introducir el valor de C en el bit7, por tanto, debemos usar una instruccin de aclarado del bit C
antes de usar RRF, otro modo de lograr esto, requiere de 9 desplazamientos para recuperar el
valor original del archivo.
La instruccin: RRF Reg,Destino

; rota los bits de un registro un lugar hacia la derecha.

Veamos: Reg = b'00011000' (18h = .24)


Aplicamos: RRF Reg,F
y Reg = b'C0001100'
Donde C es el valor que tena el bit C de STATUS en el momento de ejecutar la instruccin RRF.
Veamos en detalle cmo trabaja la funcin RRF:
Sabemos que un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1 B0
Al aplicar la instruccin: RRF.....Reg,F ocurre que: (STATUS,C ==> C) B7 B6 B5 B4 B3 B2
B1 ==> (B0 ==> STATUS,C)
Esto significa que todos los bits de Reg son desplazados una posicin hacia la derecha. El
espacio generado a la izquierda de Reg, es decir, el bit7 (B7) de registro, ser ocupado por el valor
que tena en ese momento el bit C del registro STATUS. A su vez, el Bit0 (B0) de Reg sale de Reg
y rellena el bit C del registro STATUS.
Supongamos que: Reg = b'00011000' (18h = .24) y STATUS,C = 0
Su amigable compaero el Barra Bas

Al aplicar: RRF Reg,F

Reg = b'00001100' (Ch = .12) y STATUS,C = 0

Aqu, podemos comprobar que antes de aplicar la RRF, Reg vala 24 en sistema decimal.
Despus de la instruccin RRF Reg vale 12, por lo que hemos dividido a Reg por dos, utilizando la
instruccin RRF. Sin embargo, veamos el caso en el que:
Reg = b'00011000' (18h = .24) y STATUS,C = 1
Al aplicar: RRF Reg,F

Reg = b'10001100' (8Ch = .140) y STATUS,C = 0

En este caso Reg, antes de la instruccin RRF vala 24 en sistema decimal. Y despus de la
instruccin RRF Reg vale 140. Este error ocurre por que el bit C de STATUS, en este caso, antes
de ejecutar la instruccin RRF vala 1, el cual al ejecutar la instruccin RRF, ocup el bit7 del
registro Reg.
Debemos considerar el motivo para evitar incurrir en este error, difcil de depurar. Para asegurar
una divisin por dos, limpiaremos el bit C del registro STATUS antes de realizar cualquier
instruccin RRF y asegurarnos que el bit STATUS,C no "corrompa" la divisin.
Ej.: BCF STATUS,C
RRF Registro,F

;Limpia STATUS,C para asegurar que no "corrompe" la divisin


;y ahora si. Rota el Registro a la derecha.

Por la misma lgica rotar dos veces a la derecha un registro equivale a decir Registro / 2 / 2, lo
que simplificado es Registro / 4, y as sucesivamente.

SLEEP Esto significa: SEELP (Dormir, bajo consumo). Pone a 0 el flag PD# (Power Down) y el
flag TO# (Timer Out) se pone a 1. O sea, el bit de estado de energa-baja es aclarado, el bit de
estado de interrupcin es puesto a 1, el Temporizador Perro Guardin y su preescaler son
aclarados (puestos a 0) y el procesador es puesto en el modo Sleep (bajo consumo) con el
oscilador parado.

Para salir de este estado, es necesaria una de estas causas:


Provocar un Reset activando el MCLR.
Por desbordamiento del WDT (Watchdog) si quedo operativo en el modo
reposo.
Generando una interrupcin distinta a TMR0 ya que sta se desactiva con la
propia instruccin SLEEP.
SUBLW Esto significa: Restar W del Literal.
SUBLW (00 a FF) EL registro W es restado (mtodo de complemento a 2) del valor Literal,
el resultado es colocado en el registro W.
Esta instruccin no est disponible en el juego de instrucciones del '508A, usar estas 5
instrucciones, ejemplo: SUBLW 80h.
Sustituir por:

MOVWF 13h

;Mover W a cualquier archivo


Su amigable compaero el Barra Bas

MOVLW
MOVWF
MOVF
SUBWF

80h
14h
13h,0
14h,0

;Poner 80h en W
;Mover W a cualquier archivo
;Mover 13h a W
;Restar W del archivo 14h

SUBW F Esto significa: Restar W del archivo.


SUBWF (00 a FF),0 El resultado estar en W.
SUBWF (00 a FF),1 El resultado estar en f. Restar por el mtodo de complemento a 2, el
registro W del archivo (de 00 a 2F).

SWAPF Esto significa: Swap Nibbles (intercambio de bits) en el archivo f.


SWAPF (00 a FF),0 El resultado estar en W.
SWAPF (00 a FF),1 El resultado estar en f. Los nibbles (niveles) superiores e inferiores de
un archivo 00 a 1F son cambiados.

TRIS 06 o solamente TRIS Esto significa: Carga Registro TRIS. Ver


tambin OPTION 0DFh en la Biblioteca de Rutinas.

Esta instruccin carga a TRIS con el contenido de W, usamos TRIS 06 para


recordar que se est refirindose al PuertoB (determinando la naturaleza de
Entrada/Salida de cada una de las lneas) cuando el programa se transfiere a un
PIC F84.
Las dos instrucciones de configuracin (set-up) son:
MOVLW xxh
TRIS 06

;Cargar W con un valor literal (recordar que para el '508A el Bit3 [GP3] debe ser 1).
;Cargar TRIS con el valor de W .

Nota: El '508A slo tiene 6 lneas en el puerto y usa slo los 6 bits inferiores. Si
W es 0000 1000 todas las lneas son salida excepto GP3, ya que GP3 slo puede
ser ENTRADA.
Si se requiere usar la instruccin TRIS en un '508A, son necesarias las
siguientes 4 instrucciones:
BSF 03,5
MOVLW 08
MOVWF 06
BCF 03,5

;Seleccionar pagina 1
;Haga GP3 entrada
;Cargar el archivo TRIS (como estamos en page1, esto no es salida port 6)
;Seleccionar Page0

Su amigable compaero el Barra Bas

XORLW Esto significa: Exclusivo OR Literal con W.


XORLW (00 a FF) El contenido del registro de W es XOR'ed con un valor literal (el
contenido de W se hace un XOR lgico con el valor literal), el resultado es colocado en el
registro W.

XORWF Esto significa: Exclusivo OR W con el archivo f.


XORWF (00 a FF),0 El resultado estar en W.
XORWF (00 a 1F),1 El resultado estar en f. Exclusivo OR del contenido del registro W con
un archivo (00 a 1F).

Con esto, damos por terminada la descripcin de las instrucciones para la


familia PIC. Personalmente recomiendo que se haga una copia en papel para
tener a mano en sus proyectos, esto le facilitar el proceso de programacin
ayudndole a recordar la funcin de las instrucciones y ganar tiempo en sus
proyectos.

Su amigable compaero el Barra Bas

Vous aimerez peut-être aussi