You are on page 1of 38

ANEXO 1

Set de instrucciones del


PIC16F87x

1
Set de instrucciones del PIC16F87x

Este es el conjunto completo de las instrucciones reconocidas por el PIC16F87x:

Or. Sintaxis Descripción Microchip Operación equivalente

1 ADDLW k Add Literal and W W=W+k

2 ADDWF f,d Add W and f d = W + f (donde d puede ser W ó f)

3 ANDLW k AND Literal with W W = W AND k

4 ANDWF f,d AND W with f d = W AND f (donde d puede ser W ó f)

5 BCF f,b Bit Clear f f(b) = 0

6 BSF f,b Bit Set f f(b) = 1

7 BTFSC f,b Bit Test f, Skip if Clear f(b) = 0 ? Si, salta la siguiente instrucción

8 BTFSS f,b Bit Test f, skip if Set f(b) = 1 ? Si, salta la siguiente instrucción

9 CALL k Subroutine Call Llama a la subrutina en la dirección k

10 CLRF f Clear f f=0

11 CLRW Clear W Register W=0

12 CLRWDT Clear Watchdog Timer Watchdog timer = 0

13 COMF f,d Complement f d = not f (donde d puede ser W ó f)

14 DECF f,d Decrement f d = f -1 (donde d puede ser W ó f)

15 DECFSZ f,d Decrement f, Skip if 0 d = f -1 (donde d puede ser W ó f) si d = 0 salta

16 GOTO k Go to address Salto incondicional a la dirección k

17 INCF f,d Increment f d = f +1 (donde d puede ser W ó f)

18 INCFSZ f,d Increment f, Skip if 0 d = f +1 (donde d puede ser W ó f) si d = 0 salta

19 IORLW k Inclusive OR Literal with W W = W OR k

20 IORWF f,d Inclusive OR W with f d = f OR W (donde d puede ser W ó f)

21 MOVLW k Move literal to W W=k

22 MOVF f,d Move f d = f (donde d puede ser W ó f)

23 MOVWF f Move W to f f=W

24 NOP No Operation No operación

25 RETFIE Return from Interrupt Retorna de una subrutina de interrupción

26 RETLW k Return Literal to W Retorna de una subrutina con W = k

27 RETURN Return from Subroutine Retorna de una subrutina

28 RLF f,d Rotale Left f through Carry d = f << 1 (donde d puede ser W ó f)

29 RRF f,d Rotale Right f through Carry d = f >> 1 (donde d puede ser W ó f)

30 SLEEP Go into Standby Mode Pone el PIC en standby

31 SUBLW k Subtract W from Literal W=k-W

32 SUBWF f,d Subtract W from f d = f - W (donde d puede ser W ó f)

33 SWAPF f Swap f f = Swap Intercambia los bit 0123 con 4567 de f

34 XORLW k Exclusive OR Literal with W W = W XOR k

35 XORWF f,d Exclusive OR W with f d = f XOR W (donde d puede ser W ó f)

2
1. ADDLW

ADDLW ADD Literal and W


Suma la constante k a W

Sintaxis:
addlw k

Operación equivalente:

W=W+k

Descripción:

Suma la constante k al valor contenido en el acumulador W y deja el resultado en el acumulador.

Ejemplo:

org 00H

start
movlw 10
addlw 12
...

Después de haberse ejecutado este programa el acumulador W valdrá 22.

Nota:

Esta instrucción modifica los bit Z, DC y C del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.


• DC vale 1 si el resultado de la operación es un numero superior a 15.
• C vale 1 si el resultado de la operación es positivo ó el bit 7 del registro que contiene el resultado
vale 0. En caso contrario C vale 0 (resultado negativo).

3
2. ADDWF

ADDWF ADD W and F


Suma el valor contenido en W con el valor contenido en el registro F

Sintaxis:
addwf f,d

Operación equivalente:

d = W + f (donde d puede ser W ó f)

Descripción:

