Altana Tubes > Blog > PIC16F627A/628A/648A > Instruções

15.0 Resumo do Conjunto de Instruções dos microcontroladores PIC16F627A, PIC16F628A e PIC16F648A

Tradução: Maria Elisa - Assessoria em Inglês e Alemão 

Revisão: Renato Kodaira

Cada instrução dos microcontroladores PIC16F627A, PIC16F628A e PIC16F648A é uma palavra de 14 bits dividida entre um código de instrução (OPCODE) que especifica o tipo de instrução e um ou mais operandos que especificam a operação da instrução. O resumo do conjunto de instruções dos microcontroladores PIC16F627APIC16F628A e PIC16F648A na Tabela 15.2 lista as operações orientadas a bytes, orientadas a bits e de controle com valores literais. A Tabela 15.1 apresenta as descrições do campo do código de instrução.

Para instruções orientadas a bytes, 'f' representa um designador de registrador de memória e 'd' representa um designador de destino. O designador de registrador de memória especifica qual registrador de memória será usado pela instrução.

O designador de destino especifica onde o resultado da operação será colocado. Se 'd' for zero, o resultado é colocado no registrador W, Se 'd' for um, o resultado é colocado no registrador de memória especificado na instrução.

Para instruções orientadas a bits, 'b' representa um designador de campo de bit, o qual seleciona o número do bit afetado pela operação, enquanto 'f' representa o número do registrador de memória no qual o bit é colocado.

Para operações de controle e com valores literais, 'k' representa uma constante ou valor literal de oito ou onze bits.

 

15.1 Operações Ler-Modificar-Escrever

Qualquer instrução que especifique um registrador de memória como parte da instrução resulta em uma operação do tipo Ler-Modificar-Escrever (Read-Modify-Write, R-M-W). O registrador é lido, os dados são modificados e o resultado é armazenado de acordo com a instrução ou com o designador de destino 'd'. Uma operação de leitura é executada em um registrador mesmo que a instrução execute uma escrita naquele registrador.

Por exemplo, uma instrução "clrf PORTB" executará uma leitura na PORTB, apagará todos os bits de dados, e então escreverá o resultado novamente na PORTB. Este exemplo teria o resultado não intencional de que a condição que ativa o sinalizador RBIF seria apagada para pinos que estiverem configurados como entrada e utilizando a propriedade interrupt-on-change da PORTB.

 

TABELA 15.1: DESCRIÇÕES DO CAMPO DO CÓDIGO DE INSTRUÇÃO

Campo Descrição
f Endereço do registrador de memória (0x00 até 0x7F)
W Registrador de trabalho (acumulador)
b Endereço do bit em um registrador de memória de 8 bits
k Campo literal, dados constantes ou label
x Posição "indiferente" ("don't care"); = 0 ou 1
O assembler gerará o código com x = 0. É a forma de utilização recomendada para compatibilidade com todas as ferramentas de software da Microchip.
d Seleção do destino;
d = 0: armazena o resultado em W,
d = 1: armazena o resultado no registrador do arquivo f.
O padrão é d = 1.
TO Bit de esgotamento de tempo (time-out)
PD Bit de desligamento (power-down)




O conjunto de instruções é estritamente ortogonal e é agrupado em três categorias básicas:

  • Operações orientadas aos bytes
  • Operações orientadas aos bits
  • Operações de controle e com valores literais

Todas as instruções são executadas em um único ciclo de instrução, a menos que um teste condicional resulte em verdadeiro ou que o contador do programa seja alterado como o resultado de uma instrução. Neste caso, a execução levará dois ciclos, sendo o segundo ciclo executado como um NOP. Um ciclo de instrução consiste em quatro períodos de oscilador. Portanto, para uma frequência de oscilador de 4 MHz, o tempo normal de execução da instrução é 1μs. Se um teste condicional resulta em verdadeiro ou se o contador do programa é alterado como resultado de uma instrução, o tempo de execução da instrução é 2μs.

A Tabela 15.2 lista as instruções reconhecidas pelo assembler MPASM™.

A Figura 15.1 apresenta os três formatos genéricos que as instruções podem ter.

Nota 1: Qualquer código de instrução não-utilizado é reservado. A utilização de qualquer código de instrução reservado pode causar uma operação não esperada.

Nota 2: Para manter uma compatibilidade constante com os futuros produtos PIC MCU, não utilize as instruções OPTION e TRIS.

Todos os exemplos utilizam o seguinte formato para representar um número hexadecimal:
0xhh
onde 'h' significa um dígito hexadecimal.

 

