Buscar

Apostila16F628

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

CENTRO FEDERAL DE EDUAÇÃO TECNOLÓGICA DE GOIÁS 
COORDENAÇÃO DE MECÂNICA 
CURSO DE TECNOLOGIA ELETROMECÂNICA 
 
 
 
 
 
 
 
MICROCONTROLADOR 
 
PIC16F628 
 
 
 
 
 
 
 
 
Prof. Eider Lúcio de Oliveira 
Prof. Éderson Lacerda Fideles 
 
 
SUMÁRIO 
INTRODUÇÃO ................................................................................................................................................ 3 
CAPÍTULO I - O QUE É O PIC16F628 ........................................................................................................ 5 
PINAGEM DO PIC16F628........................................................................................................................... 5 
DESCRIÇÃO DOS PINOS ................................................................................................................................... 5 
CARACTERÍSTICAS DOS PINOS......................................................................................................................... 8 
CAPÍTULO II - CARACTERÍSTICAS DO PIC16F628.............................................................................. 9 
CAPÍTULO III - MEMÓRIA DE PROGRAMA (FLASH EPROM), MEMÓRIA DE DADOS (RAM) E 
MEMÓRIA DE DADOS PERMANENTES (EEPROM) ........................................................................... 11 
MEMÓRIA DE PROGRAMA (FLASH EPROM)..................................................................................... 11 
MEMÓRIA DE DADOS (RAM) ................................................................................................................ 12 
CAPÍTULO IV - REGISTRADORES DE FUNÇÕES ESPECIAIS......................................................... 15 
CAPÍTULO V - CONJUNTO DE INSTRUÇÕES DO PIC16F628........................................................... 26 
EXPLICAÇÃO DETALHADA DO CONJUNTO DE INSTRUÇÕES DO PIC................................................................ 29 
CAPÍTULO VI - AS INTERRUPÇÕES DO PIC16F628 ........................................................................... 39 
CAPÍTULO VII - O CONTADOR/TEMPORIZADOR (TMR0).............................................................. 43 
CAPÍTULO VIII – MODO POWER DOWN, MODO SLEEP E O WDT............................................... 47 
CAPÍTULO IX - ESCRITA E LEITURA NA EEPROM DO PIC16F628 ............................................... 50 
BIBLIOGRAFIA............................................................................................................................................ 52 
APÊNDICE A - INTRODUÇÃO AO MPLAB............................................................................................ 53 
APÊNDICE B – DETALHES DOS PORTS ................................................................................................ 67 
APÊNDICE C – DISPLAY DE CRISTAL LÍQUIDO - LCD.................................................................... 72 
 
 
 
 
INTRODUÇÃO 
 
Um microprocessador é um componente eletrônico, que devido às suas modernas 
técnicas de fabricação, consegue efetuar com rapidez, várias funções e operações lógicas e 
aritméticas, sob controle de um programa externo, que dita para a máquina a “seqüência” 
das funções e os operandos a serem utilizados. 
A diferença básica entre um microcontrolador e um microprocessador é que o 
microcontrolador já possui internamente vários circuitos eletrônicos que o 
microprocessador precisa usar externamente para ser funcional, tais como: memória de 
programa, memória de dados, portas de entrada e saída de sinais (portas de I/O, 
Input/Output), circuito de reset, circuito oscilador, contador/temporizador, portas lógicas 
para selecionar endereços, circuito de comunicação serial e paralela, conversor A/D, etc. 
Ao escolher um projeto microcontrolado em relação aos projetos digitais tradicionais, 
visa entre outras coisas: redução de custo; redução do consumo de energia; redução do 
tamanho do equipamento; aumento da confiabilidade; proteção de software que vai gravado 
internamente e a facilidade de implementação e de suas possíveis modificações através de 
programação. 
Atualmente muitos equipamentos de nosso uso diário, tais como: eletrodomésticos, 
videocassetes, alarmes, celulares e brinquedos, entre outros, utilizam microcontroladores 
para execução de suas funções básicas. Muitos microcontroladores são conhecidos pelos 
desenvolvedores de projetos no Brasil, podemos citar os seguintes: 
• Microcontroladores da família 8051 (INTEL e outros fabricantes) 
• Microcontroladores da família PIC (MICROCHIP) 
• Microcontroladores da família COP8 (NATIONAL SEMICONDUTORES) 
• Microcontroladores da TEXAS, exemplo: MSP430F13x/14x 
• Microcontroladores da HOLTEK, exemplo: HT48500 
• Microcontroladores da MOTOROLA. 
O PIC pode ser visto externamente como um circuito integrado TTL ou CMOS 
normal, mas internamente dispõe de todos os dispositivos típicos de um sistema 
microprocessado, ou seja: 
 
 
• Uma CPU (“Central Processor Unit” = Unidade de Processamento Central) cuja 
finalidade é interpretar as instruções de programa. 
• Uma memória de programa Flash EPROM (2048 words) que possibilita a gravação 
cerca de 1000 vezes sem a necessidade de apagamento com ultravioleta. 
• Uma memória RAM (Random Access Memory - Memória de Acesso Aleatório) – 
224 bytes, utilizada para memorizar as variáveis utilizadas pelo programa. 
• Uma série de LINHAS de I/O para controlar dispositivos externos ou receber pulsos 
de sensores, chaves, etc. 
• Uma memória EEPROM de 128 bytes para gravar dados permanentes. Cada posição 
pode ser gravada cerca de um milhão de vezes. 
• Uma série de dispositivos auxiliares ao funcionamento, ou seja, gerador de clock, 
barramento de dados e controle, contador/temporizador, etc. 
A presença de todos estes dispositivos em um espaço extremamente pequeno, dá ao 
projetista ampla gama de trabalho e enorme vantagem em usar um sistema 
microprocessado, onde em pouco tempo e com poucos componentes externos podemos 
fazer o que seria oneroso fazer com circuitos tradicionais. 
O PIC está disponível em uma ampla gama de modelos para melhor se adaptar as 
exigências de projetos específicos, diferenciando-se pelo número de linha de I/O e pelo 
conteúdo do dispositivo. Inicia-se com modelos pequenos identificados pela sigla 
PIC12Cxx dotados de 8 pinos, até chegar a modelos maiores com sigla PIC17Cxx dotados 
de 40 ou mais pinos. Como foi dito na introdução, uma descrição detalhada do PIC está 
disponível no site da microchip www.microchip.com , onde se pode encontrar grandes e 
variadas quantidades de informações técnicas, manuais, software de apoio, exemplos de 
aplicações e atualizações disponíveis. 
Mas, qual microcontrolador escolher? 
Ao escolher um microcontrolador devemos analisar o seguinte: facilidade de uso; 
disponibilidade de ferramentas de programação, teste e depuração; suporte técnico; custo e 
disponibilidade no mercado; e principalmente, se a família de microcontroladores possui 
várias opções de modelos e periféricos, possibilitando assim o reaproveitamento de código 
para outros projetos. 
A família de microcontroladores PIC é uma das que atende os requisitos do parágrafo 
anterior. O escolha do microcontrador fica a cargo do projetista, mas tenho certeza que uma 
escolha muito boa, para começar os estudos, é a Família PIC da Microchip. Nesta apostila é 
feito um estudo detalhado do PIC16F628 e é colocado em Apêndice alguns tópicos sobre o 
PIC16F874. 
http://www.microchip.com/
 
Capítulo I - O QUE É O PIC16F628 
 
O PIC16F628 é um circuito integrado produzido pela Microchip, que pertence a 
categoria dos microcontroladores, ou seja, é um componente integrado, que em um único 
dispositivo, contém todos os circuitos necessários para realizar um completo sistema digital 
programável. A Figura 1, a seguir, mostra o encapsulamento DIP (DIP = dual in line) e os 
nomes descritivos dos pinos do PIC16F628. 
 
PINAGEM DO PIC16F628 
 
 
Figura1 – Pinagem do PIC16F628 
Descrição dos pinos 
Tabela 1 - Descrição da pinagem do PIC16F628 
NOME FUNÇÃO DESCRIÇÃO 
RA0 Porta de I/O bidirecional 
RA0/AN0 
AN0 Entrada para comparador analógico 
RA1 Porta de I/O bidirecional 
RA1/AN1 
AN1 Entrada para comparador analógico 
RA3 Porta de I/O bidirecional 
AN3 Entrada para comparador analógico 
RA3/AN3/CMP1 
CMP1 
Saída do comparador 1 
 
RA4 Porta de I/O bidirecional 
T0CKI Entrada de clock do TIMER 0 RA4/T0CKI/CMP2 
CMP2 Saída do comparador 2 
RA5 Porta de entrada 
MCLR 
Master Clear. Quando configurado como master clear 
esse pino é um RESET ativo quando baixo. A tensão no 
master clear não pode exceder de VDD.
RA5/ MCLR /VPP
VPP Entrada de tensão de programação. 
RA6 Porta de I/O bidirecional 
OSC2 Entrada para oscilador a cristal. 
RA6/OSC2/CLKOUT 
CLKOUT
No modo RC/INTOSC esse pino fornece sinal de clock 
com 
4
1 da freqüência de OSC1. 
RA7 Porta de I/O bidirecional 
OSC1 Entrada para oscilador a cristal RA7/OSC1/CLKIN 
CLKIN Entrada para fonte do clock externa. 
RB0 Porta de I/O bidirecional. Pode ter Pull-up interno habilitado por software. RB0/INT 
INT Interrupção externa. 
RB1 Porta de I/O bidirecional. Pode ter Pull-up interno habilitado por software. 
RX Pino receptor de USART (comunicação serial) RB1/RX/DT 
DT Porta de I/O de Dados Sincronos (comunicação serial) 
RB2 Porta de I/O bidirecional. Pode ter Pull-up interno habilitado por software. 
TX Pino transmissor de USART (comunicação serial) 
RB2/TX/CK 
CK 
Porta de I/O de Clock de sincronismo (comunicação 
serial). 
 
RB3 Porta de I/O bidirecional. Pode ter Pull-up interno habilitado por software. 
RB3/CCP1 
CCP1 
Captura/Compara/PWM I/O 
 
RB4 
Porta de I/O bidirecional. Interrupção na mudança do 
estado do pino. Pode ter Pull-up interno habilitado por 
software. RB4/PGM 
PGM Pino de entrada para programação em baixa tensão. 
RB5 RB5 
Porta de I/O bidirecional. Interrupção na mudança do 
estado do pino. Pode ter Pull-up interno habilitado por 
software. 
RB6 
Porta de I/O bidirecional. Interrupção na mudança do 
estado do pino. Pode ter Pull-up interno habilitado por 
software. 
T1OSO Saída do oscilador do TIMER 1 
T1CKI Entrada de CLOCK para TIMER 1 
RB6/T1OSO/T1CKI/
PGC 
 