Esta instrucción suma el valor contenido en el acumulador W con el valor contenido en el registro
direccionado por el parametro f. El parametro d es un flag que indica en que registro debe ser almacenado el
resultado.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Ejemplo:

Veamos un ejemplo de suoma con dos registros:

add1 equ 20H


add2 equ 21H

org 00H

movlw 10 ;Primer sumando = 10


movwf add1

movlw 15 ;Segundo sumando = 15


movwf add2

movf add1,W ;W = add1


addwf add2,W ;W = W + add2

Nota:

Esta instrucción modifica los bit Z, DC y C del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.


• DC vale 1 si el resultado de la operación es un numero superior a 15.
• C vale 1 si el resultado de la operación es positivo ó el bit 7 del registro que contiene el resultado
vale 0. En caso contrario C vale 0 (resultado negativo). .

4
3. ANDLW

ANDLW AND Literal with W


Efectua la operación AND entre W y una costante k

Sintaxis:
andlw k
Operación equivalente:

W = W AND k

Descripción:

Efectua la operación AND entre el valor contenido en el acumulador W y el valor costante k. El resultado
queda almacenado en el acumulador.

Ejemplo:

org 00H

start
movlw 10101010B
andlw 11110000B
...

Después de ejecutado este programa, el acumulador W valdrá 10100000B.

Nota:

Esta instrucción modifica el bit Z del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.

5
4. ANDWF

ANDWF AND W with F


Efectua la operación AND logica entre el valor contenido en W y el valor
contenido en el registro F.

Sintaxis:
andwf f,d
Operación equivalente:

d = W AND f (donde d puede ser W ó f)

Descripción:

Esta instrucción efectua la operación AND logica entre el valor contenido en el acumulador W y el valor
contenido en el registro direccionado por el parametro f. El parametro d es un flag que indica en que
registro debe ser almacenado el resultado.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Ejemplo:

A menudo la operación AND logica se utiliza para enmascarar el valor de algunos bits dentro de un
registro. Si por ejemplo quisieramos extraer del numero binario 01010101B los cuatro bits menos
significativos a fin de obtener el valor 00000101B, bastará preparar una máscara con el valor 00001111B y
hacer la operación AND con el valor de partida, veamos como:

movlw 01010101B ;Almacena en el registro con dirección


movwf 20H ;20H el valor inicial a enmascarar
movlw 00001111B ;Prepara la mascara de bits
andwf 20H,W ;Efectua la operación AND y memoriza el
;resultado en el acumulador W

El resultado en W sera 00000101B como queríamos.

W = 00001111 AND
f = 01010101 =
----------------
W = 0000010101

La instrucción ANDWF modifica el bit Z del registro STATUS que valdrá 1 si el resultado de la operación
es 0.

6
5. BCF

BCF Bit Clear F


Pone a cero un bit en el registro F

Sintaxis:
bcf f,b

Operación equivalente:

f(b) = 0

Descripción:

Esta instrucción pone a cero el bit b del registro direccionado por f.

Ejemplo:

parm1 equ 20H

org 00H

movlw 11111111B ;Valor inicial


movwf parm1

bcf parm1,0 ;D0=0

Al final del programa el registro parm1 valdrá 11111110B.

Nota:

Esta instrucción no modifica ningun bit de estado

7
6. BSF

BSF Bit Set F


Pone a uno un bit en el registro F

Sintaxis:
bsf f,b

Operación equivalente:

f(b) = 1

Descripción:

Esta instrucción pone a uno el bit b del registro direccionado por f.

Ejemplo:

parm1 equ 20H

org 00H

movlw 00000000B ;Valor inicial


movwf parm1

bsf parm1,0 ;D0=1

Al final del programa el registro parm1 valdrá 00000001B.

Nota:

Esta instrucción no modifica ningun bit de estado

8
7. BTFSC

BTFSC Bit Test F, Skip if Clear


Salta la instrucción siguiente si un bit en el registro F vale 0

Sintaxis:
btfsc f,d

Operación equivalente:

