Vous êtes sur la page 1sur 12

Universidade Paulista Prof.

Assis 1

Capítulo 2 - Conjunto de Instruções

As seguintes convenções serão utilizadas para descrever o conjunto de instruções do PIC:

k = número inteiro na faixa de 0 a 255;


f = registrador genérico;
d = bit, cujo conteúdo é 0 ou 1;
b = bit, qualquer posição dentro de um registrador cujo valor está entre 0 e 7;
w = registrador especial utilizado em operações lógicas ou matemáticas;

O conjunto de instruções será dividido nas seguintes partes:

1- Instruções para mover dado

1.1 MOVLW - move dado imediato para o acumulador

Sintaxe: MOVLW k
Descrição: o byte imediato a instrução,k , é carregado para o acumulador W
Flags Afetados: nenhum
Exemplo:
MOVLW 0x20 ; a informação 0x20 é carregada para
; o registrador W,ou seja após a instrução
; W=0x20

W:

0 0 1 0 0 0 0 0

1.2 MOVWF – move dado do acumulador para o um registrador

Sintaxe: MOVWF f
Descrição: move o conteúdo do acumulador W para o registrador f, sem alterar o
conteúdo do acumulador W
Flags Afetados: nenhum
Exemplo:
REG equ 0x20 ; registrador da posição 0x20
MOVLW 0x50 ; acumulador W possuí 0x50
MOVWF REG ; agora no registrador da posição 0x20
; tem-se o valor 0x50

W: 0x50
memória interna do PIC

Endereço conteúdo

1dh
1eh
1fh
→ 20h 0x50
Universidade Paulista Prof. Assis 2

1.3 MOVF – move o conteúdo de um registrador

Sintaxe: MOVF f,d


Descrição: o conteúdo do registrador f é armazenado nele mesmo ou no acumulador
W, dependendo do bit d. Se o bit d for igual a 1 o conteúdo vai para o
próprio registrador, caso seja 0 vai para o acumulador W.
Flags Afetados: Z
Exemplos:

1) REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x20 ; acumulador W possuí 0x20
MOVF REG,1 ; o conteúdo de REG é copiado nele
; mesmo

2) REG equ 0x50 ; registrador da posição 0x50


MOVF REG,0 ; o conteúdo de REG é copiado no
; acumulador
como d=0:

Endereço conteúdo

4dh
4fh
→ 50h 0x1

W: 0x1

2.0 Instruções lógicas e aritméticas


2.1 – ADDLW - soma acumulador com dado imediato

Sintaxe: ADDLW k
Descrição: o conteúdo do acumulador (W) é somado com o dado imediato k e o
resultado armazenado no próprio acumulador.
Flags Afetados: C,DC,Z
Exemplo:
MOVLW 0x20 ; acumulador W possuí 0x20
ADDLW 0x10 ; no acumulador teremos 0x30

W (antes): 0x20

k:
0x10

W(depois):
0x30
Universidade Paulista Prof. Assis 3

2.2 - ADDWF - soma acumulador com registrador

Sintaxe: ADDWF f,d


Descrição: o conteúdo do acumulador (W) é somado com o registrador, e o
resultado é armazenado no próprio acumulador, quando d for igual
a 0, ou para o registrador caso d seja igual a 1.
Flags Afetados: C,DC,Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x6 ; acumulador W possuí 0x6
MOVWF REG ; e guarda na posição 0x50
MOVLW 0x10 ; acumulador W possuí 0x10
ADDWF REG,0 ; no acumulador teremos 0x16

como d=0:

Endereço conteúdo

4dh
4fh
→ 50h 0x6

W :(antes) 0x10

W(depois): 0x16

2.3 – ANDLW - operação and entre o acumulador e o dado imediato

Sintaxe: ANDLW k
Descrição: realiza-se a operação and entre o conteúdo do acumulador (W) é o
dado imediato k , o resultado armazenado no próprio acumulador.
Flag Afetado: Z
Exemplo:
MOVLW 0x22 ; acumulador W possuí 0x20
ANDLW 0x10 ; no acumulador teremos 0x10

W (antes)
0 0 1 0 0 0 1 0

k:

0 0 0 0 0 0 1 0

W (antes)
0 0 0 0 0 0 1 0
Universidade Paulista Prof. Assis 4

2.4 - ANDWF - operação and entre o acumulador e o registrador f

Sintaxe: ANDWF f,d


Descrição: realiza-se a operação and entre o conteúdo do acumulador (W) é o
registrador f, o resultado armazenado no acumulador, caso d=0,ou no
registrador, caso d=1.
Flag Afetado: Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x6 ; acumulador W possuí 0x6
MOVWF REG ; e guarda na posição 0x50
MOVLW 0xff ; acumulador W possuí 0xff
ANDWF REG,1 ; no acumulador teremos 0xff e
; na posição 0x50 teremos 0x6
como d=1:
antes:

Endereço conteúdo

4dh
4fh
→ 50h 0x6

W :(antes) 0xf2

depois:

W(depois): 0xf2

Endereço conteúdo

4dh
4fh
→ 50h 0x2

2.5 – CLRF - zera registrador

Sintaxe: CLRF f
Descrição: coloca zero no registrador f
Flag Afetado: Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


CLRF REG ; coloca zero

Endereço conteúdo

4dh
4fh
→ 50h 0x0
Universidade Paulista Prof. Assis 5

2.6 – CLRW - zera acumulador

Sintaxe: CLRW
Descrição: coloca zero no acumulador
Flag Afetado: Z
Exemplo:

CLRW ; coloca zero acumulador

2.7 - COMF – complemento do conteúdo do registrado f

Sintaxe: COMF f,d


Descrição: realiza o complemento de um do conteúdo do registrador f, o resultado
pode ser armazenado no acumulador W, caso d=0, ou no próprio
registrador se d=1
Flag Afetado: Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x3f ; valor 0x3f no registrador
MOVWF REG ; e guarda no registrador REG
COMF REG,1 ; agora o conteúdo de REG é 0xe0

2.8 DECF - decrementa de um o registrador f

Sintaxe: DECF f,d


Descrição: realiza decremento de um do conteúdo do registrador f, o resultado
pode ser armazenado no acumulador W, caso d=0, ou no próprio
registrador se d=1
Flag Afetado: Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x3f ; valor 0x3f no registrador
MOVWF REG ; e guarda no registrador REG
DECF REG,1 ; agora o conteúdo de REG é 0x3e

2.9 INCF - incrementa de um o registrador f

Sintaxe: INCF f,d


Descrição: realiza incremento de um do conteúdo do registrador f, o resultado
pode ser armazenado no acumulador W, caso d=0, ou no próprio
registrador se d=1
Flag Afetado: Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x3f ; valor 0x3f no registrador
MOVWF REG ; e guarda no registrador REG
INCF REG,0 ; agora o conteúdo de W é 0x40

2.10 IORLW – or entre o acumulador e dado literal


Universidade Paulista Prof. Assis 6

Sintaxe: IORLW k
Descrição: realiza a operação lógica or entre o conteúdo de W e o valor k , o
resultado é armazenado no próprio W.
Flag Afetado: Z
Exemplo:
MOVLW 0x3f ; valor 0x3f no registrador
IORLW 0x35 ; agora o conteúdo de W é 0xbf

2.11 IORWF – or entre o acumulador e o registrador f

Sintaxe: IORWF f,d


Descrição: realiza a operação lógica or entre o conteúdo de W e o registrador f ,
o resultado pode ser armazenado no acumulador W, caso d=0, ou no
próprio registrador se d=1.
Flag Afetado: Z
Exemplo:
REG equ 0x50 ; registrador da posição 0x50
MOVLW 0x3f ; valor 0x3f no registrador
MOVWF REG ; e guarda no registrador REG
MOVLW 0x35 ; valor 0x35 no acumulador
IORWF REG,0 ; agora o conteúdo de W é 0xbf

2.12 SUBLW – subtrai do valor literal k o conteúdo w

Sintaxe: SUBLW k
Descrição: realiza-se a operação de subtração entre o conteúdo do acumulador
(W) é o dado imediato k , o resultado armazenado no próprio acumulador.
Utiliza-se o complemento de dois. Se o resultado for positivo o bit de carry
fica no nível lógico 1, caso contrário 0.
Flags Afetados: C, DC, Z
Exemplo:
MOVLW 0x02 ; acumulador W possuí 0x2
SUBLW 0x01 ; no acumulador teremos 0x01 e C=1

2.13 - SUBWF - subtraí o valor do registrador w do registrador f

Sintaxe: SUBWF f,d


Descrição: realiza-se a operação de subtração entre o conteúdo do acumulador
(W) é o registrador f . o resultado pode ser armazenado no
acumulador W, caso d=0, ou no próprio registrador se d=1. Se o
resultado for positivo o bit de carry fica no nível lógico 1, caso contrário 0.
Flags Afetados: C, DC, Z
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0x3f ; valor 0x3f no registrador
MOVLW 0x02 ; acumulador W possuí 0x2
SUBLW REG,0 ; no acumulador teremos 0x3d e C=1

2.14 XORLW - exclusive or entre o acumulador e o dado literal k


Universidade Paulista Prof. Assis 7