PGC ICSP programming clock. 
RB7 
Porta de I/O bidirecional. Interrupção na mudança do 
estado do pino. Pode ter Pull-up interno habilitado por 
software. 
TIOSI Entrada do oscilador do TIMER 1. 
RB7/T1OSI/PGD 
PGD ICSP Data I/O. 
VSS VSS Pino de terra (0V) 
VDD VDD Pino de tensão positiva (5V) 
 
Como é possível ver na figura acima, o PIC16F628 é dotado de um total de 18 pinos 
dispostos em duas fileiras paralelas de 9 pinos cada uma (DIP = dual in line). São 13 pinos 
de linhas de entrada e saída de sinais (linhas de I/O) para a nossa aplicação (pode ser 
expandido para dezesseis), um pino de alimentação, um de terra (referência), um de reset 
(MCLR) e dois de clock (OSC1/CLKIN e OSC2/CLKOUT). 
 
 
Características dos pinos 
 RA0 a RA4, são pinos de linhas de entrada e saída de sinais (linhas de I/O). No entanto, 
o pino RA4/TOCKI também pode ser programado para ser a entrada de clock para o 
TMR0 (timer 0 interno ao PIC). 
 RB0 a RB7, também são pinos de linhas de entrada e saída de sinais (linhas de I/O). 
Mas eles tem outras funções: o pino RB0/INT também pode ser programado para ser 
um pino de entrada de interrupção externa; os pinos RB4 a RB7 podem ser programados 
para gerar interrupção quando houver mudança de nível lógico em um deles e os pinos 
RB6 e RB7 também são usados na programação do PIC, o primeiro serve como “clock” 
serial e o segundo serve como “data” serial. 
 VDD e VSS, são pinos de alimentação. O VSS é conectado ao TERRA (GND) e o VDD 
à tensão contínua de +5V. A tensão de alimentação nominal dos PICs é de 5 Vcc, mas a 
faixa de variação desta tensão depende do modelo estudado. No caso do PIC16F628, ela 
vai de 2.0 a 6.0 Vcc. 
 /MCLR, é o pino de reset. Este se refere ao Master Clear externo. Sempre que esse pino 
for colocado em nível lógico baixo (GND), o programa será resetado e o processamento 
paralisado. Ao ser colocado em nível alto (+5V), a execução do programa será retomada 
do ponto inicial (ORG 00H). 
 OSC1/CLKIN e OSC2/CLKOUT, são pinos de clock. Nestes pinos é ligado o 
oscilador. 
 
 
 
Capítulo II - Características do PIC16F628 
 
Para o PIC16F628, podemos citar, entre outras, as seguintes características: 
• Microcontrolador de 18 pinos; 
• 13 portas configuráveis como entrada ou saída, podendo chegar a 16 pinos; 
• Cada porta, pode drenar no máximo 25 mA e fornecer no máximo 20 mA; 
• Freqüência máxima de operação de 4 a 20 MHz, depende das especificações do chip; 
• Possui 4 fontes de interrupção, que são a interrupção externa RB0/INT, interrupção por 
“overflow” do timer TMR0, interrupção por mudança de nível nos pinos da porta B 
(pinos RB7 a RB4) e interrupção por escrita completa na EEPROM. 
• Memória de programação FLASH EPROM de 2 Kbytes. Pode-se escrever nessa 
memória cerca de 1000 vezes sem danificá-la. 
• Memória de dados temporários, RAM separada em bancos de memória. As primeiras 
posições de cada banco são reservadas para registradores de funções especiais (SFR - 
Special Function Registers). O restantes de cada banco são reservadas aos registradores 
de propósitos gerais (GPR - General Purpose Registers). Todos os registradores da 
RAM são programáveis bit a bit; 
• Memória de dados permanentes, EEPROM de 128 Bytes. Pode-se escrever em cada bit 
dessa memória cerca de 1 milhão de vezes sem danificá-la; 
• Via de programação com 14 bits e 35 instruções; 
• 3 Módulos de timer/counter ; 
• A faixa de tensão de trabalho está na faixa de 3 a 5,5 volts; 
• Baixa potência de consumo - menos de 2 mA para 5 V, 4Mhz; cerca de 15 µA para 2 V, 
32 KHz e menos de 1µA para 2 V (modo Standby); 
Os microcontroladores PIC apresentam uma estrutura de máquina interna do tipo 
Havard, enquanto grande parte dos microcontradores tradicionais apresenta uma 
arquitetura tipo Von-Neumann. A diferença está na forma como os dados e o programa são 
processados pelo microcontrolador. Na arquitetura tradicional, tipo Von-Neumann, existe 
apenas um barramento (bus) interno (geralmente de 8 bits), por onde passam as instruções e 
os dados. Já na arquitetura tipo Havard existem dois barramentos internos, sendo um de 
dados e outro de instruções. No caso dos microcontroladores PIC, o barramento de dados é 
sempre de 8 bits e o de instruções pode ser de 12, 14 ou 16 bits, dependendo do 
microcontrolador. Esse tipo de arquitetura permite que enquanto uma instrução é executada 
outra seja “buscada” na memória, o que torna o processamento mais rápido. Além disso, 
como o barramento de instruções é maior do que 8 bits, o OPCODE da instrução já inclui o 
dado e o local onde ela vai operar (quando necessário), o que significa que apenas uma 
posição de memória é utilizada por instrução, economizando assim muita memória de 
programa. 
 Desta forma, podemos observar que dentro da palavra o OPCODE, que pode ser de 
12, 14 ou 16 bits, não sobra muito espaço para o código da instrução propriamente dito. Por 
isso, os PICs utilizam uma tecnologia chamada RISC, que significa Reduced Instruction Set 
Computer (Computador com set de instruções reduzido). Desta forma, os PICs possuem 
cerca de 35 instruções (o número correto varia de acordo com o microcontrolador), muito 
menos que os microcontroladores convencionais (CISC) que chegam a possuir mais de 100 
instruções. Isto torna o aprendizado muito mais fácil e dinâmico, mas, por outro lado, 
implica no fato de que muitas funções devem ser “construídas”, pois não possuem uma 
instrução direta, exigindo maior habilidade do programador. 
Nos microcontroladores PIC, o sinal de clock é internamente dividido por 
quatro. Portanto, para um clock externo de 4 MHz, temos um clock interno de 1 MHz, e 
consequentemente, cada ciclo de máquina dura 1us. 
A divisãodo clock por quatro forma as fases Q1, Q2, Q3 e Q4. O program counter 
(registrador PC) é incrementado automaticamente na fase Q1 do ciclo de máquina e a 
instrução seguinte é buscada da memória de programa e armazenada no registrador de 
instruções no ciclo Q4. Ela é decodificada e executada no próximo ciclo, no intervalo de 
Q1 até Q4. Esta característica de buscar a informação num ciclo de máquina e executá-la 
no próximo é conhecida como PIPELINE. Ela permite que quase todas as instruções sejam 
executadas em apenas um ciclo, gastando assim 1us (para um clock de 4 MHz) e tornando o 
sistema muito mais rápido. As únicas exceções referem-se às instruções que geram “saltos” 
no program counter, como chamadas de rotinas e retornos. Ao executar essas instruções, o 
PIPELINE deve ser primeiramente limpo para depois poder ser carregado novamente com 
o endereço correto, consumindo para isso 2 ciclos de máquina. Esse PIPELINE é 
facilmente implementado devido à arquitetura Havard. 
 
Capítulo III - MEMÓRIA DE PROGRAMA (FLASH EPROM), MEMÓRIA 
DE DADOS (RAM) E MEMÓRIA DE DADOS PERMANENTES 
(EEPROM) 
 
MEMÓRIA DE PROGRAMA (FLASH EPROM) 
Em particular o PIC16F628 dispõe de uma memória para armazenar o programa, do 
tipo Flash EPROM, que pode ser escrita cerca de 1000 vezes e que é ideal para o nosso 
experimento tornando a conecção para a programação on-board, ou seja podemos colocar o 
programa dentro do chip sem ter que removê-lo do circuito de prova. 
A sua capacidade de memorização é de 2048 locações (2 K Byte de 14 bits cada) e 
que poderão conter, cada uma, somente uma instrução básica do PIC. Logo, o programa 
mais complexo que poderemos realizar não poderá ter mais do que 2048 instruções. 
Os endereços reservados para Flash EPROM começam em 0000H e vão até 07FFH. 
O PIC pode somente executar instruções memorizadas nestas locações. Não se pode de 
maneira nenhuma ler, escrever ou cancelar dados nesses endereços, a não ser com o uso de 
um dispositivo externo chamado programador. 
A primeira localização de memória de programa que será executada quando o PIC 
começar a rodar (após a alimentação ou um reset) é o endereço 0000H, por isso essa 
localização de memória é denominada Reset Vector (Vetor de Reset). Já, quando ocorre 
uma interrupção, a primeira instrução a ser executada está no endereço 0004H, por isto, 
este endereço denomina-se endereço de Interrupt Vector (Vetor de Interrupção). O 
“template”, exemplo padrão, a seguir mostra como deve ser a estrutura de um programa em 
Assembly escrito para o PIC16F628 no MPLAB (compilador, simulador e emulador para o 
PIC). 
 
;*******************************************************************
*** 
 list p=16F628 ; Diretiva list para definir processador 
 #include <p16F628.inc> ; Definições de variáveis específicas do 
processador 
 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 
 
;***** DEFINIÇÕES DE VARIÁVEIS*************** 
w_temp EQU 0x20 ; variável usada para salvar o registrador de trabalho W 
status_temp EQU 0x21 ; variável usada para salvar o registrador de STATUS 
 
 ORG 0x000 ; Vetor de reset 
 goto main ; vai para o início do programa 
 ORG 0x004 ; Vetor de interrupção 
 movwf w_temp ; salva o conteúdo de W 
 movf STATUS,w ; move registrador de status para W 
 movwf status_temp ; salva o conteúdo de STATUS 
; Código da rotina de interrupção que pode ser escrito aqui ou em outro lugar 
usando call sub_int 
 movf status_temp,w ; Copia STATUS_TEMP para W 
 movwf STATUS ; restaura o conteúdo do registrador de 
STATUS 
 swapf w_temp,f 
 swapf w_temp,w ; restaura o conteúdo do registrador W 
 retfie ; retorno da interrupção 
 
; Início do programa principal 
main 
 ; Restante do código do programa vai aqui 
