Vous êtes sur la page 1sur 13

1

CONJUNTO DE INSTRUCCIONES DEL PIC16F877

El microcontrolador PIC16F877 dispone de un procesador RISC (Computador de Juego de


Instrucciones Reducido). Esto quiere decir que con un total de 35 instrucciones usted
podrá realizar todos sus programas además son muy fáciles de aprender. Las
instrucciones tienen algunas letras que van relacionadas y que tienen cierta interpretación.
Por ejemplo la letra "W" es el registro más importante que tiene el microcontrolador y es
denominado ACUMULADOR o REGISTRO DE TRABAJO, todas las operaciones pasan a
través de el.

A continuación se realiza una breve descripción de las 35 instrucciones las cuales se


dividen en 4 grupos:

1. INSTRUCCIONES QUE TRABAJAN ENTRE DOS REGISTROS

Estas instrucciones tienen una característica común el argumento de la instrucción es F,d


F define el registro con el cual vamos a trabajar en este instrucción, puede ser un registro
de propósito general o un registro especial. La letra "d" en la instrucción, es el lugar donde
se desea guardar el resultado de la operación una vez finalizada la instrucción, el
resultado podrá ser almacenado directamente en el acumulador "W" si d = 0 = W, o en el
registro "F" si d = 1 = F

Esta instrucción suma el contenido del registro de trabajo (W)


1 ADDWF F,d W + F con el contenido de F el cual es un registro cualquiera con un
determinado valor.

Por ejemplo:
W = 15
CONT = 7
En este caso F será el registro CONT. (Registro de propósito general) entonces
tendríamos:
ADDWF CONT, 1

Al momento que ejecutamos esta instrucción los registros quedarían así:


W = 15
CONT = 22

Caso contrario si escribiéramos la instrucción de la siguiente manera:


ADDWF CONT, W

En este momento los registros quedarían así:


W = 22
CONT = 7

Instrucciones para el PIC 16F877


2

Operación Esta instrucción realiza una operación lógica "AND" entre


2 ANDWF F,d
AND el registro "W" y el registro "F".

Para nuestro ejemplo vamos a trabajar con un registro llamado REGIS (Registro de
propósito general)
Por ejemplo:
Supongamos que W = 10101111 y REGIS = 00110100 entonces la expresión quedaría:

ANDWF REGIS,F

REGISTRO W 1 0 1 0 1 1 1 1
REGISTRO REGIS 0 0 1 1 0 1 0 0
RESULTADO 0 0 1 0 0 1 0 0

Al momento que ejecutamos esta instrucción los registros quedarían así:


W = 10101111
REGIS = 00100100

Hay que tener en cuenta que todos los registros son de 8 bits y que esta operación se
realiza bit a bit, es decir, el bit 7 de "W" con el Bit 7 de REGIS y así sucesivamente

3 COMF F,d Complemento de F Esta instrucción complementa el registro "F"

Tenemos un registro denominado VAR1 = 00111011; cuando aplicamos la instrucción


tenemos que los “0” se cambian por “1” y los “1” se cambian por “0” obteniéndose un
registro invertido. Si aplicamos la instrucción tenemos:

COMF VAR1, W

Los registros quedan de la siguiente manera:


VAR1 = 00111011
W = 11000100

Decremento del Esta instrucción decrementa en una unidad un


4 DECF F,d
registro F registro F

Por ejemplo: si nuestro registro REGIS = 14 y aplicamos la instrucción

DECF REGIS,F

El registro queda de la siguiente manera:

REGIS = 13

Instrucciones para el PIC 16F877


3

Decremento F y Esta instrucción decrementa el registro "F" y si


5 DECFSZ F,d
salta si es cero este llega a “0” entonces salta una instrucción

Veamos el siguiente ejemplo supongamos que el registro W = 3 Y CONT = 10 y tenemos


el siguiente código de programa:

DECFSZ VAR1,F
ADDWF CONT,F
DECF CONT,F

Primer caso: VAR1 >1 si es mayor que 1 esto indica que la primer instrucción decrementa
en 1 a VAR1 pero este no llega a cero por lo tanto no salta y ejecuta la instrucción de
adición y posteriormente la de decremento dando como resultado CONT=12.

Segundo caso: VAR1 = 1 si es igual a 1 esto indica que en la primer instrucción VAR1
llega a cero por lo tanto salta una instrucción llegando a la función de decremento
obteniendo como resultado CONT = 9