FIGURA 15.1: FORMATO GENÉRICO PARA AS INSTRUÇÕES



 

TABELA 15.2: CONJUNTO DE INSTRUÇÕES DOS PIC16F627A/628A/648A

Mnemônico, Operandos Descrição Ciclos Código de Instrução de 14 Bits Bits de Status Afetados Notas
MSb     LSb

OPERAÇÕES ORIENTADAS AOS BYTES DO REGISTRADOR DE MEMÓRIA
ADDWF f,d Soma os valores de W e f 1 00 0111 dfff ffff C, DC, Z 1, 2
ANDWF f,d Realiza a operação lógica "E" entre os valores de W e f 1 00 0101 dfff ffff Z 1, 2
CLRF f Apaga f 1 00 0001 1fff ffff Z 2
CLRW --- Apaga W 1 00 0001 0xxx xxxx Z  
COMF f,d Complementa o valor de f 1 00 1001 dfff ffff Z 1, 2
DECF f,d Diminui uma unidade do valor de f 1 00 0011 dfff ffff Z 1, 2
DECFSZ f,d Diminui uma unidade do valor de f, pula a instrução seguinte se o resultado for 0 1(2) 00 1011 dfff ffff   1, 2, 3
INCF f,d Aumenta uma unidade do valor de f 1 00 1010 dfff ffff Z 1, 2
INCFSZ f,d Aumenta uma unidade do valor de f, pula a instrução seguinte se o resultado for 0 1(2) 00 1111 dfff ffff   1, 2, 3
IORWF f,d Realiza a operação lógica "OU" entre os valores de W e f 1 00 0100 dfff ffff Z 1, 2
MOVF f,d Move o valor de f 1 00 1000 dfff ffff Z 1, 2
MOVWF f Move o valor de W para f 1 00 0000 1fff ffff    
NOP --- Nenhuma operação 1 00 0000 0xx0 0000    
RLF f,d Rotaciona o valor de f para a esquerda através do bit Carry 1 00 1101 dfff ffff C 1, 2
RRF f,d Rotaciona o valor de f para a direita através do bit Carry 1 00 1100 dfff ffff C 1, 2
SUBWF f,d Subtrai o valor de W do valor de f 1 00 0010 dfff ffff C, DC, Z 1, 2
SWAPF f,d Troca os nibbles em f 1 00 1110 dfff ffff   1, 2
XORWF f,d Realiza a operação lógica "OU EXCLUSIVO" entre os valores de W e f 1 00 0110 dfff ffff Z 1, 2

OPERAÇÕES ORIENTADAS AOS BITS DO REGISTRADOR DE MEMÓRIA
BCF f,b Apaga o bit de f 1 01 00bb bfff ffff   1, 2
BSF f,b Ativa o bit de f 1 01 01bb bfff ffff   1, 2
BTFSC f,b Testa o bit de f, pula a instrução seguinte se o bit estiver apagado 1(2) 01 10bb bfff ffff   3
BTFSS f,b Testa o bit de f, pula a instrução seguinte se o bit estiver ativado 1(2) 01 11bb bfff ffff   3

OPERAÇÕES DE CONTROLE E COM VALORES LITERAIS
ADDLW k Soma o valor literal com o valor de W 1 11 111x kkkk kkkk C, DC, Z  
ANDLW k Realiza a operação lógica "E" entre o valor literal e o valor de W 1 11 1001 kkkk kkkk Z  
CALL k Chama a subrotina 2 10 0kkk kkkk kkkk    
CLRWDT --- Apaga o Temporizador Cão-de-Guarda 1 00 0000 0110 0100 TO, PD  
GOTO k Vai para o endereço 2 10 1kkk kkkk kkkk    
IORLW k Realiza a operação lógica "OU" entre o valor literal e o valor de W 1 11 1000 kkkk kkkk Z  
MOVLW k Move o valor literal para W 1 11 00xx kkkk kkkk    
RETFIE --- Retorna da interrupção 2 00 0000 0000 1001    
RETLW k Retorna com o valor literal em W 2 11 01xx kkkk kkkk    
RETURN --- Retorna da subrotina 2 00 0000 0000 1000    
SLEEP --- Vai para o modo de Hibernação 1 00 0000 0110 0011 TO, PD  
SUBLW k Subtrai o valor de W do valor literal 1 11 110x kkkk kkkk C, DC, Z  
XORLW k Realiza a operação lógica "OU EXCLUSIVO" entre o valor literal e o valor de W 1 11 1010 kkkk kkkk Z  