END ; diretiva de fim de programa 
;********************************************************************** 
MEMÓRIA DE DADOS (RAM) 
Diferentemente da memória Flash EPROM destinada a conter o programa, a área de 
memória RAM é visível pelo resto do programa. Nela podemos escrever, ler, ou modificar 
tranqüilamente qualquer registrador do nosso programa a qualquer momento que for 
necessário. A única limitação consiste de que alguns desses registradores desenvolvem 
funções especiais para o PIC que não podem ser utilizados para outra coisa a não ser para 
aquilo a qual eles estão reservados. Estes registradores encontram-se nas locações base da 
área de memória RAM mostrada na Tabela 2. 
A localização de memória presente na RAM é endereçada diretamente em um 
espaço de memória que vai de 00H a 7FH dando um total de 128 bytes, denominado página 
0 (ou banco 0). Um segundo espaço de endereçamento denominado página 1 (ou banco 1) 
vai de 80H a FFH. Para acessar esse segundo espaço é necessário recorrer a dois bits 
auxiliares RP0 e RP1 do registrador de STATUS segundo a modalidade que iremos 
explicar mais adiante. As primeiras 12 locações da página 0 (de 00H a 0BH) e da página 1 
(de 80H a 8BH) são aquelas reservadas as funções especiais para o funcionamento do PIC 
e, como já foi dito, não podem ser utilizadas para outra coisa. As 68 locações na página 0 
reservados para as nossas variáveis podem ser endereçadas de 0CH a 4FH podemos aqui 
utilizar livremente pelo nosso programa para memorizar variáveis, contadores, etc. 
Em resumo, podemos dizer que a memória RAM do PIC está dividida em dois 
bancos. O banco 0 que é selecionado zerando o bit RP0 (STATUS<5>) e o banco 1 que é 
selecionado setando o bit RP0. Os 12 primeiros bytes da RAM são reservados aos 
Registradores de Funções Especiais (SFR – Special Function Registers), os 116 bytes 
restantes de cada banco são reservados aos Registradores de Propósitos Gerais (GPR – 
General Purpose Registers), mas somente 68 bytes destes GPR são implementados para o 
PIC16F628. 
Tabela 2 – Mapa da memória de dados do PIC16F628 
End. Indir. 00h End. Indir. 80h End. Indir. 100h End. Indir. 180h
TMR0 01h OPTION REG 81h TMR0 101h OPTION 181h
PCL 02h PCL 82h PCL 102h PCL 182h
STATUS 03h STATUS 83h STATUS 103h STATUS 183h
FSR 04h FSR 84h FSR 104h FSR 184h
PORTA 05h TRISA 85h 105h 185h
PORTB 06h TRISB 86h PORTB 106h TRISB 186h
07h 87h 107h 187h
08h 88h 108h 188h
09h 89h 109h 189h
PCLATH 0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah
INTCON 0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh
PIR1 0Ch PIE1 8Ch 10Ch 18Ch
0Dh 8Dh 10Dh 18Dh
TMR1L 0Eh PCON 8Eh 10Eh 18Eh
TMR1H 0Fh 8Fh 10Fh 18Fh
T1CON 10h 90h
TMR2 11h 91h
T2CON 12h PR2 92h
13h 93h
14h 94h
CCPR1L 15h 95h
CCPR1H 16h 96h
CCP1CON 17h 97h
RCSTA 18h TXSTA 98h
TXREG 19h SPBRG 99h
RCREG 1Ah EEDATA 9Ah
1Bh EEADR 9Bh
1Ch EECON1 9Ch
1Dh EECON2 9Dh
1Eh 9Eh
CMCON 1Fh VRCON 9Fh
 
11Fh
20h A0h 120h
 
 
 
 
 
REGISTRADORES 
DE PROPÓSITO 
GERAL 
48 BYTES 
14Fh
 150h
 
 
REGISTRADORES 
DE PROPÓSITO 
GERAL 
 
80 BYTES 
EFh
 
16Fh
 
1EFh
 F0h 170h 1F0h
 
REGISTRADOR
ES DE 
PROPÓSITO 
GERAL 
 
96 BYTES 
70h – 7Fh 70h – 7Fh 70h – 7Fh 
 
BANCO 0
 BANCO 1
 BANCO 2
 BANCO 3
 
Os registradores de funções especiais (SFR) do PIC serão utilizados com muita 
freqüência nos programas. Por exemplo, os registradores TRISA e TRISB são usados para 
definir quais linhas de I/O serão entradas e quais serão saídas. O PORTA e o PORTB 
definem o estado lógico das linhas de I/O. Outro exemplo é o registrador STATUS que 
registra o estado de funcionamento interno do PIC ou o resultado de operações aritméticas 
e lógicas. É necessário conhecer, portanto, exatamente qual função desenvolve cada um dos 
registradores especiais e qual efeito se obtém ao manipular seus conteúdos. 
A memória EEPROM interna ao PIC pode ser utilizada pelo usuário para guardar 
dados. Entretanto, ao contrário da memória de dados vista anteriormente, esta é uma 
memória não volátil, que consegue manter as informaçõesmesmo sem alimentação. A 
EEPROM do PIC16F628 contém 128 Bytes, endereçadas de 0 a 127. Pode-se escrever em 
cada bit dessa memória cerca de 1 milhão de vezes sem danificá-la. 
A PILHA (STACK) é um local totalmente separado da memória de programação, 
em que serão armazenados os endereços de retorno quando utilizarmos instruções de 
chamadas de rotinas. Quando o programa é desviado para o começo de uma rotina por meio 
da instrução correta (call), o endereço seguinte ao ponto que estava sendo rodado é 
armazenado na pilha para que, ao fim da rotina, o programa possa retornar. O tamanho 
determina a quantidade de rotinas que podem ser chamadas ao mesmo tempo. Caso se tente 
chamar um número de rotinas maior que o tamanho da pilha, o endereço de retorno mais 
antigo será perdido. 
Ainda podemos utilizar OUTRAS MEMÓRIAS, por exemplo, memórias externas. 
Já estão disponíveis no mercado memórias EEPROM serial de 64 Kbytes, que podem ser 
interligadas ao PIC utilizando apenas duas portas de I/O. Essas memórias podem ser úteis 
para armazenar parâmetros de programação diferentes daqueles do programa principal. 
 
Capítulo IV - Registradores de Funções Especiais 
 
Os registradores de funções especiais, também denominados de SFR (Special 
Function Registers) são usados pela CPU e funções periféricas para controlar as operações 
do PIC, servem para guardar a configuração e o estado de funcionamento atual da máquina. 
Estes registradores estão localizados na memória RAM. 
A seguir faremos uma descrição detalhada de todos os registradores do PIC16F628. 
Observações quanto à sintaxe: 
 R/W, bit de leitura e de escrita. 
 R, bit somente de leitura. 
 W, bit somente de escrita. 
 U, bit não implementado, ler como ‘0’. 
 -1, bit após o reset vale 1. 
 -0, bit após o reset vale 0. 
 -x, bit após o reset possui valor indefinido (desconhecido). 
 -u, bit não se altera após o reset. 
 -q, valor do bit depende de condição. 
Exemplo1: R/W-0, bit de leitura e escrita, após o reset vale 0. 
Exemplo2: U, bit não implementado, ler como 0. 
Exemplo3: R-u, bit somente de leitura, após o reset o bit possui um valor inalterado. 
 
Registradores: 
1. Registrador W (Acumulador ou registrador de trabalho) e a ALU (Unidade 
Lógica e Aritmética) 
A ALU (Arithmetic and Logic Unit) ou ULA (Unidade Lógica e Aritmética) é a 
componente mais complexa do PIC por conter todos os circuitos destinados a desenvolver 
as funções de cálculo e manipulação de dados durante a execução de um programa. A ALU 
é uma componente presente em todos os microprocessadores e dessa depende diretamente a 
capacidade de cálculo do micro em si. 
A ALU do PIC16F628 está preparada para operar com 8 bits, ou seja valor 
numérico não maior do que 255. Existem processadores com ALU de 16, 32, 64 bits ou 
mais. A família Intel 80386, 486 e Pentium, por exemplo, dispõe de uma ALU de 32 bits. A 
capacidade de cálculo presente nesses micros é notavelmente superior em detrimento da 
complexidade dos circuitos internos e consequentemente do espaço ocupado. 
A ALU referencia diretamente o registrador W denominado antigamente de 
acumulador. Este registrador consiste de uma localização de memória destinada a conter 
um só valor de 8 bits. A diferença entre o registrador W e outras localizações de memória 
consiste no fato de que, por referenciar o registrador W, a ALU não pode fornecer nenhum 
endereço, mas podemos acessá-los diretamente. O registrador W será utilizado 
freqüentemente para intermediar instruções do PIC. 
Façamos um exemplo prático. Suponhamos querer colocar na localização de 
memória 0CH da RAM o valor 01H. Procurando entre as instruções do PIC veremos 
rapidamente que não existe uma única instrução capaz de efetuar esta operação mas 
deveremos necessariamente recorrer ao acumulador e usar duas instruções em seqüência. 
Vejamos porque: 
Como dissemos anteriormente, o opcode de uma instrução não pode exceder aos 14 bits e 
assim teremos: 
8 bits para especificar o valor que queremos colocar na localização de memória, 
7 bits para especificar em qual localização de memória queremos inserir o nosso valor, 
6 bits para especificar qual instrução queremos usar. 
teremos um total de 8 + 7 + 6 = 21 bits. 
Devemos então recorrer a duas instruções, ou seja: 
 movlw 01H 
 movwf 0CH 
onde a primeira instrução colocará no registrador W o valor 01H com a instrução MOVe 
Literal para W e depois "moveremos" (copiaremos) esse valor para a localização 0CH com 
a instrução MOVe W para F. 
2. Registrador STATUS (endereço 03h e 83h) 
Esse registrador serve para mostrar o estado da ULA (bits de Carry e Zero), a forma do 
último reset e também para configurar a página de programação atual, quando 
necessário. 
Nº dos bits Bit 7 bit 6 Bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits IRP RP1 RP0 /TO /PD Z DC C 
Power on reset R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x 
Obs.: O valor dos bits após os demais resets será: 000qquuu 
Descrição dos bits: 
Bit 7: IRP, Bit de seleção de banco de registradores (usado para endereçamento indireto), p/ 
bit7=0 seleciona Bancos 0 e banco 1 (endereços 00 - FFh); já para bit7 = 1 seleciona 
bancos 2 e 3 (100h - 1FFh). Obs.: Este bit não é usado no PIC16F628 (considerar IRP=0). 
Bit 6-5: RP1:RP0, Bit de seleção de banco de registradores (usado para endereçamento 
direto). P/ bits 6-5=00 implica seleção do banco 0 (00 - 7Fh), para bits 6-5=01 implica 
seleção do banco 1 (80h - FFh), para bits 6-5=10 implica seleção do banco 2 (100 - 17Fh) 
e, para bits 6-5=11 implica seleção do banco 3 (180h - 1FFh). obs.: Cada banco é de 128 
bytes e somente o bit RP0 é usado no PIC16F628 (considerar RP1=0). 
Bit 4: /TO, bit de Time-Out. Vai a 1 após power-up, instrução CLRWDT ou instrução 
SLEEP. Vai a 0 após ocorrer uma interrupção de WDT (Watch Dog Timer). 
Bit 3: /PD, bit de Power-Down. Vai a 1 após power-up ou instrução CLRWDT. Vai a 0 na 
execução da instrução SLEEP. 
Bit 2: Z, bit de Zero. Vai a 1 quando o resultado de uma operação aritmética ou lógica é 
zero. Vai a 0 quando o resultado de uma operação aritmética ou lógica é diferente de zero. 
Bit 1: DC, Bit de Digit Carry/Borrow. Este bit vai a 1 quando ocorre um estouro dos 4 bits 
inferiores de um registrador numa instrução de soma (addlw ou addwf) ou quando a 
subtração (sublw ou subwf) entre dois nibles inferiores é negativa. É zero quando a última 
operação na ULA não ocasionou um estouro de dígito. 
Bit 0: C, Bit de Carry/Borrow. Este bit vai a 1 quando ocorre um estouro do byte de um 
registrador numa instrução de soma (addlw ou addwf) ou quando a subtração (sublw ou 
subwf) entre dois bytes é positiva. Note que no caso da subtração o Carry trabalha com a 
lógica invertida. Obs.: As instruções de rotação de bits (rlf ou rrf) também alteram o valor 
do Carry. 
 