Esta instrucción incrementa en una


6 INCF F,d Incrementa el registro "F"
sola unidad el registro "F".

Supongamos que el registro REGIS = 23 y aplicamos la instrucción tenemos:

INCF REGIS,F

Esto quiere decir que el registro REGIS se incrementa en 1 y el resultado queda


almacenado en el mismo registro REGIS; Como resultado tenemos que REGIS = 24

Incrementa F y si Esta instrucción incrementa en una unidad el


7 INCFSZ F,d es igual a cero registro "F" y si este es igual a cero entonces
salta. salta una instrucción

Veamos el siguiente ejemplo supongamos que el registro W = 9 Y CONT = 14 y tenemos


el siguiente código de programa:

INCFSZ VAR1,F
ADDWF CONT,F
DECF CONT,F

Primer caso: VAR1 < 255 si es menor que 255 esto indica que la primer instrucción
incrementa en 1 a VAR1 pero no llega a cero por lo tanto no salta y ejecuta la instrucción
de adición y posteriormente la de decremento dando como resultado CONT=22.

Instrucciones para el PIC 16F877


4

Segundo caso: VAR1 = 255 esto indica que en la primer instrucción VAR1 llega a cero
debido a que todos los registros que se trabajan en este microcontrolador son de 8 bits y
el máximo valor que pueden tener es 255, cuando se intenta incrementar pasa de 255 a
00 debido a que 256 necesita 9 bits.

Este comando salta una instrucción llegando a la función de decremento obteniendo como
resultado CONT = 13

Operación Esta instrucción aplica la operación lógica OR entre el


8 IORWF f,d
OR registro de trabajo W y el registro F.

Para nuestro ejemplo vamos a trabajar con un registro llamado FILTRO (Registro de
propósito general)

Por ejemplo: supongamos que W = 10101001 y FILTRO = 00110101

IORWF FILTRO,W

REGISTRO W 1 0 1 0 1 0 0 1
REGISTRO FILTRO 0 0 1 1 0 1 0 1
RESULTADO 1 0 1 1 1 1 0 1

Al momento que ejecutamos esta instrucción los registros quedarían así:

W = 10111101
FILTRO = 00110101

Hay que tener en cuenta que todos los registros son de 8 bits y que esta operación se
realiza bit a bit, es decir, el bit 0 de "W" con el Bit 0 de FILTRO y así sucesivamente

Mueve el contenido del Esta instrucción mueve el contenido del registro


9 MOVF F,d
registro "F" "F" en el mismo registro "F" o en "W".

Esta instrucción saca una copia del registro "F" y la mueve al mismo registro "F" o hacia el
registro de trabajo "W". Por ejemplo si REGIS = 128 y aplicamos el comando:

MOVF REGIS, W

Tan solo se mueve el contenido de REGIS a W, donde REGIS conserva su valor y W


queda con una copia; W = 128.

Instrucciones para el PIC 16F877


5

10 MOVWF F Mueve W a F Mueve el contenido del registro W al registro F

Esta instrucción saca una copia del registro "W" y la mueve a un registro "F".
Por ejemplo si W = 215 y aplicamos el comando:

MOVWF REGIS

Tan solo se mueve el contenido de W a REGIS, donde W conserva su valor y REGIS


queda con una copia; REGIS = 215.

Únicamente se utiliza para mover valores del registro de trabajo a un registro de propósito
general

Rota a la Izquierda un Esta instrucción rota a la izquierda todos los


11 RLF F,d
registro F bits de un registro "F".

Esta Instrucción esta muy relacionada con la bandera Carry (C) perteneciente al registro
de estado (STATUS). La bandera C esta completando el anillo para cualquier tipo de
corrimiento sea a la izquierda o derecha

Carry

B7 B6 B5 B4 B3 B2 B1 B0

Por ejemplo, supongamos que CONT = 00001111 y que la bandera C tienen un 0;


cuando aplicamos el comando:

RLF CONT, F

Obtenemos que CONT = 00011110 resultado diferente si C tiene un 1 en este caso


tendríamos CONT = 00011111, en ambos caso Carry tomaría el valor de cero después de
la rotación; Esta instrucción es muy útil para multiplicar por 2 el valor de un registro.

Rota a la derecha un Esta instrucción rota a la derecha todos los bits


12 RRF F,d
registro F de un registro "F".