Sintaxe: XORLW k
Descrição: realiza a operação lógica xor entre o conteúdo de W e o valor k , o
resultado é armazenado no próprio W.
Flag Afetado: Z
Exemplo:
MOVLW 0x3f ; valor 0x3f no registrador
XORLW 0x35 ; agora o conteúdo de W é 0x0a

2.15 XORWF - exclusive or entre o acumulador e o registrador f

Sintaxe: XORWF f,d


Descrição: realiza a operação lógica xor entre o conteúdo de W e o registrador f ,
o resultado pode ser armazenado no acumulador W, caso d=0, ou no
próprio registrador se d=1.
Flag Afetado: Z
Exemplo:
REG equ 0x50 ; registrador da posição 0x50
MOVLW 0x3f ; valor 0x3f no registrador
MOVWF REG ; e guarda no registrador REG
MOVLW 0x35 ; valor 0x35 no acumulador
XORWF REG,0 ; agora o conteúdo de W é 0x0a

2- Instruções para acesso a bit

3.1 BCF – limpa bit dentro de um registrador

Sintaxe: BCF f,b


Descrição: o bit b dentro do registrador f é colocado em nível lógico 0.
Flags Afetados: nenhum
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0xff ; valor 0xff no registrador
MOVWF REG ; e guarda no registrador REG
BCF REG,0 ; agora no registrador temos 0xfe

3.2 BSF – seta bit dentro de um registrador

Sintaxe: BSF f,b


Descrição: o bit b dentro do registrador f é colocado em nível lógico 1.
Flags Afetados: nenhum
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


CLRF REG ; zera registrador
BSF REG,0 ; agora no registrador temos 0x01

3.3 BTFSC – testa o bit do registrador e desvia se for 0

Sintaxe: BTFSC f,b


Descrição: se o bit b dentro do registrador f é igual a zero então a próxima instrução
Universidade Paulista Prof. Assis 8

é descartada, caso contrário a instrução é executada.


Flags Afetados: nenhum
Exemplos:
1)
REG equ 0x50 ; registrador da posição 0x50
CLRF REG ; zera registrador
BTFSC REG,0 ; como o bit 0 é igual a 0 então
GOTO FIM ; esta instrução será descartada
NOP ; mas esta será executada

2)
REG equ 0x50 ; registrador da posição 0x50
MOVLW 0X01 ; zera registrador
MOVWF REG ; guarda no registrador
BTFSC REG,0 ; como o bit 0 é não é 0 então
GOTO FIM ; esta instrução será executada
NOP ; mas esta será executada

3.4 BTFSS – testa o bit do registrador e desvia se for 1

Sintaxe: BTFSS f,b


Descrição: se o bit b dentro do registrador f é igual a 1 então a próxima instrução
é descartada, caso contrário a instrução é executada.
Flags Afetados: nenhum
Exemplos:
1)
REG equ 0x50 ; registrador da posição 0x50
CLRF REG ; zera registrador
BTFSS REG,0 ; como o bit 0 é igual a 0 então
GOTO FIM ; esta instrução será executada
NOP ; mas esta será executada

2)
REG equ 0x50 ; registrador da posição 0x50
MOVLW 0X01 ; zera registrador
MOVWF REG ; guarda no registrador
BTFSS REG,0 ; como o bit 0 é não é 0 então
GOTO FIM ; esta instrução será descartada
NOP ; mas esta será executada

3.5 – RLF – rotação para a esquerda com bit de carry

Sintaxe: RLF f,d


Descrição: o conteúdo do registrador f é deslocado para a esquerda com o
bit de carry, o resultado pode ser armazenado no registrador ou no
acumulador, depedendo do valor de d.
Flags Afetados: C
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


STATUS equ 0x03 ; endereço do registrador de status
CLRF REG ; zera registrador
BSF STATUS,0 ; seta o bit de carry
RLF REG,0 ; no acumulador agora tem 0x01
Universidade Paulista Prof. Assis 9

3.6 – RRF – rotação para a direita com bit de carry

Sintaxe: RRF f,d


Descrição: o conteúdo do registrador f é deslocado para a direita com o
bit de carry, o resultado pode ser armazenado no registrador ou no
acumulador, depedendo do valor de d.
Flags Afetados: C
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


STATUS equ 0x03 ; endereço do registrador de status
CLRF REG ; zera registrador
BSF STATUS,0 ; seta o bit de carry
RRF REG,0 ; no acumulador agora tem 0x80

3- Instruções de desvio

4.1 – GOTO – desvia para uma nova posição

Sintaxe: GOTO k
Descrição: desvio incondicional para a posição k.
Flags Afetados: nenhum
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0xff ; valor 0xff no registrador
MOVWF REG ; e guarda no registrador REG
GOTO FIM ; desvia para o posição FIM
NOP ; não faz nada
FIM