Notas:
1:
Quando um registrador de I/O for modificado em função dele mesmo (p. ex. MOVF PORTB, 1), o valor utilizado será aquele presente nos próprios pinos. Por exemplo, se a latch de dados for '1' para um pino configurado como entrada e for levada para baixo por um dispositivo externo, os dados serão escritos de volta com um '0'.
2: Se esta instrução for executada no registrador TMR0 (e, quando aplicável, d = 1), o prescaler será apagado se designado para o módulo Timer0.
3: Se o Contador do Programa (PC) for modificado ou um teste condicional for verdadeiro, a instrução requer dois ciclos. O segundo ciclo é executado como uma NOP.

 

15.2 Descrição das Instruções

ADDLW Soma o Valor Literal com o Valor de W
Sintaxe: [rótulo] ADDLW k
Operandos: 0 ≤ k ≤ 255
Operação: (W) + k → (W)
Bits de Status Afetados: C, DC, Z
Codificação:
11 111x kkkk kkkk
Descrição: O conteúdo do registrador W é adicionado ao valor literal 'k' de oito bits e o resultado é colocado no registrador W.
Palavras: 1
Ciclos: 1
Exemplo
ADDLW    0x15
  Antes da Instrução
 
  W = 0x10
  Depois da Instrução
 
  W = 0x25

 

ADDWF Soma os Valores de W e f
Sintaxe: [rótulo] ADDWF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (W) + (f) → (dest)
Bits de Status Afetados: C, DC, Z
Codificação:
00 0111 dfff ffff
Descrição: Adiciona o conteúdo do registrador W com o registrador 'f'. Se 'd' for '0', o resultado é armazenado no registrador W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
ADDWF    REG1,	0
  Antes da Instrução
 
  W = 0x17
REG1 = 0xC2
  Depois da Instrução
 
  W = 0xD9
REG1 = 0xC2
Z = 0
C = 0
DC = 0

 

ANDLW Realiza a Operação Lógica "E" entre o Valor Literal e o Valor de W
Sintaxe: [rótulo] ANDLW k
Operandos: 0 ≤ k ≤ 255
Operação: (W) .AND. (k) → (W)
Bits de Status Afetados: Z
Codificação:
11 1001 kkkk kkkk
Descrição: Uma operação 'E' lógica é executada entre o conteúdo do registrador W e o valor literal 'k' de oito bits. O resultado é colocado no registrador W.
Palavras: 1
Ciclos: 1
Exemplo
ANDLW    0x5F
  Antes da Instrução
 
  W = 0xA3
  Depois da Instrução
 
  W = 0x03

 

ANDWF Realiza a Operação Lógica "E" entre os Valores de W e f
Sintaxe: [rótulo] ANDWF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (W) .AND. (f) → (dest)
Bits de Status Afetados: Z
Codificação:
00 0101 dfff ffff
Descrição: Uma operação 'E' lógica é executada entre o registrador W e o registrador 'f'. Se 'd' for '0', o resultado é armazenado no registrador W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
ANDWF    REG1,	1
  Antes da Instrução
 
  W = 0x17
REG1 = 0xC2
  Depois da Instrução
 
  W = 0x17
REG1 = 0x02

 

BCF Apaga o Bit de f
Sintaxe: [rótulo] BCF f,b
Operandos:
 
0 ≤ f ≤ 127
0 ≤ b ≤ 7
Operação: 0 → (f<b>)
Bits de Status Afetados: Nenhum
Codificação:
01 00bb bfff ffff
Descrição: O bit 'b' no registrador 'f' é apagado.
Palavras: 1
Ciclos: 1
Exemplo
BCF    REG1,	7
  Antes da Instrução
 
  REG1 = 0xC7
  Depois da Instrução
 
  REG1 = 0x47

 

BSF Ativa o Bit de f
Sintaxe: [rótulo] BSF f,b
Operandos:
 
0 ≤ f ≤ 127
0 ≤ b ≤ 7
Operação: 1 → (f<b>)
Bits de Status Afetados: Nenhum
Codificação:
01 01bb bfff ffff
Descrição: O bit 'b' no registrador 'f' é ativado.
Palavras: 1
Ciclos: 1
Exemplo
BSF    REG1,	7
  Antes da Instrução
 
  REG1 = 0x0A
  Depois da Instrução
 
  REG1 = 0x8A

 