3. Registrador PORTA (endereço 05H) 
Nº dos bits Bit 7 bit 6 Bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - RA4/TOCKI RA3 RA2 RA1 RA0 
Power on reset - - - R\W-x R/W-x R/W-x R/W-x R/W-x 
Obs: Valor dos bits após os demais resets: ---uuuuu 
 
 
 
4. Registrador PORTB (endereço 06H) 
Nº dos bits Bit 7 bit 6 Bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0/INT 
Power on reset R/W-x R/W-x R/W-x R\W-x R/W-x R/W-x R/W-x R/W-x 
Obs.: Valor dos bits após os demais resets: uuuuuuuu 
5. Registrador TRISA (endereço 85H) 
Registrador de direção de dados da porta A. 
Os registradores TRIS servem para configurar os pinos das portas como entrada ou 
saída. Quando é colocado “1” em um bit do TRIS, o pino relacionado a ele é configurado 
com entrada. Para configurar o pino com saída, você deve escrever “0” no bit relacionado. 
Uma maneira prática para memorizar esta regra é associar o “1” ao “I” de Input (entrada), e 
o “0” de Output (saída). Para configurar o PORTA, deve ser utilizado o TRISA, e para 
configurar o PORTB, deve ser utilizado o TRISB. 
Nº dos bits bit 7 bit 6 Bit 5 Bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - TRISA4 TRISA3 TRISA2 TRISA1 TRISA0Power on reset - - - R\W-1 R/W-1 R/W-1 R/W-1 R/W-1 
Obs.: Valor dos bits nos demais resets: ---11111 
 
6. Registrador TRISB (endereço 86H) 
Registrador de direção de dados da porta B. 
Nº dos bits bit 7 Bit 6 Bit 5 Bit 4 bit 3 bit 2 bit 1 bit 0 
Bits TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 
Power on reset R/W-1 R/W-1 R/W-1 R\W-1 R/W-1 R/W-1 R/W-1 R/W-1 
Obs.: Valor dos bits nos demais resets: 11111111 
 
7. Registrador INDF (endereços 00h e 80h) e o FSR (endereços 04h e 84h) 
O registrador INDF usa o conteúdo de FSR para endereçamento indireto de memória de 
dados (não é um registrador físico). O FSR é um registrador em que pode ser escrito um 
outro endereço de memória que será acessado indiretamente, como se ele fosse apenas um 
ponteiro. Já o INDF não é um registrador realmente verdadeiro; trata-se somente de um 
espelho do endereço apontado pelo FSR. 
O INDF não é um registrador verdadeiro, é usado para o endereçamento indireto. 
Os bits de FSR estão representados a seguir: 
Nº dos bits bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - - - - - - 
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x 
Obs.: O valor dos bits após os demais resets será: uuuuuuuu 
 
8. Registrador TRM0 (endereço 01h) 
É um contador automático de 8 bits. A diferença entre o registrador TMR0 e os demais 
registradores é que seu incremento é automático e pode ser feito pelo clock da máquina ou 
por um sinal externo. Esse registrador será estudado em detalhes no capítulo VI. 
 
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - - - - - - 
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x 
Obs.: O valor dos bits após os demais resets será: uuuuuuuu 
 
9. Registrador PCL (endereços 02h e 82h) e o PCLATH (endereços 0Ah e 8Ah) 
 O PCL é a parte baixa (8 bits menos significativo) do Contador de Programa (PC = 
‘Program Counter’). 
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - - - - - - 
Power on reset R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 
Obs.: O valor dos bits após os demais resets será: 00000000 
O PCLATH, parte alta (5 bits mais significativos) do Contador de Programa. Como 
a área de memória de programação do PIC16F628 é maior que 256 bytes, não é possível 
acessá-la completamente com somente 8 bits do PCL. Por isso, o PCLATH possui os 5 bits 
mais altos do PC. 
 
 
Nº dos bits Bit 7 bit 6 Bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - - - - - - 
Power on reset - - - R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 
Obs.: O valor dos bits após os demais resets será: ---00000 
O Contador de Programa (Program Counter = PC) e a Pilha (Stack) são dois 
componentes importantes para a compreensão da instrução de salto e chamada a subrotina. 
Como foi visto no capítulo anterior, o PIC16F628 inicia a execução do programa a partir do 
Reset Vector, ou seja, da localização de memória 0000H. Depois de ter executado esta 
instrução passa para a próxima instrução memorizada na localização 0001H e assim por 
diante. Se não existisse instrução capaz de influenciar a execução progressiva do programa, 
o PIC chegaria até o final na última instrução memorizada na última localização e não 
saberia mais como continuar. 
Sabemos obviamente que não é bem assim e qualquer sistema a microprocessador 
ou linguagem de programação dispõe de instrução de desvio, ou seja, instruções capazes de 
modificar o fluxo de execução do programa. Uma destas instruções é o goto (do inglês go 
to, vá para). Quando o PIC encontra um goto não segue mais a instrução imediatamente 
após, mas desvia-se diretamente para a localização de memória especificada na instrução. 
Façamos um exemplo: 
 ORG 00H 
Point1 
 movlw 10 
 goto Point1 
No reset o PIC seguirá a instrução movlw 10 memorizada na localização 0000H que 
colocará no acumulador o valor decimal 10. Onde então passará a executar a próxima 
instrução goto Point1. Esta instrução determinará um desvio incondicional para localização 
de memória especificada pelo label Point1, ou seja, de novo para localização 0000H. O 
programa não fará outra coisa se não a de executar um ciclo infinito seguindo 
continuamente as instruções especificadas. Durante este ciclo, para determinar qual é a 
próxima instrução a ser seguida, o PIC utiliza um registrador especial denominado Program 
Counter, ou seja, contador de programa. Este terá sempre o endereço da próxima instrução 
a ser executada. No RESET este estará sempre zerado, determinando o início da execução 
no endereço 0000H, e cada instrução terá um incremento de um para poder passar para 
próxima instrução. A instrução goto permite a colocação de um novo valor no Program 
Counter e consequentemente desvia a uma localização qualquer da área de programa do 
PIC. 
Uma outra instrução muito interessante é o call, ou seja, a chamada a subrotina. Esta 
instrução funciona de maneira muito similar ao goto com a única diferença que, a primeira, 
desvia para uma localização de memória especificada e continua a execução do programa, 
enquanto o call desviará o programa para uma subrotina especificada e executará a mesma, 
e retornará a execução da instrução imediatamente após a chamada call, o valor 
imediatamente após a chamada call será armazenado em uma área particular da memória 
denominada Stack (Pilha). 
Vejamos melhor com um exemplo: 
 ORG 00H 
Point1 
 movlw 10 
 call Point2 
 goto Point1 
Point2 
 movlw 11 
 return 
Neste caso o PIC, após ter executado movlw 10 passa a executar o call Point2. 
Antes de desviar memoriza no Stack o endereço 0002H, ou seja, a próxima localização ao 
call. Passa então a executar a instrução movlw 11, memorizada em correspondência ao 
label Point2. E neste ponto encontra uma nova instrução o return que, como podemos 
deduzir de seu nome, permite o "RETORNO", ou seja, retorne a execução da instrução 
imediatamente após o call. Esta operação é denominada de: "chamada a subrotina", ou seja, 
uma interrupção momentânea do fluxo normal do programa para "chamar" a execução de 
uma série de instruções, para depois retornar a execução normal do programa. Para poder 
retornar para onde havia interrompido, o PIC utiliza o último valor armazenado no Stack e 
o coloca de novo no Program Counter. A palavra stack em inglês significa "pilha" e por 
esse fato é possível empilhar um endereço sobre o outro para ser recuperado quando 
necessário. Este tipo de memorização era antes denominado de LIFO do inglês Last In First 
Out, onde o último elemento armazenado (last in) deve necessariamente ser o primeiro a 
sair (last out). Graças ao Stack é possível efetuar vários call, um dentro do outro, e manter 
sempre o retorno ao fluxo do programa quando se encontra uma instrução return. 
Vejamos um outro exemplo: 
 ORG 00H 
Point1 
 movlw 10 
 call Point2 
 goto Point1 
Point2 
 movlw 11 
 call Point3 
 return 
Point3 
 movlw 12 
 return 
No exemplo acima a rotina principal Point1 promove a chamada do primeiro call 
para subrotina Point2, a subrotina Point2 chama outra subrotina no caso Point3, este último 
por sua vez, encontra um returm e retorna para Point2 que encontra o outro return e retorna 
para a execução da rotina Point1 que no caso é a principal. Os endereços a serem 
memorizados no stack são dois e quando vir a encontrar um segundo call procurará pelo 
return correspondente ao primeiro e assim por diante. Diz-se então que o call é 
"nidificante", ou seja, um dentro do outro. 
O PIC16F628 dispõe de um stack de 8 níveis, ou seja um Stack que consegue 
armazenar no máximo 8 chamadas à subrotina. É importante assegurar-se, durante a 
formulação de um programa que, se tenha sempre uma instrução returm em 
correspondência a um call para evitar o perigo de desalinhamento do stack que em 
execução pode gerar erros que dificilmente encontraremos. 
 
10. Registrador EEDATA (endereço 08h) 
EEDATA é o registrador de dados da EEPROM. Ele possui duas funções distintas: nas 
operações de escrita da EEPROM, ele deve serpreenchido com o dado a ser armazenado, já 
nas operações de leitura, ele armazena o dado lido. 
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - - - - - - 
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x 
Obs.: O valor dos bits após os demais resets será: uuuuuuuu 
 