f(b) = 0 ? Si, salta una instrucción

Descripción:

Comprueba el valor del bit b contenido en el registro direccionado por f y se salta la instrucción siguiente si
vale 0.

Ejemplo:

parm1 equ 20H

org 00H

movlw 11111110B ;Valor inicial


movwf parm1
loop
btfsc parm1,0 ;D0 = 0 ? Si, sale del bucle
goto loop ;No, sigue en el bucle

Este programa ejecutaría un bucle infinito si sustituyeramos la instrucción:

movlw 11111110B ;Valor inicial

por la instrucción:

movlw 11111111B ;Valor inicial

Nota:

Esta instrucción no modifica ningun bit de estado

9
8. BTFSS

BTFSS Bit Test F, Skip if Set


Salta la instrucción siguiente si un bit en el registro F vale 1

Sintaxis:
btfss f,d
Operación equivalente:

f(b) = 1 ? Si, salta una instrucción

Descripción:

Comprueba el valor del bit b contenido en el registro direccionado por f y se salta la instrucción siguiente si
vale 1.

Ejemplo:

parm1 equ 20H

org 00H

movlw 11111111B ;Valor inicial


movwf parm1
loop
btfss parm1,0 ;D0 = 1 ? Si, sale del bucle
goto loop ;No, sigue en el bucle

Este programa ejecutaría un bucle infinito si sustituyeramos la instrucción:

movlw 11111111B ;Valor inicial

por la instrucción:

movlw 11111110B ;Valor inicial

Nota:

Esta instrucción no modifica ningun bit de estado

10
9. CALL

CALL Subroutine CALL


Llamada a una subrutina

Sintaxis:
call k
Descripción:

Llama a una subrutina almacendada en la dirección k.El parametro k puede ser directamente el valor
numerico de la dirección ó una etiqueta relativa.

Ejemplo:

org 00H

call ledOn
...
;Subrutina de encendido de un led
ledOn
bsf PORTB,LED1
return

Cuando la CPU del PIC encuentra una instrucción CALL, guarda en el STACK el valor del registro PC + 1
de modo que puede proseguir la ejecución de la instrucción siguiente a CALL a la vuelta de la subrutina,
luego escribe en el PC la dirección de la subrutina saltando a la ejecución de esta ultima.

El valor original del PC es restaurado a la salida de la subrutina con la ejecución de la instrucción de retorno
RETURN o RETLW.

En el PIC16F84 hay disponibles 8 niveles de stack, por lo que el numero maximo de CALL rentrantes, ó de
instrucciones CALL dentro de una subrutina que a su vez contengan otra CALL, está limitado a 8 niveles.

Nota:

Esta instrucción no modifica ningun bit de estado.

11
10. CLRF

CLRF CLeaR F register


Pone a cero el registro F

Sintaxis:
clrf f
Operación equivalente:

f=0

Descripción:

Esta instrucción pone a cero el valor contenido en el registro direccionado por el parametro f.

Ejemplo:

Supongamos que queremos poner a cero el registro TMR0 cuya dirección es 01H Hexadecimal, la
instrucción a utilizar será:

clrf 01H

O, si se incluye al inicio de nuestro codigo fuente el fichero P16F84.INC, podremos utilizar el nombre
simbolico del registro TMR0.

clrf TMR0

Después de la ejecución de esta instrucción el bit Z del registro STATUS es puesto a 1.

12
11. CLRW

CLRW CLeaR W register


Pone a cero el registro W

Sintaxis:
clrw
Operación equivalente:

W=0

Descripción:

Pone a cero el valor contenido en el registro W.

Nota:

Después de la ejecución de esta instrucción el bit Z del registro STATUS es puesto a 1.

13
12. CLRWDT

CLRWDT CLeaR WatchDog Timer


Reset del timer del watchdog

Sintaxis:
clrwdt
Descripción:

Esta instrucción debe ser utilizada cuando programamos el PIC con la opción Watchdog habilitada (bit
WDTE). En esta modalidad el PIC habilita un timer que, una vez trascurrido un determinado tiempo,
efectua un reset del PIC. Para evitar el reset nuestro programa deberá contener ciclicamente la instrucción
CLRWDT para poner a cero este timer antes de dicho tiempo. Si no se pone a cero el timer a tiempo, la
circuiteria del watchdog (del ingles perro guardian) interpretará esto como un bloqueo del programa en
ejecución y efectuará el reset para desbloquearlo.

Ejemplo:

org 00H

loop
clrwdt
goto loop

Nota:

Esta instrucción no modifica ningun bit de estado.

14
13. COMF

COMF COMplement F
Efectua el complemento del registro F

Sintaxis:
comf f,d
Operación equivalente:

d = NOT f (donde d puede ser W ó f)

Descripción:

Esta instrucción efectua el complemento del valor contenido en el registro direccionado por el parametro f.
El parametro d determina el destino del valor obtenido.

Si d = W el valor es almacenado en el registro W


Si d = F el valor es dejado en el registro f.

Ejemplo:

parm1 equ 20H

org 00H

movlw 01010101B
movwf parm1

comf parm1,F
...

Despues de la ejecución del programa el valor del registro parm1 será 10101010B.

Nota:

Esta instrucción modifica el bit Z del registro STATUS.

• Z vale 1 si el resultado de la operación vale 0.

15
14. DECF

DECF DECrement F register


Dcrementa el contenido del registro F

Sintaxis:
decf f,d

Operación equivalente:

d = f -1 (donde d puede ser W ó f)

Descripción:

Esta instrucción decrementa el contenido del registro direccionado por el parametro f. El parametro d es un
flag que indica en que registro debe ser almacenado el resultado.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Ejemplo:

Con el siguiente programa escribimos el valor 23H en el registro con dirección 20H y luego decrementamos
su valor en uno. Al final de la ejecución el registro en la posición 20H contendrá el valor 22H.

movlw 23H ;Escribe en W el valor 23H


movwf 20H ;Copia en el registro 20H el valor de W
decf 20H,F ;Decrementa el valor contenido en el
;registro 20H

Nota:

Esta instrucción modifica el bit Z del registro STATUS.

• Z vale 1 si el resultado de la operación vale 0.

16
15. DECFSZ

DECFSZ DECrement F, Skip if Zero


Decrementa el valor del registro f y salta la instrucción siguiente si el resultado
vale cero

Sintaxis:
decfsz f,b

Operación equivalente:

d = f -1 (donde d puede ser W ó f) si d = 0 salta

Descripción:

Decrementa el valor del registro direccionado por f y si el resultado vale cero se salta la instrucción
siguiente. El resultado del decremento puede ser almacenado en el mismo registro f, ó en el acumulador W
dependiendo del valor del flag d.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Ejemplo:

counter equ 20H

org 00H

movlw 10 ;counter = 10
movwf counter
loop
decfsz counter,F ;counter = counter -1
;counter = 0 ? Si, entonces salta
goto loop ;No, continua

Este programa ejecuta 10 veces la instrucción decfsz hasta que sale cuando counter=0.

Nota:

Esta instrucción no modifica ningun bit de estado.

17
16. GOTO

GOTO GO TO address
Salta a ejecutar el programa a partir de la dirección k

Sintaxis:
goto k

Descripción:

Ejecuta un salto del programa en ejecución a la dirección k. El parametro k puede ser specificado utilizando
directamente el valor numerico de la dirección ó una etiqueta relativa.

Ejemplo:

org 00H

loop
goto loop

Este programa ejecuta un bucle (loop) infinito.

Nota:

Esta instrucción no modifica ningun bit de estado.

18
17. INCF

INCF INCrement F
Incrementa el valor del registro direccionado por F

Sintaxis:
incf f,d

Operación equivalente:

d = f +1 (donde d puede ser W ó f)

Descripción:

Incrementa el contenido del registro direccionado por f y almacena el resultado en el mismo registro ó en el
acumulador W dependiendo del valor del flag d:

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el mismo registro F