BTFSC Testa o Bit de f, Pula a Instrução Seguinte se o Bit Estiver Apagado
Sintaxe: [rótulo] BTFSC f,b
Operandos:
 
0 ≤ f ≤ 127
0 ≤ b ≤ 7
Operação: pula se (f<b>) = 0
Bits de Status Afetados: Nenhum
Codificação:
01 10bb bfff ffff
Descrição: Se o bit 'b' no registrador 'f' for '0', então a próxima instrução é pulada. Se o bit 'b' for '0', então a próxima instrução acessada durante a execução da instrução atual é descartada, e uma NOP é executada ao invés dela, fazendo desta uma instrução de dois ciclos.
Palavras: 1
Ciclos: 1(2)
Exemplo


 
HERE    BTFSC	REG1
FALSE	GOTO	PROCESS_CODE
TRUE	.
        .
        .
  Antes da Instrução
 
  PC = endereço HERE
  Depois da Instrução
 
  se REG<1> = 0,
PC = endereço TRUE
se REG<1> = 1,
PC = endereço FALSE

 

BTFSS Testa o Bit de f, Pula a Instrução Seguinte se o Bit Estiver Ativado
Sintaxe: [rótulo] BTFSS f,b
Operandos:
 
0 ≤ f ≤ 127
0 ≤ b < 7
Operação: pula se (f<b>) = 1
Bits de Status Afetados: Nenhum
Codificação:
01 11bb bfff ffff
Descrição: Se o bit 'b' no registrador 'f' for '1', então a próxima instrução é pulada. Se o bit 'b' for '1', então a próxima instrução acessada durante a execução da instrução atual é descartada, e uma NOP é executada ao invés dela, fazendo desta uma instrução de dois ciclos.
Palavras: 1
Ciclos: 1(2)
Exemplo


 
HERE    BTFSS	REG1
FALSE	GOTO	PROCESS_CODE
TRUE	.
        .
        .
  Antes da Instrução
 
  PC = endereço HERE
  Depois da Instrução
 
  se FLAG<1> = 0,
PC = endereço FALSE
se FLAG<1> = 1,
PC = endereço TRUE

 

CALL Chama a Subrotina
Sintaxe: [rótulo] CALL k
Operandos: 0 ≤ k ≤ 2047
Operação:

 
(PC) + 1 → TOS,
k → PC<10:0>,
(PCLATH<4:3>) → PC<12:11>
Bits de Status Afetados: Nenhum
Codificação:
10 0kkk kkkk kkkk
Descrição: Chama a subrotina. Primeiramente, o endereço de retorno (PC + 1) é colocado na pilha. O endereço imediato do bit onze é carregado nos bits <10:0> do PC. Os bits mais altos do PC são carregados a partir do PCLATH. A CALL é uma instrução de dois ciclos.
Palavras: 1
Ciclos: 2
Exemplo
HERE    CALL	THERE
  Antes da Instrução
 
  PC = endereço HERE
  Depois da Instrução
 
  PC = endereço THERE
TOS = endereço THERE + 1

 

CLRF Apaga f
Sintaxe: [rótulo] CLRF f
Operandos: 0 ≤ f ≤ 127
Operação:
 
00h → (f)
1 → Z
Bits de Status Afetados: Z
Codificação:
00 0001 1fff ffff
Descrição: O conteúdo do registrador 'f' é apagado e o bit Z é ativado.
Palavras: 1
Ciclos: 1
Exemplo
CLRF	REG1
  Antes da Instrução
 
  REG1 = 0x5A
  Depois da Instrução
 
  REG1 = 0x00
Z = 1

 

CLRW Apaga W
Sintaxe: [rótulo] CLRW
Operandos: Nenhum
Operação:
 
00h → (W)
1 → Z
Bits de Status Afetados: Z
Codificação:
00 0001 0000 0011
Descrição: O registrador W é apagado. O bit zero (Z) é ativado.
Palavras: 1
Ciclos: 1
Exemplo
CLRW
  Antes da Instrução
 
  W = 0x5A
  Depois da Instrução
 
  W = 0x00
Z = 1

 

CLRWDT Apaga o Temporizador Cão-de-Guarda
Sintaxe: [rótulo] CLRWDT
Operandos: Nenhum
Operação:


 
00h → WDT
0 → pré-scaler de W
1 → TO
1 → PD
Bits de Status Afetados: TO, PD
Codificação:
00 0000 0110 0100
Descrição: A instrução CLRWDT reinicializa o Temporizador Cão-de-Guarda. Ela também reinicializa o pré-scaler do WDT. Os bits de status TO e PD são ativados.
Palavras: 1
Ciclos: 1
Exemplo
CLRWDT
  Antes da Instrução
 
  contador do WDT = ?
  Depois da Instrução
 
  contador do WDT = 0x00