En esta Instrucción la bandera (C) cumple el mismo propósito que en el comando RLF
Con la diferencia que aquí se rota a la derecha

Carry

B7 B6 B5 B4 B3 B2 B1 B0
Instrucciones para el PIC 16F877
6

Por ejemplo, supongamos que CONT = 00001111 y que la bandera C tienen un 0;


cuando aplicamos el comando:

RRF CONT, F

Obtenemos que CONT = 00000111 y la bandera C = 1, el resultado es diferente si C tiene


un 1 en este caso tendríamos CONT = 10000111, y la bandera continuaría valiendo C = 1.
Esta instrucción es muy útil para dividir por 2 el valor de un registro.

13 SUBWF F,d F- W Resta el contenido del registro "W" del registro "F"

Esta instrucción cumple la función de restar el contenido del registro "W" del registro "F";
por ejemplo, supongamos que "W = 14 " y DATO = 20; cuando se aplica el comando

SUBWF DATO, W

Obtenemos como resultado la resta 20 - 14 y el resultado es almacenado en el


acumulador "W". Entonces los registros quedarían así:
W=6
DATO = 20
Hay que tener en cuenta también la bandera C puesto que ella sirve para hacer
comparaciones de magnitud entre registros, esta bandera se comporta así:

Si W > F entonces C = 0
Si W ≤ F entonces C = 1

En el primer caso el resultado de la operación da un número no equivalente a la magnitud


de la operación y la bandera C = 0 por ejemplo:
Si W = 10 y DATO = 4 y tenemos la instrucción:

SUBWF DATO,F

El resultado seria W = 10 puesto que se esta guardando el resultado en el mismo registro


y DATO = 250 debido a que el registro se desborda por la parte inferior y pasa de 0 a 255
y como la operación debe terminar de restar quita el resto de 255 por eso el resultado, hay
que tener en cuenta que C=0

Instrucciones para el PIC 16F877


7

Intercambio Se intercambian los 4 bits mas significativos con


14 SWAPF F,d
de Bits los 4 bits menos significativos del registro F

Esta instrucción intercambian los 4 bits más significativos con los 4 bits menos
significativos del registro F. Por ejemplo tenemos a VAR1= 00001101 cuando se aplica el
comando

SWAPF VAR1,F

El microcontrolador obtiene el resultado VAR1 = 11010000


Una característica muy importante de esta instrucción es que no afecta ninguna bandera
del registro de estado (STATUS).

Operación OR Este comando aplica la operación lógica de OR


15 XORWF F,d
exclusivo Exclusivo entre el registro W y el registro F

Por ejemplo tenemos W = 11010100 y REGIS = 11000011


Al ejecutar la instrucción tendríamos

XORWF REGIS,F

REGISTRO W 1 1 0 1 0 1 0 0
REGISTRO REGIS 1 1 0 0 0 0 1 1
RESULTADO 0 0 0 1 0 1 1 1

Entonces W = 11010100 y REGIS = 00010111


Esta operación esta muy ligada con la bandera cero (Z) para la comparación de dos
números y determinar cuando son iguales. Si dos números son iguales la operación
EX - OR daría como resultado “0” y cuando cualquier operación es cero la bandera Z = 1
Si no es 0 la bandera Z = 0

Instrucciones para el PIC 16F877


8

2. INSTRUCCIONES QUE TRABAJAN CON UN SOLO BIT DE UN REGISTRO

Pone a Cero un Este comando pone en Cero el Bit "b" del


16 BCF F,b
determinado Bit registro "F"

Cuando se aplica el comando BCF f,b el microcontrolador pone en cero un bit especifico
de un registro "F". Por ejemplo supongamos que tenemos un registro llamado REG y esta
cargado con el valor 11111111. Si se aplica el comando

BCF REG, 2

Quiere decir que el bit 2 del registro REG pasara a tener un valor de cero, entonces el
registro REG = 11111011

Pone a uno un Este comando pone a uno el Bit "b" del


17 BSF F,b
determinado Bit registro "F"

Esta instrucción hace lo contrario de la anterior, cuando se aplica el comando BSF f,b el
microcontrolador pone en “1” un bit especifico de un registro "F". Por ejemplo
supongamos que tenemos un registro llamado REG y esta cargado con el valor 00000000.
Si se aplica el comando

BSF REG, 7

Quiere decir que el bit 7 del registro REG pasara a tener un valor de “1”, entonces el
registro REG = 10000000