11. Registrador EEADR (endereço 09h) 
EEADR é o registrador de endereços da EEPROM. Ele especifica o endereço de escrita 
ou leitura do endereço da EEPROM interna ao PIC. 
 
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - - - - - - 
Power on reset R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x 
Obs.: O valor dos bits após os demais resets será: uuuuuuuu 
 
12. Registrador INTCON (endereços 0BH e 8Bh) 
Contém os vários bits de habilitação e estados de todas as fontes de interrupção do 
PIC16F628. Ele serve para configurar e identificar as interrupções. 
 
 
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Nomes dos bits GIE EEIE T0IE INTE RBIE T0IF INTF RBIF 
Power-on-reset R/W-0 R/W-0 R/W-0 R\W-0 R/W-0 R/W-0 R/W-0 R/W-x 
Obs.: Valor dos bits após os demais resets: 0000000u 
Descrição dos bits: 
bit 7: GIE, Bit de habilitação da interrupção global, p/ bit7=1 habilita todas as interrupções 
não mascaráveis e p/ bit7=0 desabilita todas as interrupções. 
Bit 6: EEIE, Bit de habitação da interrupção completa de escrita na EEPROM interna do 
PIC, p/ bit6=1 habilita interrupção de escrita na EEPROM e p/ bit6=0 desabilita a 
interrupção. 
Bit 5: T0IE, Bit de habitação da interrupção de overflow do Timer 0 (TMR0), p/ bit5=1 
habilita a interrupção de TMR0 e p/ bit5=0 desabilita a interrupção. 
Bit 4: INTE, Bit de habitação da interrupção RB0/INT, p/ bit4=1 habilita a interrupção de 
RB0/INT e p/ bit4=0 desabilita a interrupção. 
Bit 3: RBIE, Bit de habitação da interrupção de mudança de nível na porta B (bits RB7 a 
RB4), p/ bit3=1 habilita a interrupção de mudança de nível na porta B e p/ bit3=0 desabilita 
a interrupção. 
Bit 2: T0IF, Bit de “flag” da interrupção de overflow do Timer 0 (TMR0), se bit2=1 
implica que ocorreu um overflow no TMR0 (deve ser zerado no programa) e se bit2=0 
implica que não ocorreu a interrupção. 
Bit 1: INTF, Bit de “flag” da interrupção RB0/INT, se bit1=1 implica que ocorreu uma 
RB0/INT e se bit1=0 implica que não ocorreu a interrupção. 
Bit 0: RBIF, Bit de “flag” da interrupção de mudança de nível na porta B, se bit0=1 implica 
que ocorreu uma mudança de estado num dos pinos RB7:RB4 (deve ser zerado no 
programa) e se bit0=0 implica que não ocorreu a interrupção. 
 
13. Registrador OPTION_REG(endereço 81h) 
Contém vários bits de controle. Serve para configurar uma série de opções para a 
operação do microcontrolador. 
Nº dos bits Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 
Bits /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 
Power on reset R/W-1 R/W-1 R/W-1 R\W-1 R/W-1 R/W-1 R/W-1 R/W-1 
Obs.: Valor dos bits após os demais resets: 11111111 
Descrição dos bits: 
bit 7: /RBPU, bit de habilitação de pull-up na porta B, p/ bit7 = 1 desabilita pull-up e p/ 
bit7=0 habilita pull-up. 
bit 6: INTEDG, bit de seleção de borda de interrupção, p/ bit6 = 1 interrupção na borda de 
subida do pino RB0/INT e p/ bit6 = 0 interrupção na borda de descida do pino RB0/INT. 
bit 5: T0CS, bit de seleção da fonte de clock do TMR0, p/ bit5 = 1 clock colocado na 
entrada do pino RA4/T0CKI e p/ bit5 = 0 clock interno. 
bit 4: T0SE, bit de seleção da borda da fonte de clock do TMR0, p/ bit4 = 1 incrementa na 
transição de alto para baixo no pino RA4/T0CKI e p/ bit4 = 0 incrementa na transição de 
baixo para alto no pino RA4/T0CKI. 
Bit 3: PSA, bit de sinalização do “prescaler”, p/ bit3 = 1 assinala o “prescaler” ao WDT e p/ 
bit3=0 assinala o “prescaler” ao TMR0. 
Bit 2-0: PS2, PS1 e PS0, bits de seleção da razão do “prescaler”. 
 
PS2 PS1 PS0 Divisor p/ o TMR0 Divisor p/ o WDT 
0 0 0 2 1 
0 0 1 4 2 
0 1 0 8 4 
0 1 1 16 8 
1 0 0 32 16 
1 0 1 64 32 
1 1 0 128 64 
1 1 1 256 128 
14. Registrador EECON1 (endereço 88h) 
O EECON1 é o registrador de controle de escrita e leitura na EEPROM interna do PIC. 
Nº dos bits bit 7 Bit 6 Bit 5 Bit 4 bit 3 bit 2 bit 1 bit 0 
Bits - - - EEIF WRERR WREN WR RD 
Power on reset U U U R\W-0 R/W-x R/W-0 R/S-0 R/S-0 
Obs.: Valor dos bits nos demais resets: ---0q000 
 
Descrição dos bits: 
bit 7-5: Não implementados, ler como ‘0’. 
bit 4: EEIF, bit de flag de interrupção na operação de escrita na EEPROM, se bit4 = 1 
implica que a operação de escrita foi completado (deve ser zerado no programa) e se bit4 = 
0 implica que a operação de escrita não foi completada ou ainda não foi inicializada. 
bit 3: WRERR, bit de flag de erro da EEPROM, se bit3 = 1 implica que uma operação de 
escrita foi prematuramente terminada e se bit3 = 0 implica que a operação de escrita foi 
completada. 
bit 2: WREN, bit de habilitação de escrita na EEPROM, p/ bit2 = 1 segue ciclos de escrita e 
p/ bit2 = 0 inibe escrita de dados na EEPROM. 
bit 1: WR, bit de controle de escrita na EEPROM, p/ bit1 = 1 inibe um ciclo de escrita 
(obs.: esse bit é zerado por hardware uma vez que a escrita é completada, o bit WR não 
pode ser zerado no programa). Se bit1 = 0 indica que o ciclo de escrita de dados na 
EEPROM foi completado. 
bit 0: RD, bit de controle de leitura na EEPROM, p/ bit0 = 1 inicializa uma leitura na 
EEPROM (obs.: esse bit é zerado por hardware uma vez que a leitura é completada, o bit 
RD não pode ser zerado no programa, pode somente ser setado). Se bit0 = 0 indica que a 
leitura de dados da EEPROM não foi inicializada. 
 
15. Registrador EECON2 (endereço 89h) 
EECON2 não é um registrador físico. O EECON2 é usado exclusivamente em uma 
seqüência de escrita de dados na EEPROM. Veja o Capítulo IX para mais detalhes. 
 
 
 
Capítulo V - Conjunto de Instruções do PIC16F628 
 
Observações quanto aos termos utilizados na construção dos nomes das instruções e 
seus argumentos: 
• Work: Trata-se de um registrador temporário para as operações da ULA. No Assembler 
do PIC, ele é conhecido como W. Também é comum chamá-lo de acumulador. 
• File: Referência a um registrador (posição de memória) propriamente dito. Utilizaremos 
a letra F para sua representação nos nomes de instruções e f nos argumentos delas. 
• Literal: Um número qualquer que pode ser escrito na forma decimal, hexadecimal ou 
binária. Utilizaremos a letra L para sua representação nos nomes de instruções e k nos 
argumentos delas. 
• Destino: O local onde deve ser armazenado o resultado da operação. Os destinos 
podem ser 0 (W ) ou 1 (F). A letra d será usada para indicar o destino de uma instrução, 
o destino pode ser o acumulador (d=0) ou o registrador (d=1). 
• Bit: Refere-se a um bit específico dentro de um byte. Utilizaremos a letra B para sua 
representação nos nomes das instruções e b nos argumentos delas. 
Para facilitar as operações de seus registradores especiais na RAM (que como 
recordamos estava incluído no código com a diretiva INCLUDE), a Microchip inseriu uma 
lista de nomes que identificam univocamente qualquer registrador especial e a qual está 
associado o endereço correspondente na área da memória RAM. 
Se, por exemplo, quisermos definir toda a linha do PORTB do PIC como saída, 
devemos agir sobre o TRISB. Podemos escolher e referenciar diretamente o registrador 
com o seu endereço: 
 movlw B'00000000' 
 movwf 86H ; Endereço de TRISB 
ou então, referenciar o mesmo registrador com o seu nome simbólico, neste caso tendo que 
ter a certeza de ter inserido a diretiva INCLUDE "P16F628.INC" (mostrado no Apêndice A 
desta apostila): 
 movlw B'00000000' 
 movwf TRISB ; Nome simbólico do endereço de TRISB 
 Para facilitar o estudo das instruções do PIC, organizamos a seguir duas tabelas. 
Uma com as instruções em ordem alfabética e a outra com as instruções divididas em 
quatro grupos, conforme as suas aplicações: 
• Operações com registradores;• Operações com literais; 
• Operações com bits; 
• Controles. 
 
Conjunto de instruções do PIC16F628 
Operações em ordem alfabética 
Instrução Argumento
s 
Descrição 
ADDLW K Soma k com W, guardando o resultado em W (W = W + k). 
ADDWF f,d Soma W e f, guardando o resultado em d (d = W + f). 
ANDLW K Lógica “E” entre k e W, guardando o resultado em W (W = W AND k).
ANDWF f,d Lógica “E” entre W e f, guardando o resultado em d (d = W AND f). 
BCF f,b Zera o bit b do registrador f. 
BSF f,b Seta o bit b do registrador f. 
BTFSC f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero).
BTFSS f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um). 
CALL Label Chamada a uma subrotina no endereço Label. 
CLRF F Limpa o registrador f (f = 0). 
CLRW Limpa o acumulador (W = 0). 
CLRWDT Limpa o registrador WDT para evitar o reset (Watchdog timer = 0). 
COMF f,d Pega o complemento de f, guardando o resultado em d (d = not f). 
DECF f,d Decrementa f, guardando o resultado em d (d = f -1). 
DECFSZ f,d Decrementa f, guardando o resultado em d, e pula a próxima linha se o
resultado for zero (d = f –1, skip se zero). 
GOTO Label Desvia para o endereço Label. 
INCF f,d Incrementa f, guardando o resultado em d (d = f +1). 
INCFSZ f,d Incrementa f, guardando o resultado em d, e pula a próxima linha se o
resultado for zero (d = f+1, skip se zero). 
IORLW K Lógica OU entre k e W, guardando o resultado em W (W = W OR k). 
IORWF f,d Lógica OU entre W e f, guardando o resultado em d (d = f OR W). 
MOVLW K Move (copia) valor literal k para o acumulador W (W = k). 
MOVF F,d Move (copia) valor de registrador f para destino d (d = f). 
MOVWF F Move (copia) valor do acumulador W para o registrador f (f = W). 
NOP Nenhuma operação, gasta um ciclo de máquina sem fazer nada. 
RETFIE Retorno de uma interrupção. 
RETLW K Retorno de uma rotina, com k em W. 
RETURN Retorna de uma rotina. 
RLF f,d Rotaciona f um bit a esquerda, guardando o resultado em d (d = f << 1).
RRF f,d Rotaciona f um bit a direita, guardando o resultado em d (d = f >> 1). 
SLEEP Coloca o PIC em modo sleep (dormindo) para economia de energia. 
SUBLW K Subtrai W de k, guardando o resultado em W (W = k – W). 
SUBWF f,d Subtrai W de f, guardando o resultado em d (d = f - W). 
SWAPF f,d Executa uma inversão entre o nibble da parte alta e o nibble da parte
baixa de f, guardando o resultado em d. 
XORLW W Lógica ou-exclusivo entre k e W, guardando o resultado em W (W=W
XOR k). 
XORWF f,d Lógica ou-exclusivo entre W e f, guardando o resultado em d (d=W
XOR f). 
 