pré-scaler do WDT = 0
TO = 1
PD = 1

 

COMF Complementa o valor de f
Sintaxe: [rótulo] COMF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) → (dest)
Bits de Status Afetados: Z
Codificação:
00 1001 dfff ffff
Descrição: O conteúdo do registrador 'f' é complementado. Se 'd' for '0', o resultado é armazenado em W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
COMF	REG1,	0
  Antes da Instrução
 
  REG1 = 0x13
  Depois da Instrução
 
  REG1 = 0x13
W = 0xEC

 

DECF Diminui uma Unidade do Valor de f
Sintaxe: [rótulo] DECF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) - 1 → (dest)
Bits de Status Afetados: Z
Codificação:
00 0011 dfff ffff
Descrição: Decrementa uma unidade do valor do registrador 'f'. Se 'd' for '0', o resultado é armazenado no registrador W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
DECF	CNT,	1
  Antes da Instrução
 
  CNT = 0x01
Z = 0
  Depois da Instrução
 
  CNT = 0x00
Z = 1

 

DECFSZ Diminui uma Unidade do Valor de f, Pula a Instrução Seguinte se o Resultado for 0
Sintaxe: [rótulo] DECFSZ f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) - 1 → (dest); pula se resultado = 0
Bits de Status Afetados: Nenhum
Codificação:
00 1011 dfff ffff
Descrição: O conteúdo do registrador 'f' é decrementado em uma unidade. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é colocado de volta no registrador 'f'. Se o resultado for '0', a próxima instrução, que já está acessada, é descartada. Uma NOP é executada ao invés dela, fazendo desta uma instrução de dois ciclos.
Palavras: 1
Ciclos: 1(2)
Exemplo


 
HERE      DECFSZ	REG1,	1
          GOTO	LOOP
CONTINUE  .
          .
          .
  Antes da Instrução
 
  PC = endereço HERE
  Depois da Instrução
 
  REG1 = REG1 - 1
se REG1 = 0,
PC = endereço CONTINUE
se REG1 ≠ 0,
PC = endereço HERE + 1

 

GOTO Desvio Incondicional
Sintaxe: [rótulo] GOTO k
Operandos: 0 ≤ k ≤ 2047
Operação:
 
k → PC<10:0>
PCLATH<4:3> → PC<12:11>
Bits de Status Afetados: Nenhum
Codificação:
10 1kkk kkkk kkkk
Descrição: A instrução GOTO é um desvio incondicional. O valor imediato do décimo primeiro bit é carregado para os bits do PC <10:0>. Os bits superiores do PC são carregados a partir do PCLATH<4:3>. A GOTO é uma instrução de dois ciclos.
Palavras: 1
Ciclos: 2
Exemplo
GOTO	THERE
  Depois da Instrução
 
  PC = endereço THERE

 

INCF Aumenta uma Unidade do Valor de f
Sintaxe: [rótulo] INCF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) + 1 → (dest)
Bits de Status Afetados: Z
Codificação:
00 1010 dfff ffff
Descrição: O conteúdo do registrador 'f' é incrementado de uma unidade. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é colocado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
INCF	REG1,	1
  Antes da Instrução
 
  REG1 = 0xFF
Z = 0
  Depois da Instrução
 
  REG1 = 0x00
Z = 1

 

INCFSZ Aumenta uma Unidade do Valor de f, Pula a Instrução Seguinte se o Resultado for 0
Sintaxe: [rótulo] INCFSZ f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) + 1 → (dest), pula se resultado = 0
Bits de Status Afetados: Nenhum
Codificação:
00 1111 dfff ffff
Descrição: O conteúdo do registrador 'f' é incrementado de uma unidade. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é colocado de volta no registrador 'f'. Se o resultado for '0', a próxima instrução, que já está acessada, é descartada. Uma instrução NOP é executada ao invés dela, fazendo desta uma instrução de dois ciclos.
Palavras: 1
Ciclos: 1(2)
Exemplo


 
HERE      INCFSZ	REG1,	1
          GOTO	LOOP
CONTINUE  .
          .
          .
  Antes da Instrução
 
  PC = endereço HERE
  Depois da Instrução
 
  REG1 = REG1 + 1