Nota:

Esta instrucción modifica el bit Z del registro STATUS..

• Z vale 1 si el resultado de la operación es 0.

19
18. INCFSZ

INCFSZ INCrement F, Skip if Zero


Incrementa el valor del registro f y se salta la instrucción siguiente si el resultado
es cero

Sintaxisi:
incfsz f,b

Operación equivalente:

El contenido de d = f +1 (donde d puede ser W ó f) si el contenido de d = 0 se salta la siguiente


instrucción

Descripción:

Incrementa el contenido del registro f , y, si el resultado vale cero se salta la instrucción siguiente. El
resultado del incremento puede ser almacenado en el mismo registro f ó en el acumulador W dependiendo
del valor del flag d.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Ejemplo:

counter equ 20H

org 00H

movlw 250 ;counter = 250


movwf counter
loop
incfsz counter,F ;counter = counter + 1
;counter = 0 ? Si, se salta la
;siguiente
goto loop ;No, continua

Este programa ejecuta 256 - 250 = 6 veces la instrucción incfsz hasta que salta cuando counter = 0. Siendo
counter un registro de 8 bit cuando se incrementa el valor 255 toma nuevamente el valor 0 de ahi la formula
256 - 250 = 6.

Nota:

Esta instrucción no modifica ningun bit de estado.

20
19. IORLW

IORLW Inclusive OR Literal with W


Efectua la operación logica OR entre W y una costante k

Sintaxis:
iorlw k

Operación equivalente:

W = W OR k

Descripción:

Efectua la operación logica OR entre el valor contenido en el acumulador W y el valor costante k. El


resultado se almacena en el acumulador W.

Ejemplo:

org 00H

start
movlw 00001111B
iorlw 11110000B
...

Despues de ejecutado este programa el acumulador W valdrá 11111111B.

Nota:

Esta instrucción modifica el bit Z del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.

21
20. IORLW

IORWF Inclusive OR W with F


Efectua la operación logica OR entre el valor contenido en W y el valor contenido
en el registro F

Sintaxisi:
iorwf f,d

Operación equivalente:

d = f OR W (donde d puede ser W ó f)

Descripción:

Esta instrucción efectua la operación logica OR entre el valor contenido en el acumulador W y el valor
contenido en el registro direccionado por el parametro f. El parametro d determina donde se almacenará el
resultado de la operacción:

Si d = W el resultado es almacenado en el acumulador W.


Si d = F el resultado es almacenado en el registro f.

Ejemplo:

parm1 equ 20H

org 00H

movlw 00001111B
movwf parm1

movlw 11111111B
iorwf parm1,F

Al finalizar la ejecución el valor del registro parm1 será 11111111B.

Nota:

Esta instrucción modifica el bit Z del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.

22
21. MOVLW

MOVLW MOVe Literal to W


Asigna a W un valor costante

Sintaxis:
movlw k

Operación equivalente:

W=k

Descripción:

Asigna al acumulador W el valor constante k.

Ejemplo:

org 00H

start
movlw 20
...

Despues de haber ejecutado este programa el acumulador W valdrá 20.

Nota:

Esta instrucción no modifica ninggun bit de estado.

23
22. MOVF

MOVF MOVe F
Mueve el contenido del registro F

Sintaxis:
movf f,d

Operación equivalente:

d = f (donde d puede ser W ó f)

Descripción:

Esta instrucción copia el contenido del registro direccionado por el parametro f ó en el acumulador W ó en
el mismo registro F. El parametro d determina el destino.

Si d = W el valor es almacenado en el registro W


Si d = F deja el valor en el registro f. En este caso la utilidad de la instrucción esta en el hecho de que
modifica el bit Z del registro STATUS dependiendo del valor contenido en el registro f.

Ejemplo:

El ejemplo siguiente copia el valor contenido en el registro con dirección 20H en el acumulador W:

movf 20H,W

24
23. MOVWF