Conjunto de instruções do PIC16F628 
Instrução Argumentos Descrição 
Grupo 1: Operações com registradores 
ADDWF f,d Soma W e f, guardando o resultado em d (d = W + f). 
ANDWF f,d Lógica “E” entre W e f, guardando o resultado em d (d = W AND f). 
CLRF F Limpa o registrador f (f = 0). 
COMF f,d Pega o complemento de f, guardando o resultado em d (d = not f). 
DECF f,d Decrementa f, guardando o resultado em d (d = f -1). 
DECFSZ f,d Decrementa f, guardando o resultado em d, e pula a próxima linha se o resultado
for zero (d = f –1, skip se zero). 
INCF f,d Incrementa f, guardando o resultado em d (d = f +1). 
INCFSZ f,d Incrementa f, guardando o resultado em d, e pula a próxima linha se o resultado
for zero (d = f+1, skip se zero). 
IORWF f,d Lógica OU entre W e f, guardando o resultado em d (d = f OR W). 
MOVF F,d Move (copia) valor de registrador f para destino d (d = f). 
MOVWF F Move (copia) valor do acumulador W para o registrador f (f = W). 
RLF f,d Rotaciona f um bit a esquerda, guardando o resultado em d (d = f << 1). 
RRF f,d Rotaciona f um bit a direita, guardando o resultado em d (d = f >> 1). 
SUBWF f,d Subtrai W de f, guardando o resultado em d (d = f - W). 
SWAPF f,d Executa uma inversão entre o nibble da parte alta e o nibble da parte baixa de f,
guardando o resultado em d. 
XORWF f,d Lógica ou-exclusivo entre W e f, guardando o resultado em d (d=W XOR f). 
Grupo 2: Operações com literais 
ADDLW K Soma k com W, guardando o resultado em W (W = W + k). 
ANDLW K Lógica “E” entre k e W, guardando o resultado em W (W = W AND k). 
IORLW K Lógica OU entre k e W, guardando o resultado em W (W = W OR k). 
MOVLW K Move (copia) valor literal k para o acumulador W (W = k). 
SUBLW K Subtrai W de k, guardando o resultado em W (W = k – W). 
XORLW W Lógica ou-exclusivo entre k e W, guardando o resultado em W (W=W XOR k).
Grupo 3: Operações com bits 
BCF f,b Zera o bit b do registrador f. 
BSF f,b Seta o bit b do registrador f. 
BTFSC f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero). 
BTFSS f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um). 
Grupo 4: Controles 
CALL Label Chamada a uma subrotina no endereço Label. 
CLRW Limpa o acumulador (W = 0). 
CLRWDT Limpa o registrador WDT para evitar o reset (Watchdog timer = 0). 
GOTO Label Desvia para o endereço Label. 
NOP Nenhuma operação, gasta um ciclo de máquina sem fazer nada. 
RETFIE Retorno de uma interrupção. 
RETLW K Retorno de uma rotina, com k em W. 
RETURN Retorna de uma rotina. 
SLEEP Coloca o PIC em modo sleep (dormindo) para economia de energia. 
 
Explicação detalhada do conjunto de instruções do PIC. 
 
1) ADDLW k ; Soma a constante k a W 
Descrição: Soma a constante k ao valor memorizado no acumulador W e coloca o resultado 
no acumulador. 
Exemplo: 
 movlw 10 
 addlw 12 ; após o trecho de programa, o acumulador W terá o valor 
22 
 
2) ADDWF f,d ; Soma o valor contido em W com o valor contido no 
registrador F 
Descrição: Esta instrução soma o valor contido no acumulador W com o valor contido no 
registrador endereçado pelo parâmetro f. 
Exemplo: Vejamos um exemplo de soma entre dois registradores: 
add1 equ 0CH 
add2 equ 0DH 
 org 00H 
 movlw 10 ;Primeiro somador = 10 
 movwf add1 
 movlw 15 ;Segundo somador = 15 
 movwf add2 
 movf add1,W ;W = add1 
 addwf add2,W ;W = add1 + add2 
 
3) ANDLW k ; Efetua o AND bit a bit entre W e uma constante k 
Descrição: Efetua o AND bit a bit entre o valor contido no acumulador W e o valor 
constante k. O resultado será memorizado no acumulador. 
Exemplo: 
 movlw ‘10101010’B 
 andlw ‘11110000’B 
 ... 
Depois de haver executado este trecho de programa o acumulador W irá valer 
10100000B. 
 
4) ANDWF f,d ; Efetua o AND bit a bit entre o valor contido em W e o valor 
contido no registrador F. 
Descrição: Esta instrução efetua o AND bit a bit entre o valor contido no acumulador W e 
o valor contido no registrador endereçado pelo parâmetro f. 
Exemplo: Freqüentemente o AND será utilizado para mascarar o valor de algum bit dentro 
de um registrador. Se por exemplo quiséssemos extrair do número binário 01010101B os 
quatro bits menos significativo a fim de obter o seguinte valor 00000101B, bastará preparar 
uma máscara do tipo 00001111B e fazer o AND com o nosso valor, vejamos como: 
movlw 01010101B ; Armazena em W o valor binário 
movwf 0CH ; Usa o endereço 0CH para armazenar o valor inicial da 
máscara 
movlw 00001111B ; Prepara a máscara do bit 
andwf 0CH,W ; Efetua o AND e memoriza o resultado no acumulador 
W 
O resultado em W será 00000101B como descrito. 
W = 00001111 AND 
f = 01010101 = 
---------------- 
W = 00000101 
 
5) BCF f,b ; Zera o bit b do registrador F 
Descrição: Esta instrução zera o bit b do registrador no endereço f . 
Exemplo: 
parm1 equ 0CH 
 movlw ‘11111111’B ;Valor inicial 
 movwf parm1 
 bcf parm1,0 
Ao término do programa o registrador parm1 será 11111110B. 
 
6) BSF f,b ;Coloca em nível alto o bit b no registrador F. 
Descrição: Esta instrução coloca em “um” no bit b do registrador que está no endereço f. 
Exemplo: 
parm1 equ0CH 
 movlw 00000000B ;Valore inicial 
 movwf parm1 
 bsf parm1,0 ;D0=1 
Ao terminar o programa o registrador parm1 será 00000001B. 
 
7) BTFSC f,b ; Pula a próxima instrução se o bit b do registrador F for 0 
Descrição: Testa o bit b contido no registrador no endereço f e pula a próxima instrução se 
este valer 0. 
Exemplo: 
parm1 equ 0CH 
 org 00H 
 movlw 11111110B ;Valor inicial 
 movwf parm1 
loop 
 btfsc parm1,0 ;bit0 = 0? Se for, pular próxima instrução. 
 goto loop ;Se não, ficar no loop 
Este programa executa um loop infinito. Entretanto, o mesmo programa não 
executará o loop se substituirmos a instrução: movlw 11111110B pela 
instrução: movlw 11111111B. 
 
 
8) BTFSS f,b ; Pula a próxima instrução se o bit b do registrador F for 1 
Descrição: Testa o bit b contido no registrador do endereço f e pula a instrução seguinte se 
este for 1. 
 
Exemplo: 
parm1 equ 0CH 
 org 00H 
 movlw 11111111B ;Valor inicial 
 movwf parm1 
loop 
 btfss parm1,0 ;bit0 = 1 ? Se for, pular próxima instrução. 
 goto loop ;Se não, ficar no loop 
Este programa executa um loop infinito. O mesmo programa não executará o loop 
se substituirmos a instrução: 
movlw 11111111B pela instrução: movlw 11111110B. 
 
9) CALL k ; Chamada a uma subrotina 
Descrição: Chama uma subrotina memorizada no endereço k. O parâmetro k pode ser 
especificado utilizando-se diretamente o valor numérico do endereço ou então o relativo 
label. 
Exemplo: 
 #define LED1 1 
org 00H 
 call ledOn ; Chama a rotina ledOn 
 
ledOn 
 btfsc PORTB,LED1 ; testa o bit 1 da porta B 
 return 
 
Quando a CPU do PIC encontra uma instrução CALL, memoriza no STACK o 
valor do registrador PC+1 de modo a poder retornar para instrução após o CALL, 
em seguida escreve no PC o endereço da subrotina pulando a execução desta ultima. 
O valor original do PC será recuperado pela subrotina com a execução da instrução 
de retorno RETURN ou RETLW. 
 
No PIC16F628 estão disponíveis 8 níveis de stack (pilha), ou seja a instrução CALL 
dentro de uma subrotina pode ter no máximo 8 chamadas ou 8 níveis. As demais 
chamadas serão sobrepostas às primeiras. 
 
9) CLRF f ; Zera o registrador F 
Descrição: Esta instrução zera o valor contido no registrador endereçado pelo parâmetro f. 
Exemplo: Se quisermos zerar o registrador TMR0 no qual o endereço é 01H hexadecimal, 
a instrução a se executar será: 
clrf 01H 
Ou, se no endereço do nosso código incluirmos o arquivo P16F628.INC, poderemos 
utilizar o nome simbólico do registrador TMR0, ou seja, clrf TMR0. 
 
11) CLRW ; Zera o registrador W 
Descrição: Zera o valor contido no registrador W. 
Exemplo: 
 clrw 
 
12) CLRWDT ; Limpa o registrador WDT para não acontecer o Reset 
Descrição: Esta instrução deve ser utilizada quando programarmos o PIC com a opção 
Watchdog (fusível WDTE). Nesta modalidade o PIC habilita um timer que, uma vez 
transcorrido um determinado tempo, efetua o reset do mesmo. Para evitar o reset do nosso 
programa deveremos executar ciclicamente a instrução CLRWDT para zerar o timer antes 
deste tempo. Se não zerarmos o WDT neste tempo, o circuito de watchdog (do inglês cão 
de guarda) interpretará este como um bloco de programa em execução e efetuará o reset 
para bloquea-lo. 
Exemplo: 
 org 00H 