se CNT = 0,
PC = endereço CONTINUE
se REG1 ≠ 0,
PC = endereço HERE + 1

 

IORLW Realiza a Operação Lógica "OU" entre o Valor Literal e o Valor de W
Sintaxe: [rótulo] IORLW k
Operandos: 0 ≤ k ≤ 255
Operação: (W) .OR. k → (W)
Bits de Status Afetados: Z
Codificação:
11 1000 kkkk kkkk
Descrição: É realizada a operação lógica "OU" entre o conteúdo do registrador W e o valor literal 'k' de oito bits. O resultado é colocado no registrador W.
Palavras: 1
Ciclos: 1
Exemplo
IORLW	0x35
  Antes da Instrução
 
  W = 0x9A
  Depois da Instrução
 
  W = 0xBF
Z = 0

 

IORWF Realiza a Operação Lógica "OU" entre os Valores de W e f
Sintaxe: [rótulo] IORWF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (W) .OR. (f) → (dest)
Bits de Status Afetados: Z
Codificação:
00 0100 dfff ffff
Descrição: É realizada a operação lógica "OU" entre o registrador W e o registrador 'f'. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é colocado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
IORWF	REG1,	0
  Antes da Instrução
 
  REG1 = 0x13
W = 0x91
  Depois da Instrução
 
  REG1 = 0x13
W = 0x93
Z = 1

 

MOVLW Move o Valor Literal para W
Sintaxe: [rótulo] MOVLW k
Operandos: 0 ≤ k ≤ 255
Operação: k → (W)
Bits de Status Afetados: Nenhum
Codificação:
11 00xx kkkk kkkk
Descrição: O valor literal 'k' de oito bits é carregado para o registrador W. Os bits "indiferentes" (don´t care's) serão montados como '0's pelo assembler
Palavras: 1
Ciclos: 1
Exemplo
MOVLW	0x5A
  Depois da Instrução
 
  W = 0x5A

 

MOVF Move o Valor de f
Sintaxe: [rótulo] MOVF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) → (dest)
Bits de Status Afetados: Z
Codificação:
00 1000 dfff ffff
Descrição: O conteúdo do registrador 'f' é movido para um destino que depende do status de 'd'. Se d = 0, o destino é o registrador W. Se d = 1, o destino é o próprio registrador de memória f. d = 1 é útil para se testar um registrador de memória, tendo em vista que o sinalizador de status Z é afetado.
Palavras: 1
Ciclos: 1
Exemplo
MOVF	REG1,	0
  Depois da Instrução
 
  W = valor no registrador REG1
Z = 1

 

MOVWF Move o Valor de W para f
Sintaxe: [rótulo] MOVWF f
Operandos: 0 ≤ f ≤ 127
Operação: (W) → (f)
Bits de Status Afetados: Nenhum
Codificação:
00 0000 1fff ffff
Descrição: Move os dados do registrador W para o registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
MOVWF	REG1
  Antes da Instrução
 
  REG1 = 0xFF
W = 0x4F
  Depois da Instrução
 
  REG1 = 0x4F
W = 0x4F

 

NOP Nenhuma Operação
Sintaxe: [rótulo] NOP
Operandos: Nenhum
Operação: Nenhuma operação
Bits de Status Afetados: Nenhum
Codificação:
00 0000 0xx0 0000
Descrição: Nenhuma operação.
Palavras: 1
Ciclos: 1
Exemplo
NOP

 

OPTION Carrega o Registrador de Opção
Sintaxe: [rótulo] OPTION
Operandos: Nenhum
Operação: (W) → OPTION
Bits de Status Afetados: Nenhum
Codificação:
00 0000 0110 0010
Descrição: O conteúdo do registrador W é carregado no registrador OPTION (registrador de opção), Esta instrução é suportada por compatibilidade de código com os produtos PIC16C5X. Como o OPTION é um registrador de leitura e escrita, o usuário pode endereçá-lo diretamente utilizando somente uma instrução de registrador tal como MOVWF.
Palavras: 1
Ciclos: 1
Exemplo  
  Para manter uma compatibilidade constante com os futuros produtos PIC® MCU, não utilize esta instrução.

 

RETFIE Retorna da Interrupção
Sintaxe: [rótulo] RETFIE
Operandos: Nenhum
Operação:
 