MOVWF MOVe W to F
Mueve el contenido del registro W al registro F

Sintaxis:
movwf f

Operación equivalente:

f=W

Descripción:

Esta instrucción copia el contenido del registro W en el registro direccionado por el parametro f.

Ejemplo:

Supongamos que queremos escribir el valor 10H (hexadecimal) en el registro TMR0. Las instrucciones a
ejecutar son las siguientes.

movlw 10H ;Escribe en el registro W el valor 10H


movwf 01H ;y lo memoriza en el registro TMR0

Con los registros utilizados por el PIC para funciones especificas, es habitual no escribir directamente su
dirección sino el nombre simbolico relativo definido en el fichero P16F84.INC. El codigo se convierte por
tanto en el siguiente:

movlw 10H ;Escribe en el registro W el valor 10H


movwf TMR0 ;y lo memoriza en el registro TMR0

Nota:

La ejecución de MOVWF no modifica ningun bit de estado.

25
24. NOP

NOP No OPeration
No operación

Sintaxis:

nop

Descripción:

Esta instrucción no ejecuta ninguna operación pero es util para insertar un retardo igual a un ciclo de
maquina .

Ejemplo:

Utilizando un cristal de cuarzo de 4MHz en el oscilador, podremos obtener un retardo igual a 1µs por cada
instrucción NOP insertada en nuestro codigo fuente.

nop ;Ejecuta un retardo igual a 1µs

Nota:

La instrucción NOP no modifica ningun bit de estado.

26
25. RETFIE

RETFIE RET From Interrupt


Retorno de una subroutina de interrupción

Sintaxis:
retfie

Descripción:

Esta instrucción debe ser insertada al final de cada subroutina de gestión de una interrupción para devolver
el control al programa principal.

Ejemplo:

org 00H
loop
goto loop ;Bucle infinito

org 04H ;Vector de interrupción


intHandler

retfi ;Vuelta de la interrupción

En este codigo fuente el programa principal ejecuta un bucle infinito. Si habilitamos una de las
interrupciones del 16F84 nada más que esta se produzca, el control pasará automaticamente al programa
situado en la dirección 04H (en el ejemplo intHandler), la instrucción RETFI determinará luego el retorno al
bucle principal.

Nota:

Esta instrucción no modifica ningun bit de estado.

27
26. RETLW

RETLW RETurn Literal to W


Retorna de una subroutina con una costante en W

Sintaxis:
retlw k

Descripción:

Esta instrucción devulve el control desde una subroutina al programa principal. A diferencia de la
instrucción RETURN esta permite pasar, a traves del acumulador W, el valor constante k al programa
principal.

Ejemplo:

rtc equ 20H


org 00H

call mySub1
movwf rtc

...

mySub1
nop
retlw 10

Una vez ejecutado este programa almacena en el registro rtc el valor 10 devuelto por la subroutina mySub1.

Nota:

Esta instrucción no modifica ningun bit de estado

Ver tambien la instrucción RETURN.

28
27. RETURN

RETURN RETURN from subroutine


Retorno de una subroutina

Sintaxis:
return

Descripción:

Esta instrucción debe ser insertada al final de cada subroutina para volver a la ejecución del programa
principal.

Ejemplo:

org 00H

call mySub1
....

mySub1
nop
return

Nota:

En el PIC16F84 peden ser anidadas hasta 8 llamadas a subroutina del tipo:

org 00H

call mySub1
....

mySub1
call mySub2
return

mySub2
call mySub3
return

mySub3
return

Nota:

Esta instrucción no modifica ningun bit de estado.

Ver tambien la instrucción RETLW.

29
28. RLF

RLF Rotate Left F through carry


Rota a la izquierda el contenido del registro f pasando por el Acarreo(Carry)

Sintaxisi:
rlf f,b

Operación equivalente:

d = f << 1 (donde d puede ser W ó f)

Descripción:

Rota los bit contenidos en el registro en la dirección f, hacia la izquierda (ó desde los bit menos
significativos hacia los más significativos) pasando por el bit CARRY del registro STATUS como se
ilustra en la figura:

El contenido del bit CARRY del registro status es depositado en el bit D0 mientras que el valor que sale del
bit D7 es depositado en el CARRY.

El valor del parametro d determina el destino del resultado obtenido al final de la rotación:

Si d = W el resultado es almacenado en el registro W dejando el registro f sin modificar.


Si d = F el resultado es almacenado en el mismo registro f

Ejemplo:

parm1 equ 20H

org 00H

clrf C,STATUS ;Pone a cero el CARRY

movlw 01010101B ;Valor inicial


movwf parm1

rlf parm1,F

Al final del programa el registro parm1 valdrá 10101010B mientras que el CARRY valdrá 0.

Nota:

Esta instrucción no modifica ningun otro bit de estado excepto el de CARRY.

30
29. RRF

RRF Rotate Right F through carry


Rota a la derecha el contenido del registro f pasando por el Acarreo(Carry)

Sintaxis:
rrf f,b

Operación equivalente:

d = f >> 1 (donde d puede ser W ó f)

Descripción:

Rota los bit contenidos en el registro en la dirección f, hacia la derecha (ó desde los bit más significativos
hacia los menos significativos) pasando por el bit CARRY del registro STATUS como se ilustra en la
figura:

El contenido del bit CARRY del registro status es depositado en el bit D7 mientras que el valor de salida del
bit D0 es depositado en el CARRY.

El valore del parametro d determina el destino del resultado obtenido al final de la rotación:

Si d = W el resultado es almacenado en el registro W dejando el registro f sin modificar.


Si d = F el resultado es almacenado en el mismo registro f

Ejemplo:

parm1 equ 20H

org 00H

clrf C,STATUS ;Pone A cero el CARRY

movlw 01010101B ;Valor inicial


movwf parm1

rrf parm1,F

Al final del programa el registro parm1 valdrá 00101010B mientras que el CARRY valdrá 1.

Nota:

Esta instrucción no modifica ningun bit de estado, excepto el de CARRY.

31
30. SLEEP

SLEEP go into standby mode


Pone el PIC en standby

Sintaxis:
sleep

Descripción:

Esta instrucción para la ejecución del programa en curso y pone el PIC en estado de standby (sleep del
ingles to sleep, dormir).

Ejemplo:

org 00H

start
sleep

Nota:

Esta instrucción no modifica ningun bit de estado.

32
31. SUBLW

SUBLW SUBtract W from Literal


Resta a k el valor en W

Sintaxis:
sublw k

Operación equivalente:

W=k -W

Descripción:

Resta a la constante k el valor almacenado en el acumulador W.

Ejemplo:

org 00H

start
movlw 10
sublw 12
...

Despué de haber ejecutado este programa el acumulador W valdrá 2.

Nota:

Esta instrucción modifica los bit Z, DC y C del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.


• DC vale 1 si el resultado de la operación es un numero superior a 15.
• C vale 1 si el resultado de la operación es positivo ó el bit 7 del registro que contiene el resultado
vale 0. En caso contrario C vale 0 (resultado negativo).

33
32. SUBWF

SUBWF SUBstract W from F


Resta el valor contenido en W del valor contenido en el registro F

Sintaxis:
subwf f,d

Operación equivalente:

d = f - W (donde d puede ser W ó f)

Descripción:

Esta instrucción resta el valor contenido en el registro W del valor contenido en el registro direccionado
por el parametro f. El parametro d es un flag que indica en que registro debe ser almacenado el resultado.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Ejemplo:

Analicemos un ejemplo extraido del datasheet de Microchip:

Si insetamos la instrucción:

subwf REG1,F

Donde reg1 es la dirección de un registro cualquiera especificado con la directiva:

REG1 RES 1

Para valores iniciales de REG1=3 y W=2, después de la ejecución tendremos que REG1=1 y C=1 porque el
resultado es positivo.