4.2 DECFSZ – decrementa o registrador f e desvia se for 0

Sintaxe: DECFSZ f,d


Descrição: o conteúdo do registrador f é decrementado de um, se d for igual a zero o
resultado é armazenado no acumulador, caso contrário no registrador. Se
o resultado do decremento for igual a zero a próxima instrução é
descartada , caso contrário a próxima instrução é executada.
Flags Afetados: nenhum
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0X01 ; zera registrador
MOVWF REG ; guarda no registrador
DECFSZ REG,0 ; guarda no acumulador, é
GOTO FIM ; é zero, instrução descartada
NOP ; instrução executada

4.3 INCFSZ – incrementa o registrador f e desvia se for 0

Sintaxe: INCFSZ f,d


Descrição: o conteúdo do registrador f é incrementado de um, se d for igual a zero o
resultado é armazenado no acumulador, caso contrário no registrador. Se
Universidade Paulista Prof. Assis 10

o resultado do incremento for igual a zero a próxima instrução é


descartada , caso contrário a próxima instrução é executada.
Flags Afetados: nenhum
Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0X01 ; zera registrador
MOVWF REG ; guarda no registrador
INCFSZ REG,0 ; guarda no acumulador, é
GOTO FIM ; não é zero, instrução executada
NOP ; instrução descartada

4- Instruções para manipular subrotina

5.1 CALL - chamada de subrotina

Sintaxe: CALL k
Descrição: a execução do programa é desviada para uma nova posição determinada
pela constante k. O conteúdo do registrador contador de programa é
incrementado de 1 e salvo buffer de pilha.O valor de k é copiado no PC,
nos bits <10:0>. Os bits mais significativos do PC são carregados do
PCLATCH:

k → (PC<10:0>);
(PCLATH<4:3>) →(PC<12:11>)
Flags Afetados: nenhum
Exemplo:
REG equ 0x50 ; registrador da posição 0x50
MOVLW 0X01 ; zera registrador
MOVWF REG ; guarda no registrador
CALL TESTE ; chama a subrotina TESTE
BSF REG,1 ; após retorno executa esta instrução

5.2 - RETURN - retorna da subrotina


.
Sintaxe: RETURN
Descrição: Retorna da subrotina. O valor da pilha é armazenado no registrador PC:
TOS → (PC)
Flags Afetados: nenhum
Exemplo:

TESTE MOVLW 0x20 ;


BSF REG,1 ;
RETURN ; retorna da subrotina para o programa
; que a chamou.

5.2 - RETFIE - retorna da interrupção


Universidade Paulista Prof. Assis 11

Sintaxe: RETURN
Descrição: Retorna da rotina da interrupção. O valor da pilha é armazenado no
registrador PC:
TOS → (PC)
1→ GIE
Flags Afetados: nenhum
Exemplo:

5.3 RETLW - retorna da subrotina com o valor em W

Sintaxe: RETLW k
Descrição: O valor de W é carregado com os oito bits literal k. O valor da pilha é
armazenado no registrador PC:
TOS → (PC)
k→ (W)
Flags Afetados: nenhum
Exemplo:

MOVLW 0X1 ; w contem o offset da tabela


CALL TABELA ; retorna com o valor 11

TABELA ADDWF PC ;
RETLW 10 ;
RETLW 11 ;

5- Instruções genéricas
6.1 – CLRWDT – reseta o “wathdog “.

Sintaxe: CLRWDT
Descrição: reseta o “wathdog “, com as seguintes condições:

0 → WDT
0 → WDT prescalar
1→ TO
1→ PD

Flags Afetados: nenhum

6.2 - NOP - nenhum operação é executada

Sintaxe: NOP
Descrição: nenhuma instrução é executada
Flags Afetados: nenhum

6.3 – SWAPF – troca de quatro bits

Sintaxe: SWAPF f,d


Universidade Paulista Prof. Assis 12

Descrição: os quatros bits mais significativos do registrador f são trocados pelo quatro
menos signficativo. O resultado da troca pode ser armazenado no próprio
registrador ou no acumulador dependendo do valor de d:

(f<3:0>) → (dest<7:4>)
(f<7:4>) → (dest<3:0>)

Flags Afetados: nenhum


Exemplo:

REG equ 0x50 ; registrador da posição 0x50


MOVLW 0xA5 ;
MOVWF REG ; guarda no registrador
SWAPF REG,0 ; no acumulador teremos 0x5A

6.4-SLEEP – coloca a CPU no estado de “standby”.

Sintaxe: SLEEP
Descrição: a CPU entra no estado de “standby”., com as seguintes condições:

0 → WDT
0 → WDT prescalar
1→ TO
0→ PD
sendo que o clock fica desabilitado.

Flags Afetados: nenhum