TOS → PC,
1 → GIE
Bits de Status Afetados: Nenhum
Codificação:
00 0000 0000 1001
Descrição: Retorna da interrupção. A pilha é descarregada (POPed) e o topo da mesma (TOS = Top-of-Stack) é carregado no PC. Interrupções são habilitadas ativando-se o bit de Habilitação de Interrupção Global (Global Interrupt Enable), GIE (INTCON<7>). Esta é uma instrução de dois ciclos.
Palavras: 1
Ciclos: 2
Exemplo
RETFIE
  Depois da Interrupção
 
  PC = TOS
GIE = 1

 

RETLW Retorna com Valor Literal em W
Sintaxe: [rótulo] RETLW k
Operandos: 0 ≤ k ≤ 255
Operação:
 
k → (W);
TOS → PC
Bits de Status Afetado: Nenhum
Codificação:
11 01xx kkkk kkkk
Descrição: O registrador W é carregado com o valor literal 'k' de oito bits. O contador do programa é carregado a partir do topo da pilha (o endereço de retorno). Esta é uma instrução de dois ciclos.
Palavras: 1
Ciclos: 2
Exemplo










 
       CALL TABLE    ;W contém o valor
                     ;do offset da tabela
       .             ;W possui agora o valor da tabela
       .
       .
TABLE  
       ADDWF PC      ;W = offset
       RETLW k1      ;Inicio da tabela
       RETLW k2      ;
       .
       .
       .
       RETLW kn      ;Fim da tabela
	   
  Antes da Instrução
 
  W = 0x07
  Depois da Instrução
 
  W = valor de k8

 

RETURN Retorna da Subrotina
Sintaxe: [rótulo] RETURN
Operandos: Nenhum
Operação: TOS → PC
Bits de Status Afetados: Nenhum
Codificação:
00 0000 0000 1000
Descrição: Retorna da subrotina. A pilha é é descarregada (POPed) e o topo da mesma (TOS = top of the stack) é carregado para o contador do programa PC. Esta é uma instrução de dois ciclos.
Palavras: 1
Ciclos: 2
Exemplo
RETURN
  Depois da Interrupção
 
  PC = TOS

 

RLF Rotaciona o Valor de f para a Esquerda através do Bit Carry
Sintaxe: [rótulo] RLF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: Veja descrição abaixo
Bits de Status Afetados: C
Codificação:
00 1101 dfff ffff
Descrição: O conteúdo do registrador 'f' é rotacionado para a esquerda em um bit, através do Sinalizador Carry. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
 
Palavras: 1
Ciclos: 1
Exemplo
RLF	REG1,	0
  Antes da Instrução
 
  REG1 = 1110 0110
C = 0
  Depois da Instrução
 
  REG1 = 1110 0110
W = 1100 1100
C = 1

 

RRF Rotaciona o Valor de f para a Direita através do Bit Carry
Sintaxe: [rótulo] RRF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: Veja descrição abaixo
Bits de Status Afetados: C
Codificação:
00 1100 dfff ffff
Descrição: O conteúdo do registrador 'f' é rotacionado para a direita em um bit, através do Sinalizador Carry. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é colocado de volta no registrador 'f'.
 
Palavras: 1
Ciclos: 1
Exemplo
RRF	REG1,	0
  Antes da Instrução
 
  REG1 = 1110 0110
C = 0
  Depois da Instrução
 
  REG1 = 1110 0110
W = 0111 0011
C = 0

 

SLEEP  
Sintaxe: [rótulo] SLEEP
Operandos: Nenhum
Operação:


 
00h → WDT,
0 → pré-scaler do WDT
1 → TO,
0 → PD
Bits de Status Afetados: TO, PD
Codificação:
00 0000 0110 0011
Descrição: O bit de Status de desativação, PD, é apagado. O bit de Status de esgotamento de tempo, TO, é ativado. O Temporizador Cão-de-Guarda e o seu pré-scaler são apagados. O processador é colocado no modo de Hibernação, com o oscilador parado. Veja a Seção 14.8 "Modo de Desativação (Hibernação)" para mais detalhes
Palavras: 1
Ciclos: 1
Exemplo
SLEEP

 