Para valores iniciales de REG1=2 y W=2 después de la ejecucción tendremos que REG1=0 y C=1 porque el
resultado es siempre positivo.

Para valores iniciales de REG1=1 y W=2, tendremos REG1=FFH ó -1 luego C=0 porque el resultado es
negativo.

Nota:

Esta instrucción modifica los bit Z, DC y C del registro STATUS.

• Z vale 1 si el resultado de la operación vale 0.


• C vale 1 si el resultado de la operación es positivo ó el bit 7 del registro que contiene el resultado
vale 0. En caso contrario C vale 0 (resultado negativo).

34
33. SWAPF

SWAPF SWAP F
Intercambia el valor de los cuatro bit más significativos del registro en la
dirección F con los cuatro bit menos significativos.

Sintaxis:
swap f,d

Operación equivalente:

f = Swap de los bit 0123 con los bit 4567 de f

Descripción:

Intercambia el valore de los cuatro bit más significativos (D7-D4) contenidos en el registro en la dirección f
con los cuatro bit menos significativos (D3-D0) del mismo. El resultado es almacenado en el acumulador W
ó en el mismo registro f dependiendo del valor de d:

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el mismo registro F

Nota:

Esta instrucción no modifica ningun bit de estado

35
34. XORLW

XORLW Exclusive OR Literal with W


Efectua la operación OR exclusiva entre W y una constante k

Sintaxis:
xorlw k

Operación equivalente:

W = W XOR k

Descripción:

Efectua la operación OR exclusiva entre el valor contenido en el acumulador W y el valor constante k.

Ejemplo:

org 00H

start
movlw 00000000B
xorlw 11110000B
...

Después de haber ejecutado este programa el acumulador W valdrá 11110000B.

Nota:

Esta instrucción modifica el bit Z del registro STATUS.

• Z vale 1 si el resultado de la operación es 0.

36
35. XORWF

XORWF eXclusive OR W with F


Efectua la operación logica OR exclusiva entre el valor contenido en W y el valor
contenido en el registro F

Sintaxis:
xorwf f,d

Operación equivalente:

d = f XOR W (donde d puede ser W ó f)

Descripción:

Esta instrucción efectua la operación logica OR exclusiva (XOR) entre el valor contenidoo en el
acumulador W y el valor contenido en el registro direccionado por el parametro f. El parametro d es un flag
que indica en que registro debe ser almacenado el resultado.

Si d = W el resultado es almacenado en el registro W


Si d = F el resultado es almacenado en el registro f

Esta instrucción modifica el bit Z del registro STATUS que valdrá 1 si el resultado de la operación es 0.

Ejemplo:

Supongamos que tenemos que efectuar la operación logica XOR entre el registro W y el registro
COUNTER definido por nosotros en la dirección 20H con la directiva:

COUNTER EQU 20H

podemos utilizar la instrucción XORWF de dos formas según donde queramos dejar el resultado, o bien:

xorwf COUNTER,F ;COUNTER = COUNTER XOR W

ó:

xorwf COUNTER,W ;W = COUNTER XOR W

Nota:

La OR exclusiva (XOR) es una operación entre dos bit en la que el bit resultado vale 0 si los dos bit son
iguales.

Asi mismo la operación XOR es utilizada en el ensamblador del PIC para efectuar la comparación entre dos
valores a falta de una instrucción especifica.

Veamos como:

Supongamos que tenemos un valor en el registro REG1 y que qeremos verificar si es igual a 57H. Las
instrucciones a ejecutar son las siguientes:

37
movlw 57H ;W = Valor a comparar = 57H
;Resultado. W = 57H
xorwf REG1,W ;W = W XOR REG1 Efectua la XOR con
;el valor en REG1
btfss STATUS,Z ;Salta la instrucción siguiente si el
;resultado de la XOR vale 0, es decir
;si el valor de REG1 es igual a 57H
goto diverso ;Salta si es distinto de 57H
goto uguale ;Salta si es igual a 57H

38

You might also like