loop 
 clrwdt 
 goto loop 
 
13) COMF f,d ; Efetua o complemento do registrador F 
Descrição: Esta instrução efetua o complemento do valor contido no registrador 
endereçado pelo parâmetro f. 
Exemplo: 
parm1 equ 0CH 
 org 00H 
 movlw 01010101B 
 movwf parm1 
 comf parm1,F 
Ao término da execução do programa o valor do registrador parm1 será 10101010B. 
 
14) DECF f,d ; Decrementa o conteúdo do registrador F 
Descrição: Esta instrução decrementa o conteúdo do registrador endereçado pelo parâmetro 
f. 
Exemplo: 
movlw 23H ;Escreve em W o valor 23H 
movwf 0CH ;Copia no registrador 0CH o valor de W 
decf 0CH,F ;Decremente o valor contido no registrador 0CH 
 
15) DECFSZ f,b ; Decrementa o valor do registrador f e pula a próxima instrução se o 
resultado for zero. 
Descrição: Decrementa o valor de registrador do endereço f e se o resultado for zero pula a 
próxima instrução. Exemplo: 
counter equ 0CH 
 org 00H 
 movlw 10 ;counter = 10 
 movwf counter 
loop 
 decfsz counter,F ;counter = counter –1, se counter = 0, pula próxima 
instrução 
 goto loop ;se não, continua no loop 
Este programa executa 10 vezes a instrução decfsz até que counter seja = 0. 
 
16) GOTO k ; Desvia a execução do programa para o endereço especificado 
k. 
Descrição: Determina o desvio incondicional do programa em execução para o endereço k. 
O parâmetro k pode ser especificado utilizando-se diretamente um valor numérico do 
endereço ou então o relativo label. 
Exemplo: 
 org 00H 
loop 
 goto loop 
Este programa executa um cilclo (loop) infinito. 
 
17) INCF f,d ; Incrementa o valor do registrador no endereço F. 
Descrição: Incrementa o conteúdo do registrador no endereço f. 
Exemplo: 
movlw 23H ;Escreve em W o valor 23H 
movwf 0CH ;Copia no registrador 0CH o valor de W 
incf 0CH,F ;Incrementa de 1 valor contido no registrador 0CH 
 
 
18) INCFSZ f,b ; Incrementa o valor do registrador f e pula a próxima instrução se o 
resultado for zero. 
Descrição: Incrementa o valor do registrador f e se o resultado for zero pula a próxima 
instrução. 
Exemplo: 
counter equ 0CH 
 org 00H 
 movlw 250 ;counter = 250 
 movwf counter 
loop 
 incfsz counter,F ;counter = counter + 1, se counter = 0 ? pular próxima 
instrução 
 goto loop ; se não, continuar no loop 
Este programa executa para 256-10 = 6 vezes a instrução incfsz até que counter seja 
0. Sendo counter um registrador de 8 bit's quando for incrementado do valor 255 
assume novamente o valor 0 e dai a formula 256 - 10 = 6. 
 
19) IORLW k ; Efetua o OU inclusive entre W e uma constante k 
Descrição: Efetua o OR inclusive entre o valor contido no acumulador W e o valor da 
constante k. 
Exemplo: 
 org 00H 
start 
 movlw 00001111B 
 iorlw 11110000B 
Após ser executado esse programa o acumulador W será 11111111B. 
 
20) IORWF f,d ; Efetua o OR inclusive entre o valor contido em W e o valor contido 
no registrador F 
Descrição: Esta instrução efetua o OR inclusive entre o valor contido no acumulador W e o 
valor contido no registrador endereçado pelo parâmetro f. 
Exemplo: 
parm1 equ 0CH 
 org 00H 
 movlw 00001111B 
 movwf parm1 
 movlw 11111111B 
 iorwf parm1,F 
Ao término do programa o valor do registrador parm1 será 11111111B. 
 
21) MOVLW k ; Copia para W o valor constante k 
Descrição: Passa ao acumulador W um valor constante k. 
Exemplo: 
 org 00H 
movlw 20 
Após ter executado este programa o acumulador W irá a 20. 
 
22) MOVF f,d ;Copia o conteúdo do registrador f para o destino d 
Descrição: Esta instrução copia o conteúdo do registrador endereçado pelo parâmetro f 
para o parâmetro de destino d. Exemplo: O exemplo a seguir copia o valor contido no 
registrador do endereço 0CH no acumulador W: 
 movf 0CH,W 
 
23) MOVWF f ; Copia o conteúdo do registrador W para o registrador F 
Descrição: Esta instrução copia o conteúdo do registrador W no registrador de parâmetro f. 
Exemplo: Para copia o valor 10H noregistrador TMR0. A instrução a se executar será a 
seguinte: 
movlw 10H ;Escreve no registrador W o valor 10H 
movwf TMR0 ;e o memoriza no registrador TMR0 
 
 
 
24) NOP ; Nenhuma operação 
Descrição: Esta instrução não executa nenhuma operação mas é útil para inserir atrasos de 
um ciclo de maquina ou mais. 
Exemplo: 
 nop 
 nop 
Os dois nops acima vai provocar um atraso de 2 uS se utilizarmos um cristal de 4MHz no 
nosso hardware. 
 
25) RETFIE ; Retorna de uma rotina de interrupção 
Descrição: Esta instrução deve ser colocada no término de cada subrotina de controle de 
interrupções para retornar o controle ao programa principal. 
Exemplo: 
 org 00H 
loop 
 goto loop ;Loop infinito 
 org 04H ;Interrupt vector 
intHandler 
 retfie ;Retorna da interrupção 
Neste código o programa principal executa um loop infinito. Se habilitarmos uma 
das interrupções do 16F628 ele não apenas verificará o controle como irá 
automaticamente ao programa alocado no endereço 04H (no exemplo intHandler), a 
instrução RETFIE determinará então o retorno ao loop principal. 
 
26) RETLW k ; Retorna de uma rotina com uma constante k em W 
Descrição: Esta instrução retorna o controle de uma rotina ao programa principal. A 
diferença desta em relação à instrução RETURN é que retflw permite retornar, através do 
acumulador W, o valor k ao programa principal. 
Exemplo: 
rtc equ 0CH 
 org 00H 
 call mySub1 
 movwf rtc 
 ... 
mySub1 
 nop 
 retlw 10 
 
Uma vez executado esse programa ele memorizará no registrador rtc o valor 10 
passado pela subrotina mySub1. 
 
27) RETURN ; Retorna de uma rotina 
Descrição: Esta instrução deve ser inserida no termino de cada subrotina para retornar a 
execução ao programa principal. 
 
Exemplo: 
 org 00H 
 call mySub1 
 .... 
mySub1 
 nop 
 return 
Nota: No PIC16F628 podemos fazer apenas 8 chamadas a subrotinas, do tipo: 
 org 00H 
 call mySub1 
 .... 
mySub1 
 call mySub2 
 return 
mySub2 
 call mySub3 
 return 
mySub3 
 return 
 
28) RLF f,b ;Rotaciona a esquerda o conteúdo do registrador f passando pelo 
Carry 
Descrição: Rotaciona o bit contido no registrador do endereço f para a esquerda (ou seja do 
bit menos significativo para o mais significativo) passando pelo CARRY do registrador 
STATUS como ilustrado na figura a seguir: 
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
CARRY
Figura 7 – Rotação de bit a esquerda 
 
O conteúdo do bit CARRY do registrador STATUS será deslocado para o bit0 
enquanto que o valor do bit7 será deslocado para o CARRY. 
Exemplo: 
parm1 equ 0CH 
 org 00H 
 bcf STATUS,C ;Zera o CARRY 
 movlw 01010101B ;Valor inicial 
 movwf parm1 
 rlf parm1,F 
Ao término do programa o registrador parm1 será 10101010B enquanto o CARRY 
será 0. 
 
 
29) RRF f,b ; Rotaciona para a direita o conteúdo do registrador f 
passando pelo Carry 
Descrição: Rotaciona o bit contido no registrador do endereço f para direita (ou seja do bit 
mais significativo para o menos significativo) passando pelo bit CARRY do registrador 
STATUS como ilustrado na figura a seguir: 
 
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
CARRY
 Figura 8 – Rotação de bit a direita 
 
 O conteúdo do bit CARRY do registrador STATUS será deslocado para o bit7 
enquanto o valor do bit0 será deslocado para o CARRY. 
Exemplo: 
parm1 equ 0CH 
 org 00H 
 bcf STATUS,C ;Zera o CARRY 
 movlw 01010101B ;Valor inicial 
 movwf parm1 
 rrf parm1,F 
Ao término do programa o registrador parm1 será 00101010B enquanto o CARRY 
será 1. 
30) SLEEP ; Coloque o PIC (para dormir) em standby 
Descrição: Esta instrução bloqueia a execução do programa em andamento e coloca o PIC 
em standby (sleep do inglês = dormir). 
Exemplo: org 00H 
 start 
 sleep 
31) SUBLW k ; Subtraia de k o valor em W 
Descrição: Subtrai a constante k do valor memorizado no acumulador W. 
Exemplo: 
 org 00H 
start 
 movlw 10 ; W = 10 
 sublw 12 ; W = 12 - 10 
 ... 
Depois de haver executado este programa o acumulador W será 2. 
 
32) SUBWF f,d ;Subtraia o valor contido em W do valor contido no registrador 
F. 
Descrição: Esta instrução subtrai o valor contido no registrador W do valor contido no 
registrador endereçado pelo parâmetro f. 
Exemplo: Analisando um exemplo extraído do datasheet da Microchip: 
Se inserirmos a instrução: 
subwf REG1,F 
Onde reg1 é o endereço de um registrador qualquer especificado com a diretiva: 
REG1 RES 1 
Para o valor inicial de REG1=3 e W=2, teremos REG1=1 e C=1 porque o resultado 
é positivo. 
Para o valor inicial de REG1=2 e W=2, teremos REG1=0 e C=1 porque o resultado 
é positivo. 
Para o valor inicial de REG1=1 e W=2, teremos REG1=FFH ou seja -1 e C=0 
porque o resultado é negativo. 
 
33) SWAPF f,d ; Troca de nibbles. 
Descrição: Troca o valor dos quatro bits mais significativo (D7-D4) contido no registrador 
do endereço f com os quatro bits menos significativo(D3-D0) do mesmo. 
Exemplo: 
 movlw ‘11110000’B ;Valor inicial 
 swapf parm1,F 
Ao término do programa o registrador parm1 será 00001111B. 
 