SUBLW Subtrai o Valor de W do Valor Literal
Sintaxe: [rótulo] SUBLW k
Operandos: 0 ≤ k ≤ 255
Operação: k - (W) → (W)
Bits de Status Afetados: C, DC, Z
Codificação:
11 110x kkkk kkkk
Descrição: O valor do registrador W é subtraído (método do complemento dos 2's) do valor literal 'k' de oito bits. O resultado é colocado no registrador W.
Palavras: 1
Ciclos: 1
Exemplo 1:
SUBLW	0x02
  Antes da Instrução
 
  W = 1
C = ?
  Depois da Instrução
 
  W = 1
C = 1; resultado é positivo
Exemplo 2: Antes da Instrução
 
  W = 2
C = ?
  Depois da Instrução
 
  W = 0
C = 1; resultado é zero
Exemplo 3: Antes da Instrução
 
  W = 3
C = ?
  Depois da Instrução
 
  W = 0xFF
C = 0; resultado é negativo

 

SUBWF Subtrai o Valor de W do Valor de f
Sintaxe: [rótulo] SUBWF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (f) - (W) → (dest)
Bits de Status Afetados: C, DC, Z
Codificação:
00 0010 dfff ffff
Descrição: Subtrai (método do complemento dos 2's) o valor do registrador W do valor do registrador 'f'. Se 'd' for '0', o resultado é armazenado no registrador W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo 1:
SUBWF	REG1,	1
  Antes da Instrução
 
  REG1 = 3
W = 2
C = ?
  Depois da Instrução
 
  REG1 = 1
W = 2
C = 1; resultado é positivo
DC = 1
Z = 0
Exemplo 2: Antes da Instrução
 
  REG1 = 2
W = 2
C = ?
  Depois da Instrução
 
  REG1 = 0
W = 2
C = 1; resultado é zero
Z = DC = 1
Exemplo 3: Antes da Instrução
 
  REG1 = 1
W = 2
C = ?
  Depois da Instrução
 
  REG1 = 0xFF
W = 2
C = 0; resultado é negativo
Z = DC = 0

 

SWAPF Troca os Nibbles em f
Sintaxe: [rótulo] SWAPF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação:
 
(f<3:0>) → (dest<7:4>),
(f<7:4>) → (dest<3:0>)
Bits de Status Afetados: Nenhum
Codificação:
00 1110 dfff ffff
Descrição: Os nibbles superiores e inferiores do registrador 'f' são trocados entre si. Se 'd' for '0', o resultado é colocado no registrador W. Se 'd' for '1', o resultado é colocado no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
SWAPF	REG1,	0
  Antes da Instrução
 
  REG1 = 0xA5
  Depois da Instrução
 
  REG1 = 0xA5
W = 0x5A

 

TRIS Carrega o Registrador TRIS
Sintaxe: [rótulo] TRIS f
Operandos: 5 ≤ f ≤ 7
Operação: (W) → registrador 'f' TRIS;
Bits de Status Afetados: Nenhum
Codificação:
00 0000 0110 0fff
Descrição: A instrução é suportada por compatibilidade de código com os produtos PIC16C5X. Como os registradores TRIS são de leitura e de escrita, o usuário pode endereçá-los diretamente.
Palavras: 1
Ciclos: 1
Exemplo  
  Para manter uma compatibilidade constante com os futuros produtos PIC® MCU, não utilize esta instrução.

 

XORLW Realiza a Operação Lógica "OU EXCLUSIVO" entre o Valor Literal e o Valor de W
Sintaxe: [rótulo] XORLW k
Operandos: 0 ≤ k ≤ 255
Operação: (W) .XOR. k → (W)
Bits de Status Afetados: Z
Codificação:
11 1010 kkkk kkkk
Descrição: É realizada a operação lógica "OU EXCLUSIVO" entre o conteúdo do registrador W e o valor literal 'k' de oito bits. O resultado é colocado no registrador W.
Palavras: 1
Ciclos: 1
Exemplo
XORLW	0xAF
  Antes da Instrução
 
  W = 0xB5
  Depois da Instrução
 
  W = 0x1A

 

XORWF Realiza a Operação Lógica "OU EXCLUSIVO" entre os Valores de W e f
Sintaxe: [rótulo] XORWF f,d
Operandos:
 
0 ≤ f ≤ 127
d ∈ [0,1]
Operação: (W) .XOR. (f) → (dest)
Bits de Status Afetados: Z
Codificação:
00 0110 dfff ffff
Descrição: É realizada a operação lógica "OU EXCLUSIVO" entre o conteúdo do registrador W e o registrador 'f'. Se 'd' for '0', o resultado é armazenado no registrador W. Se 'd' for '1', o resultado é armazenado de volta no registrador 'f'.
Palavras: 1
Ciclos: 1
Exemplo
XORWF	REG1,	1
  Antes da Instrução
 
  REG1 = 0xAF
W = 0xB5
  Depois da Instrução
 
  REG1 = 0x1A
W = 0xB5
<-Anterior Índice Próximo->