Mira el Bit b del Este comando mira el Bit "b" del registro "F" y
18 BTFSC F,b
registro F salta una linea si este bit se encuentra en 0.

Veamos el siguiente ejemplo supongamos que el registro CONT = 00001111 y tenemos


el siguiente código de programa:

BTFSC CONT, 4
BCF CONT, 0
BSF CONT,7

El bit 4 del registro CONT esta en “0” esto indica que de la primer instrucción el programa
salta a la tercera dando como resultado CONT = 10001111.

Instrucciones para el PIC 16F877


9

Mira el Bit b del Este comando mira el Bit "b" del registro "F" y
19 BTFSS F,b
registro F salta una linea si este bit se encuentra en 1.

Esta instrucción se comporta al contrario de la anterior; Veamos el siguiente ejemplo


supongamos que el registro CONT = 00001111 y tenemos el siguiente código de
programa:

BTFSS CONT, 0
BCF CONT, 2
BSF CONT,6

El bit 0 del registro CONT esta en “1” esto indica que de la primer instrucción el programa
salta a la tercera dando como resultado CONT = 01001111.

Instrucciones para el PIC 16F877


10

3. INSTRUCCIONES QUE TRABAJAN CON UN REGISTRO Y UN LITERAL

El literal es una constante que puede ir representada en diferentes sistemas numéricos, a


continuación veremos los más utilizados:

Decimal: .15 ó D’15’ en ambos casos se representa el numero 15 en decimal


Binario: B’00010001’ aquí estaría representado el numero 17 en binario
Hexadecimal: 0x05 ó H’5’ ambos casos se representa el numero 5 en hexadecimal

Suma de dos Este comando suma un valor de un literal o


20 ADDLW k
números constante al contenido del registro "W"

Este comando, toma el contenido de un literal o constante K y se lo suma al valor del


registro de trabajo "W"; por ejemplo: Supongamos que W = 23 y que tenemos un literal
k = 10; cuando se aplica el comando

ADDLW .10

El resultado es 33 y siempre queda almacenado en W, el punto antes del literal indica que
estamos definiendo un numero decimal, si estuviéramos definiendo un numero binario lo
tendríamos que poner así B’00001010’ pero igual son equivalentes.

21 ANDLW k Operación AND Operación lógica AND entre un literal y W

Esta instrucción, opera de la misma forma de la instrucción ANDWF antes explicada la


diferencia principal es que la operación se hace entre el registro W y un literal o constante.
Se realiza una operación lógica AND entre el registro "W" y el contenido del literal "k",
donde "k" es una constante que puede contener cualquier valor entre 0 y 255 asignado por
el programador.

Otra diferencia es que el resultado siempre es almacenado en el registro de trabajo W.

Operación Operación lógica entre el registro "W" y un literal o


22 IORLW k
OR constante "k"

Esta instrucción, opera de la misma forma de la instrucción IORWF antes explicada la


diferencia principal es que la operación se hace entre el registro W y un literal o constante.
Se realiza una operación lógica OR entre el registro "W" y el contenido del literal "k".

Instrucciones para el PIC 16F877


11

23 MOVLW k Mover literal Se carga el registro "W" con el contenido del literal "k"

Esta instrucción le servirá para tomar el contenido de un literal y cargarlo en el registro


"W"; donde "k" en una palabra cualquiera que tiene asignado un valor entre 0 y 255.

24 SUBLW k Resta W de k Resta el contenido del registro "W" de un literal "k"

Esta instrucción, opera de la misma forma de la instrucción SUBWF antes explicada la


diferencia principal es que la operación se hace entre el registro W y un literal o constante.
Se resta el valor del registro W al valor del literal "k".

La bandera Carry (C) se comporta de la misma manera antes explicada

Otra diferencia es que el resultado siempre es almacenado en el registro de trabajo W.|

Operación
25 XORLW k Operación lógica EX - OR entre el registro W y el literal "k"
EX - OR

Esta instrucción, opera de la misma forma de la instrucción XORWF antes explicada la


diferencia principal es que la operación se hace entre el registro W y un literal o constante.
Se realiza una operación lógica EX - OR entre el registro "W" y el contenido del literal "k.

26 CALL k llamar Llamada de una Subrutina con el nombre k

