Académique Documents
Professionnel Documents
Culture Documents
DESCRIPCIN
CDIGO OP
ADDWF f,d
w+fd
1,2
ANDWF f,d
w AND f d
1,2
CLRF
00 h f
CLRW
00 h w
COMF
f,d
Complemento de f d
1,2
DECF
f,d
f-1d
1,2
DECFSZ f,d
f - 1 d (si es 0 salta)
1(2)
1,2,3
INCF
f,d
f+1d
1,2
INCFSZ
f,d
f + 1 d (si es 0 salta)
1(2)
1,2,3
IORWF
f,d
w OR f d
1,2
MOVF
f,d
fd
1,2
MOVWF f
wf
NOP
No operacin
RLF
f,d
1,2
RRF
f,d
1,2
SUBWF
f,d
f-wd
1,2
SWAPF
f,d
1,2
w XOR f d
1,2
XORWF f,d
MNEMNICO
OPERANDOS
DESCRIPCIN
CDIGO OP
BCF
f,b
1,2
BSF
f,b
1,2
BTFSC
f,b
1(2)
BTFSS
f,b
1(2)
DESCRIPCIN
CDIGO OP
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
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
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
Ciclos
OPCODE
11
Descripcin
111x
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
kkkk
kkkk
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
ADDWF
ADDWF
ADD w to F
Operacin
w+fd
Sintaxis
Operadores
Ciclos
OPCODE
00
Descripcin
0111
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
dfff
ffff
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
w AND k w
Sintaxis
[Etiqueta] ANDLW k
Operadores
Ciclos
OPCODE
11
1001
kkkk
kkkk
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
Operadores
0< f <127
d [0,1]
Ciclos
OPCODE
00
Descripcin
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
BCF
BCF
Bit Clear F
Operacin
0 (f<b>)
Sintaxis
Operadores
0< f <127
0<b<7
Ciclos
OPCODE
01
Descripcin
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
Operadores
0< f <127
0<b<7
Ciclos
1
Su amigable compaero el Barra Bas
11bb
OPCODE
01
Descripcin
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
Salta si (f<b>) = 0
Sintaxis
Operadores
Ciclos
1 (2)
OPCODE
01
Descripcin
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
Salta si (f<b>) = 1
Sintaxis
Operadores
Ciclos
1 (2)
OPCODE
01
Descripcin
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>)
Sintaxis
[Etiqueta] CALL k
Operandos
0 = k = 2047
Ciclos
OPCODE
10
Descripcin
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
Ciclos
OPCODE
00
Descripcin
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
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
0001
0000
0011
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
CLRWDT
CLRWDT
Operacin
00 h WDT
1 T0#
1 PD#
Su amigable compaero el Barra Bas
Sintaxis
[Etiqueta] CLRWDT
Operadores
No tiene
Ciclos
OPCODE
00
Descripcin
0000
0110
0100
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
COMF
COMF
Complement f
Operacin
Complemento de f d
Sintaxis
Operadores
Ciclos
OPCODE
00
Descripcin
1001
dfff
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
Operadores
0< f <127
d [0,1]
Ciclos
OPCODE
00
Descripcin
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
Operadores
0< f <127
d [0.1]
Ciclos
1 (2)
OPCODE
00
Descripcin
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
Ciclos
2
Su amigable compaero el Barra Bas
OPCODE
10
1kkkk
kkkk
kkkk
Descripcin
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
Operadores
Ciclos
OPCODE
00
Descripcin
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
Operadores
Ciclos
1 (2)
OPCODE
00
Descripcin
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
w OR k w
Sintaxis
[Etiqueta] IORLW k
Operadores
Ciclos
OPCODE
11
Descripcin
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
Operadores
Ciclos
OPCODE
00
Descripcin
0100
dfff
ffff
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
MOVLW
MOVLW
Move literal to w
Operacin
kw
Sintaxis
[Etiqueta] MOVLW k
Operadores
Ciclos
OPCODE
11
Descripcin
00xx
kkkk
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
EJEMPLO:
MOVLW 0x5A
Al ejecutarse:
w = 5A h
kkkk
MOVF
MOVF
Move f
Operacin
fd
Sintaxis
Operadores
0
d [0,1]
Ciclos
OPCODE
00
Descripcin
<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
Ciclos
OPCODE
00
Descripcin
0000
1fff
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
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.
RETFIE
RETFIE
TOS PC
1 GIE
Sintaxis
[Etiqueta] RETFIE
Operadores
No tiene
Ciclos
OPCODE
00
Descripcin
0000
0000
1001
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
EJEMPLO:
RETFIE
Al ejecutarse:
PC = TOS
GIE = 1
RETLW
RETLW
k w;
TOS PC
Sintaxis
[Etiqueta] RETLW k
Operadores
Ciclos
OPCODE
11
Descripcin
01xx
kkkk
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
TOS PC
Sintaxis
[Etiqueta] RETURN
Operadores
No tiene
Ciclos
OPCODE
00
Descripcin
0000
0000
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
EJEMPLO:
RETURN
1000
RLF
RLF
Operacin
Sintaxis
Operadores
0
d [0,1]
Ciclos
OPCODE
00
Descripcin
<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
RRF
RRF
Rotate Right f through Carry
Operacin
Sintaxis
Operadores
0
d [0,1]
Ciclos
OPCODE
00
Descripcin
<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
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
SUBLW
SUBLW
k-ww
Sintaxis
[Etiqueta] SUBLW k
Operadores
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
SUBWF
SUBWF
Subtract w from f
Operacin
f-wd
Sintaxis
Operadores
Ciclos
OPCODE
00
Descripcin
0010
dfff
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
Operadores
Ciclos
OPCODE
00
Descripcin
1110
dfff
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
w XOR k w
Sintaxis
[Etiqueta] XORLW k
Operadores
Ciclos
OPCODE
11
Descripcin
1010
kkkk
Registro de STATUS
PA2
PA1
PA0
TO#
PD#
DC
kkkk
XORWF
XORWF
Exclusive OR w with f
Operacin
w XOR f d
Sintaxis
Operadores
Ciclos
Descripcin
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
OPTION
OPTION
w OPTION
Sintaxis
[Etiqueta] OPTION
Operadores
No tiene
Ciclos
OPCODE
00
Descripcin
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
w f(TRISA TRISB)
Sintaxis
[Etiqueta] TRIS f
Operadores
No tiene
Ciclos
OPCODE
00
Descripcin
0000
0110
1111
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.
; mueve 80h a W
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
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).
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
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.
MOVF Esto significa: Mueve el contenido del archivo 00 a 1F dentro y fuera del archivo o al
W.
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
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
Se puede rotar ms veces a la izquierda, lo que en buena lgica es lo mismo que hacer Reg *
2 * 2, etc.
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
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
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.
MOVWF 13h
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
;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