34) XORLW k ; Efetua o OR exclusivo entre W e uma constante k 
Descrição: Efetua o OR exclusivo entre o valor contido no acumulador W e o valor 
constante k. 
Exemplo: 
 org 00H 
start 
 movlw 00000000B 
 xorlw 11110000B 
 ... 
Após haver executado este programa o acumulador W será 11110000B. 
35) XORWF f,d ; Efetua o OR exclusivo entre o valor contido em W e o valor 
contido no registrador 
Descrição: Esta instrução efetua o OR exclusivo(XOR) entre o valor contido no 
acumulador W e o valor contido no registrador endereçado pelo parâmetro f. 
Exemplo: Efetuar um XOR entre o registrador W e o registrador REG1 por nós definido no 
endereço 0CH com a diretiva: 
REG1 EQU 0CH 
podemos utilizar a instrução IORWF de duas formas, dependendo onde queremos 
colocar o resultado, ou seja: 
xorwf COUNTER,F ;COUNTER = COUNTER XOR W 
ou então: 
xorwf COUNTER,W ;W = COUNTER XOR W 
 
 
Capítulo VI - AS INTERRUPÇÕES DO PIC16F628 
 
A interrupção é uma técnica particular do PIC que permite interceptar eventos 
externos ao programa em execução, interrompe momentaneamente a operação do programa 
em andamento, controla o evento com uma subrotina apropriada e retorna para a execução 
do programa. 
Fazendo uma analogia, podemos dizer que a interrupção é para o PIC o que para 
nós representaria uma chamada telefônica. Para recebermos um telefonema não precisamos 
nos preocupar em ficar levantando continuamente o monofone do gancho para ver se tem 
alguém querendo falar conosco, mas podemos tranqüilamente aguardar pelo toque da 
campainha quando alguém nos chamar. Quando então apenas levantamos o monofone do 
gancho e interrompemos momentaneamente o sistema de chamada, respondemos ao 
telefonema e, uma vez terminada a conversação, retornamos o monofone ao gancho, ou 
seja, do ponto onde havíamos interrompido. 
Transportando o termo deste parágrafo ao PIC veremos que: 
• O nosso telefone corresponde ao programa em execução; 
• A chamada de alguém corresponde ao evento de controle; 
• O monofone corresponde a requisição de interrupção; 
• A nossa reposta ao telefone corresponde a subrotina de controle da interrupção. 
É evidente que assim como é extremamente mais eficaz se ter uma campainha 
conectada ao telefone é extremamente mais eficaz controlar nosso evento com uma 
interrupção ao invés de diretamente peloprograma. 
O PIC16C84 esta preparado para controlar interrupções ao final de quatro eventos 
diferentes, vejamos quais são: 
1. Ao final da contagem do registrador TMR0, interrupção de TIMER 0. 
1. Interrupção externa por mudança de nível no pino RB0. 
3. A troca de estado sobre uma das linhas de RB4 a RB7, interrupção por mudança de 
estado. 
4. Ao final da escrita sobre um endereço da EEPROM. 
Interrupção de TIMER 0, essa interrupção acontece sempre que um contador de 
tempo interno, denominado TMR0 (Timer 0), estoura, ou seja, como ele é um contador de 8 
bits, sempre que passar de 0xFF para 0x00. Ela é utilizada normalmente para a contagem de 
tempo. Como pode acontecer a qualquer momento, a contagem de tempo fica precisa, não 
dependendo de análises constantes durante o programa para garantir que o tempo seja 
contado. Como veremos em exemplos, o TMR0 pode tanto ser incrementado internamente 
pelo clock da máquina, como também por um sinal externo. Neste caso, ele passa a ser um 
contador de pulsos, podendo ser utilizado para outras finalidades. 
Interrupção externa (RB0/INT), essa interrupção é gerada por um sinal externo 
ligado a uma porta específica do PIC, que no caso é a porta RB0, caso ela esteja 
configurada como entrada. Desta maneira, podemos identificar e processar imediatamente 
um sinal externo. Ela é utilizada para diversas finalidades, como, por exemplo, a 
comunicação entre micros, garantindo o sincronismo, o reconhecimento de botão ou outro 
sinal do sistema que necessite de uma ação imediata. Essa interrupção acontece ou na borda 
de subida ou na borda de descida conforme a configuração da mesma. 
Interrupcção por mudança de estado (RB4 a RB7), essa interrupção acontece em 
ambos os casos, na borda de subida ou na borda de descida, basta haver mudança de estado. 
Esse tipo de interrupção pode ser utilizado, por exemplo, para criar um sincronismo com a 
rede de 60 Hz, para o controle de um triac ou outro sistema semelhante. 
Interrupção de fim de escrita na EEPROM, essa interrupção serve para 
detectarmos o final de uma rotina de escrita na EEPROM do PIC. A utilização da 
interrupção não é obrigatória para que a escrita funcione, mas como a EEPROM é lenta na 
hora de escrever, em alguns sistemas a sua utilização pode ser necessária para evitar uma 
parada durante a escrita na EEPROM. 
A interrupção de qualquer um destes eventos pode ser conseguida agindo sobre os 
bits do registrador INTCON, podemos habilitar ou desabitar esses bits independentemente 
uns dos outros. A Figura abaixo mostra os bits do INTCON. 
 
 
Figura 9 - Interrupções do PIC16F628 
 
Registrador INTCON: 
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF 
• INTE (bit 4) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre 
a linha RB0 
• T0IE (bit 5) se este bit estiver em 1 habilitará a interrupção de final de contagem do 
registrador TMR0 
• RBIE (bit 3) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre 
uma das linhas de RB4 a RB7 
• EEIE (bit 6) se este bit estiver em 1 habilitará a interrupção de final de escrita sobre 
um endereço da EEPROM 
• GIE (bit 7) bit de habilitação geral de interrupção. Esse bit deve ser setado em 1 
antes dos demais. 
Vetor de Interrupção e Controle de Interrupção (Interrupt vector e Interrupt 
handler), qualquer que seja o evento habilitado, ao se manifestar, o PIC interrompe a 
execução do programa em andamento, memoriza automaticamente no STACK o valor 
corrente do PROGRAM COUNTER (PC) e pula para a instrução presente no endereço de 
memória 0004H denominada Interrupt vector (vetor de interrupção). Deste ponto em diante 
devemos colocar a nossa subrotina de controle denominada Interrupt Handler (controle de 
interrupção). Pode-se habilitar mais interrupções e, a primeira providência da interrupt 
handler é a de verificar qual o evento habilitado que gerou a interrupção e a execução da 
parte do programa relativo. Este controle pode ser efetuado utilizando a Interrupt flag. 
Interrupt flag (sinalizador de interrupção), dado que qualquer interrupção gera 
uma chamada do endereço 04H, no registrador INTCON está presente o flag que indica 
qual o evento que gerou a interrupção vejamos: 
• INTF (bit 1), se for 1 é porque a interrupção RB0/INT ocorreu. 
• T0IF (bit 2), se for 1 é porque ocorreu uma interrupção de TMR0. 
• RBIF (bit 0), se for 1 é porque ocorreu uma interrupção de troca de estado de uma 
das linhas de RB4 a RB7. 
Como se pode ver a interrupção de final de escrita na EEPROM não tem previsto 
nenhum flag de sinalização para que a interrupt handler deva considerar que a interrupção é 
um estado gerado deste evento quando todos os três flags supra citados irão a 0. 
Importante: Uma vez conhecido qual o flag que está ativo, a interrupt handler deve 
zerá-lo, ou então não mais gerará interrupção correspondente. 
Retorno de uma interrupt handler, quando for gerada uma interrupção o PIC é 
desabilitada automaticamente o bit GIE (global Interrupt Enable) do registrador INTCON 
de modo a desabilitar todas as interrupções restantes. Para poder retornar ao programa 
principal e reinicializar em 1 este bit deve-se utilizar a instrução: RETFIE 
 
Capítulo VII - O CONTADOR/TEMPORIZADOR (TMR0) 
 
O registrador TMR0 é um contador, ou seja, um registrador particular, na qual, seu 
conteúdo vê-se incrementado com cadência regular e programada ditada pelo hardware do 
PIC. Na prática, a diferença de um outro registrador, é que o TMR0 não mantém inalterado 
o valor que é memorizado, mas o incrementa continuamente, se por exemplo escrevermos 
nele o valor 10 com a instrução: 
movlw 10 
movwf TMR0 
Após um tempo por quatro ciclos de máquina, o conteúdo do registrador começa a 
ser incrementado de +1 ou seja 11, 12, 13 e assim por diante com a cadência constante e 
independente da execução do resto do programa. 
Se por exemplo, após ter colocado um valor no registrador TMR0, executar-mos um 
loop infinito 
 movlw 10 
 movwf TMR0 
loop 
 goto loop 
 
o registrador TMR0 será incrementado pelo hardware interno do PIC durante a execução 
do loop. Uma vez atingido o valor 255 o registrador TMR0 será zerado automaticamente 
recomeçando então a contagem, mas não do valor originalmente imposto mas do zero. 
A freqüência é diretamente proporcional a freqüência de clock aplicada ao chip e 
pode ser modificada programando-se oportunamente os seus bits de configuração. Na 
figura seguinte está representada a cadeia de blocos interno do PIC que determina o 
funcionamento do registrador TMR0. 
 
Figura 10 - Funcionamento do registrador TMR0 
O bloco Fosc/4 e T0CKI representados à esquerda representam as duas possíveis 
fontes de sinal para o contador TMR0. Fosc/4 é um sinal gerado internamente no PIC pelo 
circuito de clock e é igual a freqüência de clock dividida por quatro. T0CKI é um sinal 
gerado de um eventual circuito externo e aplicado ao pino T0CKI correspondente ao pino 3 
no PIC 16F628. 
O blocos T0CS e PSA são dois comutadores de sinal na qual estão representando 
um dos dois tipos de sinal de entrada com base no valor dos bits TOCS e PSA do 
registrador OPTION. 
O bloco PRESCALER é um divisor programável e que seu funcionamento será 
explicado no próximo passo. 
Vejamos na prática como é possível agir sobre este bloco para obter diferentes 
modalidades de contagem pelo registrador TMR0. Iniciaremos programando o bit T0CS em 
0 e PSA em 1. A configuração de funcionamento que obteremos é a representada na figura 
abaixo: 
 
Figura 11 - Percurso do sinal usando o clock interno 
A parte em vermelho (de cima, a partir de Fosc/4) mostra-nos o percurso que efetua 
o sinal antes de chegar ao contador TMR0. 
Como já havia dito anteriormente, a freqüência Fosc/4 é igual a um quarto da 
freqüência de clock. Utilizando-se um cristal de quartzo de 4Mhz teremos uma freqüência 
igual a 1 MHz. Tal freqüência será enviada diretamente ao registrador

Continue navegando