Podemos decir que una Subrutina es un pequeño programa que se utiliza muchas veces
en cualquier parte del programa. Las ventajas que ofrecen las subrutinas están referidas al
ahorro considerable de la memoria de programa y su fácil mantenimiento. A las subrutinas
se le podrá asignar cualquier nombre, y este es el nombre utilizado en la Instrucción CALL
como parámetro.

La instrucción CALL k va y ejecuta una subrutina, antes de ir hasta la subrutina ella


guarda la dirección del programa en la que se encuentra, para saber a donde debe
regresar una ves culminada la subrutina, esto lo hace en la pila del microcontrolador la
cual tiene 8 niveles, esto quiere decir que solo puede tener 8 CALL anidados.
Para volver a la parte del programa donde fue llamada la subrutina debe utilizar alguna de
las dos instrucciones denominadas RETURN y RETLW (Ver las siguientes dos
Instrucciones).

27 RETURN Retorno Retorna de una subrutina

Instrucciones para el PIC 16F877


12

La Instrucción RETURN es la encargada de volver al sitio donde fue llamada una subrutina
con la instrucción CALL. El comando RETURN saca la dirección a la que cual debe
volver, de la pila liberando así uno de sus niveles y retornando una línea debajo de la
instrucción CALL utilizada.
El procedimiento es prácticamente mecánico ya que usted deberá crear la subrutina y
darle el nombre para poder ser llamada; al final de las subrutinas se debe escribir la
instrucción denominada RETURN.

Retorno de subrutina y carga a "W" con el


28 RETLW k Retorno
contenido del literal "k"

El comando RETLW k se comporta igual al comando RETURN con la diferencia de que


esta carga un literal o constante "k" en el registro "W" cuando finaliza la subrutina.
Es muy utilizado para el manejo de tablas en un programa.

29 RETFIE Retorno Retorno de un llamado a interrupción

Esta Instrucción es parecida a la Instrucción RETURN, pero a diferencia de esta, RETFIE


es utilizada para volver de una interrupción, no importa de cual de la 14 fuentes de
interrupción sea, siempre se utiliza el mismo comando.

30 GOTO k Ir a El contador de programa salta a una dirección con el nombre "k"

Esta es una de la instrucción más fácil de entender y consiste tan solo en un salto a otra
parte del programa. Cuando se ejecuta el comando GOTO k, el microcontrolador salta a
la dirección "k", donde "k" es una etiqueta cualquiera.

4. INSTRUCCIONES GENERALES

Instrucciones para el PIC 16F877


13

32 SLEEP Dormir Entra en modo de reposo o bajo consumo.

Esta Instrucción le da la orden al microcontrolador de quedar en modo suspendido, en


este modo el PIC no ejecuta ninguna instrucción hasta que sea nuevamente reinicializado
(RESET) u ocurra alguna interrupción (no todas las interrupciones sacan de este estado al
pic).

33 CLRWDT Borra el contenido del registro llamado Watchdog Timer.

La instrucción CLRWDT borra el contenido del contador del perro guardián. Si usted activa
el Watchdog Timer, deberá asegurarse de ejecutar el comando CLRWDT antes de que el
contador se desborde, para que el microcontrolador no se reinicialice automáticamente;
esta función es muy útil en el caso que el microcontrolador se quede bloqueado.

Esta instrucción es muy ventajosa cuando se tienen instalados los sistemas en lugares
muy remotos y no puede enviarse a una persona para reinicializar el microcontrolador.

3 CLRF f Borra el registro Esta instrucción borra un registro específico.

Borrar un registro "F" cargándolo con el valor "00". Supongamos que tenemos un registro
denominado CONT = 54 antes de ejecutar la instrucción.

CLRF CONT

Al ejecutar la instrucción el contenido de CONT = 0

4 CLRW Borra el registro W Esta instrucción borra solamente el registro "W"

Cuando se ejecuta esta instrucción, el microcontrolador borra el registro "W" cargándolo


con "00".

13 NOP No operación Esta instrucción no ejecuta ningún tipo de acción.

La instrucción NOP no cumple ninguna tarea específica, pero consume 1 ciclo de maquina
el cual es Fosc/4. La utilidad más notoria es para rutinas de tiempo que requieren
exactitud y en algunos casos cuando están siendo ejecutadas le suele faltar algunos ciclos
de reloj adicionales para que sean exactas; es allí en donde debemos agregar algunas
instrucciones NOP.

Instrucciones para el PIC 16F877