Você está na página 1de 86

Universidade Catlica de Gois

Departamento de Engenharia
Curso de Engenharia Eltrica

MICROCONTROLADORES
PIC16F87x

Prof. Eider Lcio de Oliveira


Prof. derson Lacerda Fideles

Microcontrolador PIC16F87x

SUMRIO
INTRODUO .......................................................................................................................................................... 4
CAPTULO I - O QUE O PIC16F628 .................................................................................................................. 6
PINAGEM DO PIC16F87X .................................................................................................................................... 6
CAPTULO II - CARACTERSTICAS DO PIC16F87X ...................................................................................... 10
CAPTULO III - MEMRIA DE PROGRAMA (FLASH EPROM), MEMRIA DE DADOS (RAM) E
MEMRIA DE DADOS PERMANENTES (EEPROM) ..................................................................................... 12
MEMRIA DE PROGRAMA (FLASH EPROM) ............................................................................................... 12
MEMRIA DE DADOS (RAM) .......................................................................................................................... 13
CAPTULO IV - REGISTRADORES DE FUNES ESPECIAIS ................................................................... 16
REGISTRADOR W (ACUMULADOR OU REGISTRADOR DE TRABALHO) E A ALU (UNIDADE LGICA E ARITMTICA) 16
REGISTRADOR STATUS (ENDEREO 03H E 83H) ................................................................................................... 17
REGISTRADOR PORTA (ENDEREO 05H)............................................................................................................... 18
REGISTRADOR PORTB (ENDEREO 06H)............................................................................................................... 18
REGISTRADOR PORTC (ENDEREO 07H)............................................................................................................... 18
REGISTRADOR PORTD (ENDEREO 08H)............................................................................................................... 19
REGISTRADOR PORTE (ENDEREO 09H) ............................................................................................................... 19
REGISTRADOR TRISA (ENDEREO 85H) ................................................................................................................ 19
REGISTRADOR TRISB (ENDEREO 86H) ................................................................................................................ 19
REGISTRADOR TRISC (ENDEREO 87H) ................................................................................................................ 20
REGISTRADOR TRISD (ENDEREO 88H) ................................................................................................................ 20
REGISTRADOR TRISE (ENDEREO 89H)................................................................................................................. 20
REGISTRADOR INDF (ENDEREOS 00H E 80H) E O FSR (ENDEREOS 04H E 84H)................................................... 20
REGISTRADOR TRM0 (ENDEREO 01H).................................................................................................................. 21
REGISTRADOR PCL (ENDEREOS 02H E 82H) E O PCLATH (ENDEREOS 0AH E 8AH)........................................... 21
REGISTRADOR EEDATA (ENDEREO 08H) ............................................................................................................ 23
REGISTRADOR EEADR (ENDEREO 09H) ............................................................................................................... 24
REGISTRADOR INTCON (ENDEREOS 0BH E 8BH)................................................................................................ 24
REGISTRADOR OPTION_REG(ENDEREO 81H)..................................................................................................... 25
REGISTRADOR EECON1 (ENDEREO 88H) ............................................................................................................. 26
REGISTRADOR EECON2 (ENDEREO 89H) ............................................................................................................. 26
CAPTULO V - CONJUNTO DE INSTRUES DO PIC16F87X.................................................................... 27
EXPLICAO DETALHADA DO CONJUNTO DE INSTRUES DO PIC.......................................................................... 30
CAPTULO VI - AS INTERRUPES DO PIC16F87X .................................................................................... 40
INTERRUPO DE TIMER 0.................................................................................................................................... 41
INTERRUPO EXTERNA (RB0/INT)....................................................................................................................... 41
INTERRUPCO POR MUDANA DE ESTADO (RB4 A RB7) ...................................................................................... 41
INTERRUPO DE FIM DE ESCRITA NA EEPROM ................................................................................................... 41
REGISTRADOR INTCON......................................................................................................................................... 42
CAPTULO VII - O CONTADOR/TEMPORIZADOR (TMR0)........................................................................ 44
CAPTULO VIII MODO POWER DOWN, MODO SLEEP E O WDT ......................................................... 48
O WACHTDOG TIMER (WDT)........................................................................................................................... 48
CAPTULO IX - ESCRITA E LEITURA NA EEPROM DO PIC16F87X ........................................................ 50
BIBLIOGRAFIA ...................................................................................................................................................... 52

Microcontrolador PIC16F87x

APNDICE A - INTRODUO AO MPLAB ...................................................................................................... 53


APNDICE B DETALHES DOS PORTS .......................................................................................................... 67
APNDICE C - KIT DIDTICO PARA PIC16F87X .......................................................................................... 72
APNDICE D DISPLAY DE CRISTAL LQUIDO - LCD .............................................................................. 74

Microcontrolador PIC16F87x

INTRODUO
Um microprocessador um componente eletrnico, que devido s suas modernas tcnicas de
fabricao, consegue efetuar com rapidez, vrias funes e operaes lgicas e aritmticas, sob
controle de um programa externo, que dita para a mquina a seqncia das funes e os
operandos a serem utilizados.
A diferena bsica entre um microcontrolador e um microprocessador que o
microcontrolador j possui internamente vrios circuitos eletrnicos que o microprocessador
precisa usar externamente para ser funcional, tais como: memria de programa, memria de
dados, portas de entrada e sada de sinais (portas de I/O, Input/Output), circuito de reset, circuito
oscilador, contador/temporizador, portas lgicas para selecionar endereos, circuito de
comunicao serial e paralela, conversor A/D, etc.
Ao escolher um projeto microcontrolado em relao aos projetos digitais tradicionais, visa
entre outras coisas: reduo de custo; reduo do consumo de energia; reduo do tamanho do
equipamento; aumento da confiabilidade; proteo de software que vai gravado internamente e a
facilidade de implementao e de suas possveis modificaes atravs de programao.
Atualmente muitos equipamentos de nosso uso dirio, tais como: eletrodomsticos,
videocassetes, alarmes, celulares e brinquedos, entre outros, utilizam microcontroladores para
execuo de suas funes bsicas. Muitos microcontroladores so conhecidos pelos
desenvolvedores de projetos no Brasil, podemos citar os seguintes:

Microcontroladores da famlia 8051 (INTEL e outros fabricantes)

Microcontroladores da famlia PIC (MICROCHIP)

Microcontroladores da famlia 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 dispe de todos os dispositivos tpicos de um sistema microprocessado, ou
seja:

Uma CPU (Central Processor Unit - Unidade de Processamento Central) cuja finalidade
interpretar as instrues de programa.

Uma memria de programa Flash EPROM que possibilita a gravao cerca de 1000
vezes sem a necessidade de apagamento com ultravioleta.

Uma memria RAM (Random Access Memory - Memria de Acesso Aleatrio)

Microcontrolador PIC16F87x

utilizada para memorizar as variveis utilizadas pelo programa.

Uma srie de LINHAS de I/O para controlar dispositivos externos ou receber pulsos de
sensores, chaves, etc.

Uma memria EEPROM para gravar dados permanentes. Cada posio pode ser gravada
cerca de um milho de vezes.

Uma srie de dispositivos auxiliares ao funcionamento, ou seja, gerador de clock,


barramento de dados e controle, contador/temporizador, conversor A/D, comunicao
serial, etc.

A presena de todos estes dispositivos em um espao 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 disponvel em uma ampla gama de modelos para melhor se adaptar as
exigncias de projetos especficos, diferenciando-se pelo nmero de linha de I/O e pelo contedo
do dispositivo. Inicia-se com modelos pequenos identificados pela sigla PIC12Cxx dotados de 8
pinos, at chegar a modelos maiores com sigla PIC16Fxxx dotados de 40 ou mais pinos e os
DSPics (processadores digitais de sinais). Como foi dito na introduo, uma descrio detalhada
do PIC est disponvel no site da microchip www.microchip.com , onde se pode encontrar
grandes e variadas quantidades de informaes tcnicas, manuais, software de apoio, exemplos
de aplicaes e atualizaes disponveis.
Mas, qual microcontrolador escolher?
Ao escolher um microcontrolador devemos analisar o seguinte: facilidade de uso;
disponibilidade de ferramentas de programao, teste e depurao; suporte tcnico; custo e
disponibilidade no mercado; e principalmente, se a famlia de microcontroladores possui vrias
opes de modelos e perifricos, possibilitando assim o reaproveitamento de cdigo para outros
projetos.
A famlia de microcontroladores PIC uma das que atende os requisitos do pargrafo
anterior. A escolha do microcontrador fica a cargo do projetista, mas temos certeza que uma
escolha muito boa, para comear os estudos, a Famlia PIC da Microchip. Nesta apostila feito
um estudo detalhado do PIC16F87x.

Microcontrolador PIC16F87x

Captulo I - O QUE O PIC16F628

O PIC16F87x um circuito integrado produzido pela Microchip, que pertence a


categoria dos microcontroladores, ou seja, um componente integrado, que em um nico
dispositivo, contm todos os circuitos necessrios para realizar um completo sistema digital
programvel. A Figura 1, a seguir, mostra o encapsulamento DIP (DIP = dual in line) e os nomes
descritivos dos pinos do PIC16F628.
PINAGEM DO PIC16F87X

Figura 1 Pinagem do PIC16F87x

A Tabela 1 mostra a descrio de todas as funes de cada pino do


microcontrolador em questo.

Microcontrolador PIC16F87x

Tabela 1 - Descrio da pinagem do PIC16F87x


NOME

FUNO

DESCRIO

RA0

Porta de I/O digital

AN0

Entrada analgica

RA1

Porta de I/O digital

AN1

Porta de I/O digital

RA2

Porta de I/O digital

AN3

Entrada analgica

VREF-/ CVREF

Tenso de referncia negativa analgica

RA3

Porta de I/O digital

AN3

Entrada analgica

VREF+

Tenso de referncia negativa analgica

RA4

Porta de I/O digital Exige resistor de pull-up.

T0CKI

Entrada de clock do TIMER 0

C1OUT

Sada do comparador 1

RA5

Porta de entrada

SS

Habilitao externa (slave select) para comunicao SPI

AN4

Entrada analgica

C2OUT

Sada do comparador 2

RB0

Porta de I/O digital. Pode ter Pull-up interno habilitado por software.

INT

Interrupo externa.

RB1

RB1

Porta de I/O digital. Pode ter Pull-up interno habilitado por software.

RB2

RB2

Porta de I/O digital. Pode ter Pull-up interno habilitado por software.

RB3

Porta de I/O digital. Pode ter Pull-up interno habilitado por software.

PGM

Pino de programao em baixa tenso.

RB4

RB4

Porta de I/O digital. Interrupo na mudana do estado do pino. Pode


ter Pull-up interno habilitado por software.

RB5

RB5

Porta de I/O bidirecional. Interrupo na mudana do estado do pino.


Pode ter Pull-up interno habilitado por software.

RB6/PGC

RB6

Porta de I/O digital. Interrupo na mudana do estado do pino. Pode


ter Pull-up interno habilitado por software.

PGC

Clock da programao serial.

RB7

Porta de I/O digital. Interrupo na mudana do estado do pino. Pode

RA0/AN0

RA1/AN1

RA2/AN2/VREF-/ CVREF

RA3/AN3/VREF+

RA4/T0CKI/C1OUT

RA5/SS/AN4/C2OUT

RB0/INT

RB3/PGM

RB7/PGD

Microcontrolador PIC16F87x

ter Pull-up interno habilitado por software.

RC0/T1OSO/T1CKI

RC1/T1OSI/CCP2

PGD

Data da programao serial.

RC0

Porta de I/O digital.

T1OSO

Sada para oscilador externo para timer 1(TMR1).

T1CKI

Entrada de incremento para TMR1.

RC1

Porta de I/O digital.

T1OSI

Entrada para oscilador externo para TMR1.

CCP2

Entrada do capture2 ou sadas para capture2/PWM2.

RC2

Porta de I/O digital.

CCP1

Entrada do capture1 ou sadas para capture1/PWM1.

RC3

Porta de I/O digital.

RC2/CCP1

RC3/SCK/SCL

SCK
Entrada/sada de clock para comunicao serial SPI/I2C.
SCL

RC4/SDI/SDA

RC4

Porta de I/O digital.

SDI

Entrada de dados para SPI.

SDA

Via de dados (entrada/sada) para I2C.

RC5

Porta de I/O digital.

SDO

Sada de dados para SPI.

RC6

Porta de I/O digital.

TX

Transmisso (TX) de comunicao serial USART.

CK

Clock para comunicao sncrona.

RC7

Porta de I/O digital.

RX

Recepo (RX) de comunicao serial USART.

DT

Data para comunicao sncrona.

RD0

Porta de I/O digital.

PSP0

Dado 0 (comunicao paralela).

RD1

Porta de I/O digital.

PSP1

Dado 1 (comunicao paralela).

RD2

Porta de I/O digital.

RC5/SDO

RC6/TX/CK

RC7/RX/DT

RD0/PSP0

RD1/PSP1

RD2/PSP2

Dado 2 (comunicao paralela).


PSP2

RD3/PSP3

RD3

Porta de I/O digital.

Microcontrolador PIC16F87x
PSP3

Dado 3 (comunicao paralela).

RD4

Porta de I/O digital.

PSP4

Dado 4 (comunicao paralela).

RD5

Porta de I/O digital.

PSP5

Dado 0 (comunicao paralela).

RD6

Porta de I/O digital.

PSP6

Dado 0 (comunicao paralela).

RD7

Porta de I/O digital.

PSP7

Dado 0 (comunicao paralela).

RE0

Porta de I/O digital.

RD

Controle de leitura de porta paralela.

AN5

Entrada analgica.

RE1

Porta de I/O digital.

WR

Controle de escrita de porta paralela.

AN6

Entrada analgica.

RE2

Porta de I/O digital.

CS

Habilitao externa da porta paralela.

AN7

Entrada analgica.

OSC1

Entrada para cristal.

CLKIN

Entrada para osciladores externos (hbridos ou RC).

OSC2

Sada para cristal.

CLKOUT

Sada com onda quadrada em da freqncia imposta em OSC1


quando no modo RC. Essa freqncia equivale aos ciclos de mquina
internos.

MCLR

Mster Clear (reset) externo.

Vpp

Entrada para tenso de programao (13V).

Vss

Vss

GND terra 0Volt.

VDD

VDD

Vcc Alimentao positiva (5Volt).

RD4/PSP4

RD5/PSP5

RD6/PSP6

RD7/PSP7

RE0/RD/AN5

RE1/WR/AN6

RE2/CS/AN7

OSC1/CLKIN

OSC2/CLKOUT

MCLR/Vpp

Como possvel ver na figura acima, o PIC16F87x dotado de um total de 40 pinos


dispostos em duas fileiras paralelas de 20 pinos cada uma (DIP - dual in line). So 33 pinos de
linhas de entrada e sada de sinais (linhas de I/O) para a nossa aplicao, um pino de
alimentao, um de terra (referncia), um de reset (MCLR) e dois de clock (OSC1/CLKIN e
OSC2/CLKOUT).

Microcontrolador PIC16F87x

10

Captulo II - Caractersticas do PIC16F87x

Para o PIC16F87x, podemos citar, entre outras, as seguintes caractersticas:

Microcontrolador de 40 pinos;
33 portas configurveis como entrada ou sada;
Cada porta, pode drenar no mximo 25 mA e fornecer no mximo 20 mA;
Freqncia mxima de operao de 4 a 20 MHz, depende das especificaes do chip;
Possui 15 fontes de interrupo, que so:
1. a interrupo externa;
2. interrupo por overflow do timer TMR0;
3. interrupo por overflow do timer TMR1;
4. interrupo por overflow do timer TMR2;
5. interrupo por mudana de nvel nos pinos da porta B (pinos RB7 a RB4);
6. interrupo por escrita completa na EEPROM;
7. interrupo da porta paralela (PSP);
8. interrupo dos conversores A/D;
9. interrupo de recepo da USART;
10. interrupo de transmisso da USART;
11. interrupo da comunicao serial (SPI e I2C);
12. interrupo do CCP1 (Capture/Compare/PWM);
13. interrupo do CCP2;
14. interrupo dos comparadores;
15. interrupo de coliso de dados (Bus Collision).
Memria de programao FLASH EPROM de 4 Kbytes (PIC16F874) ou 8 Kbytes
(PIC16F877). Pode-se escrever nessa memria cerca de 1000 vezes sem danific-la.
Memria de dados temporrios, RAM separada em bancos de memria. As primeiras
posies de cada banco so reservadas para registradores de funes especiais (SFR - Special
Function Registers). O restantes de cada banco so reservadas aos registradores de propsitos
gerais (GPR - General Purpose Registers). Todos os registradores da RAM so programveis
bit a bit;
Memria de dados permanentes, EEPROM de 256 Bytes. Pode-se escrever em cada bit dessa
memria cerca de 1 milho de vezes sem danific-la;
Via de programao com 14 bits e 35 instrues;
3 Mdulos de timer/counter ;
A faixa de tenso de trabalho est na faixa de 3 a 5,5 volts;
Baixa potncia de consumo - menos de 2 mA para 5 V, 4Mhz; cerca de 15 A para 2 V, 32
KHz e menos de 1A para 2 V (modo Standby);

Os microcontroladores PIC apresentam uma estrutura de mquina interna do tipo


Havard, enquanto grande parte dos microcontradores tradicionais apresenta uma arquitetura tipo
Von-Neumann. A diferena est na forma como os dados e o programa so processados pelo
microcontrolador. Na arquitetura tradicional, tipo Von-Neumann, existe apenas um barramento
(bus) interno (geralmente de 8 bits), por onde passam as instrues e os dados. J na arquitetura
tipo Havard existem dois barramentos internos, sendo um de dados e outro de instrues. No
caso dos microcontroladores PIC, o barramento de dados sempre de 8 bits e o de instrues

Microcontrolador PIC16F87x

11

pode ser de 12, 14 ou 16 bits, dependendo do microcontrolador. Esse tipo de arquitetura permite
que enquanto uma instruo executada outra seja buscada na memria, o que torna o
processamento mais rpido. Alm disso, como o barramento de instrues maior do que 8 bits,
o OPCODE da instruo j inclui o dado e o local onde ela vai operar (quando necessrio), o que
significa que apenas uma posio de memria utilizada por instruo, economizando assim
muita memria de programa.
Desta forma, podemos observar que dentro da palavra o OPCODE, que pode ser de 12,
14 ou 16 bits, no sobra muito espao para o cdigo da instruo propriamente dito. Por isso, os
PICs utilizam uma tecnologia chamada RISC, que significa Reduced Instruction Set Computer
(Computador com conjunto de instrues reduzido). Desta forma, os PICs possuem cerca de 35
instrues (o nmero correto varia de acordo com o microcontrolador), muito menos que os
microcontroladores convencionais (CISC) que chegam a possuir mais de 100 instrues. Isto
torna o aprendizado muito mais fcil e dinmico, mas, por outro lado, implica no fato de que
muitas funes devem ser construdas, pois no possuem uma instruo 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 mquina dura 1us.
A diviso do clock por quatro forma as fases Q1, Q2, Q3 e Q4. O program counter
(registrador PC) incrementado automaticamente na fase Q1 do ciclo de mquina e a instruo
seguinte buscada da memria de programa e armazenada no registrador de instrues no ciclo
Q4. Ela decodificada e executada no prximo ciclo, no intervalo de Q1 at Q4. Esta
caracterstica de buscar a informao num ciclo de mquina e execut-la no prximo
conhecida como PIPELINE. Ela permite que quase todas as instrues sejam executadas em
apenas um ciclo, gastando assim 1us (para um clock de 4 MHz) e tornando o sistema muito mais
rpido. As nicas excees referem-se s instrues que geram saltos no program counter,
como chamadas de rotinas e retornos. Ao executar essas instrues, o PIPELINE deve ser
primeiramente limpo para depois poder ser carregado novamente com o endereo correto,
consumindo para isso 2 ciclos de mquina. Esse PIPELINE facilmente implementado devido
arquitetura Havard.

12

Microcontrolador PIC16F87x

Captulo III - MEMRIA DE PROGRAMA (FLASH EPROM), MEMRIA DE


DADOS (RAM) E MEMRIA DE DADOS PERMANENTES (EEPROM)

MEMRIA DE PROGRAMA (FLASH EPROM)


Em particular o PIC16F628 dispe de uma memria 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 coneco para a programao on-board, ou seja podemos colocar o programa dentro
do chip sem ter que remov-lo do circuito de prova.
A sua capacidade de memorizao de 8.192 locaes (8 K Byte de 14 bits cada) para o
PIC16F877 e que podero conter, cada uma, somente uma instruo bsica do PIC. Logo, o
programa mais complexo que poderemos realizar no poder ter mais do que 8.192 instrues.
Os endereos reservados para Flash EPROM comeam em 0000H e vo at 1FFFH. O
PIC pode somente executar instrues memorizadas nestas locaes. No se pode de maneira
nenhuma ler, escrever ou cancelar dados nesses endereos, a no ser com o uso de um
dispositivo externo chamado programador.
A primeira localizao de memria de programa que ser executada quando o PIC
comear a rodar (aps a alimentao ou um reset) o endereo 0000H, por isso essa localizao
de memria denominada Reset Vector (Vetor de Reset). J, quando ocorre uma interrupo, a
primeira instruo a ser executada est no endereo 0004H, por isto, este endereo denomina-se
endereo de Interrupt Vector (Vetor de Interrupo). O template, exemplo padro, a seguir
mostra como deve ser a estrutura de um programa em Assembly escrito para o PIC16F877 no
MPLAB (compilador, simulador e emulador para o PIC).

;**********************************************************************
list
p=16F877
; diretiva list para definir o processador
#include <p16F877.inc>
; definies de variveis do processador
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC
& _WRT_ENABLE_ON & _LVP_OFF & _CPD_OFF
; Variveis utilizadas pelo usurio
TEMP1 equ 20h
TEMP2 equ 21h
TEMP3 equ 22h

; Trs variveis temporrias

;**********************************************************************

13

Microcontrolador PIC16F87x

ORG 00H
; vetor de reset
goto Inicio
; vai para o inicio do programa
;**********************************************************************
;**********************************************************************
ORG 04H
; vetor de interrupo
retfie
; retorno de interrupo
;**********************************************************************
Inicio
bsf STATUS,RP0
movlw 06H
movwf ADCON1
clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE
bcf STATUS,RP0

;Vai para o banco 1


PORTA funcionar como I/O
; seta todos os bits dos PORTs como sadas

;Vai para o banco 0

loopmain
; Restante do cdigo do programa vai aqui
END
; diretiva de fim de programa
;**********************************************************************

MEMRIA DE DADOS (RAM)


Diferentemente da memria Flash EPROM destinada a conter o programa, a rea de
memria RAM visvel pelo resto do programa. Nela podemos escrever, ler, ou modificar
tranqilamente qualquer registrador do nosso programa a qualquer momento que for necessrio.
A nica limitao consiste de que alguns desses registradores desenvolvem funes especiais
para o PIC que no podem ser utilizados para outra coisa a no ser para aquilo a qual eles esto
reservados. Estes registradores encontram-se nas locaes base da rea de memria RAM
mostrada na Tabela 2.
A localizao de memria presente na RAM endereada diretamente em um espao de
memria que vai de 00H a 7FFH dando um total de 2048 bytes, denominado pgina 0 (ou banco
0). Um segundo espao de endereamento denominado pgina 1 (ou banco 1) vai de 800H a
FFFH. Para acessar esse segundo espao necessrio recorrer a dois bits auxiliares RP0 e RP1
do registrador de STATUS segundo a modalidade que iremos explicar mais adiante. As
primeiras locaes de cada pgina so aquelas reservadas as funes especiais para o
funcionamento do PIC e, como j foi dito, no podem ser utilizadas para outra coisa. As 96
locaes no final da pgina 0 so reservadas para as nossas variveis podem ser endereadas de
020H a 7FH. Podemos, aqui, utilizar livremente pelo nosso programa para memorizar variveis,
contadores, etc.
Em resumo, podemos dizer que a memria RAM do PIC est dividida em quatro bancos.

14

Microcontrolador PIC16F87x

O banco 0 que selecionado zerando os bits RP0 (STATUS<5>) e RP1 (STATUS<6>). O banco
1 que selecionado setando o bit RP0. Os primeiros bytes da RAM so reservados aos
Registradores de Funes Especiais (SFR Special Function Registers), os bytes restantes de
cada banco so reservados aos Registradores de Propsitos Gerais (GPR General Purpose
Registers).
Tabela 2 Mapa da memria de dados do PIC16F628
End. Indir.

00h

End. Indir.

80h

End. Indir.

100h

End. Indir.

180h

TMR0

01h

OPTION REG

81h

TMR0

101h

OPTION REG

181h

PCL

02h

PCL

82h

PCL

102h

PCL

182h

STATUS

03h

STATUS

83h

STATUS

103h

STATUS

183h

FSR

04h

FSR

84h

FSR

104h

FSR

PORTA

05h

TRISA

85h

PORTB

06h

TRISB

86h

PORTC

07h

TRISC

87h

107h

187h

PORTD

08h

TRISD

88h

108h

188h

PORTE

09h

TRISE

89h

109h

189h

PCLATH

0Ah

PCLATH

8Ah

PCLATH

10Ah

PCLATH

INTCON

0Bh

INTCON

8Bh

INTCON

10Bh

INTCON

18Bh

PIR1

0Ch

PIE1

8Ch

EEDATA

10Ch

EECON1

18Ch

EECON2

18Dh

105h
PORTB

106h

184h
185h

TRISB

186h

18Ah

PIR2

0Dh

PIE2

8Dh

EEADR

10Dh

TMR1L

0Eh

PCON

8Eh

EEDATH

10Eh

18Eh

TMR1H

0Fh

8Fh

EEADRH

10Fh

18Fh

T1CON

10h

90h

TMR2

11h

SSPCON2

91h

T2CON

12h

PR2

92h

SSPBUF

13h

SSPADD

93h

SSPCON

14h

SSPSTAT

94h

CCPR1L

15h

95h

CCPR1H

16h

96h

CCP1CON

17h

97h

RCSTA

18h

TXSTA

98h

TSREG

19h

SPBRG

99h

TXREG

1Ah

9Ah

CCPR2L

1Bh

9Bh

CCPR2H

1Ch

9Ch

CCP2CON

1Dh

ADRESH

1Eh

CMCON

ADCON0

1Fh

CVRCON

16 BYTES

REGISTRADORES
DE PROPSITO
GERAL

9Dh

20h

REGISTRADORE
S DE PROPSITO
GERAL

REGISTRADORES DE
PROPSITO GERAL

16 BYTES

9Eh
9Fh

11Fh

A0h

120h
REGISTRADORES DE
PROPSITO GERAL

REGISTRADORES
DE PROPSITO
GERAL

80 BYTES
14Fh

80 BYTES

150h

96 BYTES
EFh
ESPELHO DO
BANCO 0

BANCO 0

BANCO 1

16Fh

F0h

170h
ESPELHO DO BANCO 0

BANCO 2

1EFh
ESPELHO DO
BANCO 0

BANCO 3

1F0h

Microcontrolador PIC16F87x

15

Os registradores de funes especiais (SFR) do PIC sero utilizados com muita


freqncia nos programas. Por exemplo, os registradores TRISA, TRISB, TRISC, TRISD e
TRISE so usados para definir quais linhas de I/O sero entradas e quais sero sadas. O
PORTA, PORTB, PORTC, PORTD e PORTE definem o estado lgico das linhas de I/O. Outro
exemplo o registrador STATUS que registra o estado de funcionamento interno do PIC ou o
resultado de operaes aritmticas e lgicas. necessrio conhecer, portanto, exatamente qual
funo desenvolve cada um dos registradores especiais e qual efeito se obtm ao manipular seus
contedos.
A memria EEPROM interna ao PIC pode ser utilizada pelo usurio para guardar dados.
Entretanto, ao contrrio da memria de dados vista anteriormente, esta uma memria no
voltil, que consegue manter as informaes mesmo sem alimentao. A EEPROM do
PIC16F877 contm 256 Bytes, endereadas de 0 a 255. Pode-se escrever em cada bit dessa
memria cerca de 1 milho de vezes sem danific-la.
A PILHA (STACK) um local totalmente separado da memria de programao, em que
sero armazenados os endereos de retorno quando utilizarmos instrues de chamadas de
rotinas. Quando o programa desviado para o comeo de uma rotina por meio da instruo
correta (call), o endereo 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 nmero de rotinas maior
que o tamanho da pilha, o endereo de retorno mais antigo ser perdido.
Ainda podemos utilizar OUTRAS MEMRIAS, por exemplo, memrias externas. J
esto disponveis no mercado memrias EEPROM serial de 64 Kbytes, que podem ser
interligadas ao PIC utilizando apenas duas portas de I/O. Essas memrias podem ser teis para
armazenar parmetros de programao diferentes daqueles do programa principal.

Microcontrolador PIC16F87x

16

Captulo IV - Registradores de Funes Especiais

Os registradores de funes especiais, tambm denominados de SFR (Special Function


Registers) so usados pela CPU e funes perifricas para controlar as operaes do PIC,
servem para guardar a configurao e o estado de funcionamento atual da mquina. Estes
registradores esto localizados na memria RAM.
A seguir faremos uma descrio detalhada de todos os registradores do PIC16F87x.
Observaes quanto sintaxe:
R/W, bit de leitura e de escrita.
R, bit somente de leitura.
W, bit somente de escrita.
U, bit no implementado, ler como 0.
-1, bit aps o reset vale 1.
-0, bit aps o reset vale 0.
-x, bit aps o reset possui valor indefinido (desconhecido).
-u, bit no se altera aps o reset.
-q, valor do bit depende de condio.

Exemplo1: R/W-0, bit de leitura e escrita, aps o reset vale 0.


Exemplo2: U, bit no implementado, ler como 0.
Exemplo3: R-u, bit somente de leitura, aps o reset o bit possui um valor inalterado.

Registradores:
Registrador W (Acumulador ou registrador de trabalho) e a ALU (Unidade Lgica e
Aritmtica)
A ALU (Arithmetic and Logic Unit) ou ULA (Unidade Lgica e Aritmtica) a
componente mais complexa do PIC por conter todos os circuitos destinados a desenvolver as
funes de clculo e manipulao de dados durante a execuo de um programa. A ALU uma
componente presente em todos os microprocessadores e dessa depende diretamente a capacidade
de clculo do micro em si.
A ALU do PIC16F87x est preparada para operar com 8 bits, ou seja valor numrico no
maior do que 255. Existem processadores com ALU de 16, 32, 64 bits ou mais. A famlia Intel
Pentium, por exemplo, dispe de uma ALU de 64 bits. A capacidade de clculo presente nesses

17

Microcontrolador PIC16F87x

micros notavelmente superior em detrimento da complexidade dos circuitos internos e


consequentemente do espao ocupado.
A ALU referencia diretamente o registrador W denominado antigamente de acumulador.
Este registrador consiste de uma localizao de memria destinada a conter um s valor de 8
bits. A diferena entre o registrador W e outras localizaes de memria consiste no fato de que,
por referenciar o registrador W, a ALU no pode fornecer nenhum endereo, mas podemos
acess-los diretamente. O registrador W ser utilizado freqentemente para intermediar
instrues do PIC.
Faamos um exemplo prtico. Suponhamos querer colocar na localizao de memria
0CH da RAM o valor 01H. Procurando entre as instrues do PIC veremos rapidamente que no
existe uma nica instruo capaz de efetuar esta operao, mas deveremos necessariamente
recorrer ao acumulador e usar duas instrues em seqncia. Vejamos porque:
Como dissemos anteriormente, o opcode de uma instruo no pode exceder aos 14 bits e
assim teremos:

8 bits para especificar o valor que queremos colocar na localizao de memria,

7 bits para especificar em qual localizao de memria queremos inserir o nosso valor,

6 bits para especificar qual instruo queremos usar.


Teremos um total de 8 + 7 + 6 = 21 bits. Devemos ento recorrer a duas instrues, ou

seja:
movlw
movwf

01H
0CH

onde a primeira instruo colocar no registrador W o valor 01H com a instruo MOVe Literal
para W e depois "moveremos" (copiaremos) esse valor para a localizao 0CH com a instruo
MOVe W para F.
Registrador STATUS (endereo 03h e 83h)
Esse registrador serve para mostrar o estado da ULA (bits de Carry e Zero), a forma do
ltimo reset e tambm para configurar a pgina de programao atual, quando necessrio.
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

DC

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 aps os demais resets ser: 000qquuu


Descrio dos bits:
Bit 7: IRP, Bit de seleo de banco de registradores (usado para endereamento indireto), p/
bit7=0 seleciona Bancos 0 e banco 1 (endereos 00 - FFh); j para bit7 = 1 seleciona bancos 2 e
3 (100h - 1FFh). Obs.: Este bit no usado no PIC16F628 (considerar IRP=0).
Bit 6-5: RP1:RP0, Bit de seleo de banco de registradores (usado para endereamento direto).

18

Microcontrolador PIC16F87x

P/ bits 6-5=00 implica seleo do banco 0 (00 - 7Fh), para bits 6-5=01 implica seleo do banco
1 (80h - FFh), para bits 6-5=10 implica seleo do banco 2 (100 - 17Fh) e, para bits 6-5=11
implica seleo 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 aps power-up, instruo CLRWDT ou instruo SLEEP.
Vai a 0 aps ocorrer uma interrupo de WDT (Watch Dog Timer).
Bit 3: /PD, bit de Power-Down. Vai a 1 aps power-up ou instruo CLRWDT. Vai a 0 na
execuo da instruo SLEEP.
Bit 2: Z, bit de Zero. Vai a 1 quando o resultado de uma operao aritmtica ou lgica zero.
Vai a 0 quando o resultado de uma operao aritmtica ou lgica 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 instruo de soma (addlw ou addwf) ou quando a subtrao
(sublw ou subwf) entre dois nibles inferiores negativa. zero quando a ltima operao na
ULA no ocasionou um estouro de dgito.
Bit 0: C, Bit de Carry/Borrow. Este bit vai a 1 quando ocorre um estouro do byte de um
registrador numa instruo de soma (addlw ou addwf) ou quando a subtrao (sublw ou subwf)
entre dois bytes positiva. Note que no caso da subtrao o Carry trabalha com a lgica
invertida. Obs.: As instrues de rotao de bits (rlf ou rrf) tambm alteram o valor do Carry.
Registrador PORTA (endereo 05H)
N dos bits

Bit 7

bit 6

Bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

Bits

RA5

RA4

RA3

RA2

RA1

RA0

Power on reset

R\W-x

R\W-x

R/W-x

R/W-x

R/W-x

R/W-x

Obs: Valor dos bits aps os demais resets: ---uuuuu


Registrador PORTB (endereo 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 aps os demais resets: uuuuuuuu


Registrador PORTC (endereo 07H)
N dos bits

Bit 7

bit 6

Bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

Bits

RC7

RC6

RC5

RC4

RC3

RC2

RC1

RC0

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 aps os demais resets: uuuuuuuu

19

Microcontrolador PIC16F87x

Registrador PORTD (endereo 08H)


N dos bits

Bit 7

bit 6

Bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

Bits

RD7

RD6

RD5

RD4

RD3

RD2

RD1

RD0

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 aps os demais resets: uuuuuuuu


Registrador PORTE (endereo 09H)
N dos bits

Bit 7

bit 6

Bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

Bits

RE2

RE1

RE0

Power on reset

R/W-x

R/W-x

R/W-x

Obs.: Valor dos bits aps os demais resets: uuuuuuuu


Registrador TRISA (endereo 85H)
Registrador de direo de dados da porta A.
Os registradores TRIS servem para configurar os pinos das portas como entrada ou sada.
Quando colocado 1 em um bit do TRIS, o pino relacionado a ele configurado com entrada.
Para configurar o pino com sada, voc deve escrever 0 no bit relacionado. Uma maneira
prtica para memorizar esta regra associar o 1 ao I de Input (entrada), e o 0 de Output
(sada). 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

TRISA0

Power 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


Registrador TRISB (endereo 86H)
Registrador de direo 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

20

Microcontrolador PIC16F87x

Registrador TRISC (endereo 87H)


Registrador de direo de dados da porta C.
N dos bits

bit 7

Bit 6

Bit 5

Bit 4

bit 3

bit 2

bit 1

bit 0

Bits

TRISC7

TRISC6

TRISC5

TRISC4

TRISC3

TRISC2

TRISC1

TRISC0

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


Registrador TRISD (endereo 88H)
Registrador de direo de dados da porta D.
N dos bits

bit 7

Bit 6

Bit 5

Bit 4

bit 3

bit 2

bit 1

bit 0

Bits

TRISD7

TRISD6

TRISD5

TRISD4

TRISD3

TRISD2

TRISD1

TRISD0

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


Registrador TRISE (endereo 89H)
Registrador de direo de dados da porta E.
N dos bits

bit 7

Bit 6

Bit 5

Bit 4

bit 3

bit 2

bit 1

bit 0

Bits

TRISE2

TRISE1

TRISE0

Power on reset

R/W-1

R/W-1

R/W-1

Obs.: Valor dos bits nos demais resets: 11111111


Registrador INDF (endereos 00h e 80h) e o FSR (endereos 04h e 84h)
O registrador INDF usa o contedo de FSR para endereamento indireto de memria de
dados (no um registrador fsico). O FSR um registrador em que pode ser escrito um outro
endereo de memria que ser acessado indiretamente, como se ele fosse apenas um ponteiro. J
o INDF no um registrador realmente verdadeiro; trata-se somente de um espelho do endereo
apontado pelo FSR.
O INDF no um registrador verdadeiro, usado para o endereamento indireto.
Os bits de FSR esto 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 aps os demais resets ser: uuuuuuuu

21

Microcontrolador PIC16F87x

Registrador TRM0 (endereo 01h)


um contador automtico de 8 bits. A diferena entre o registrador TMR0 e os demais
registradores que seu incremento automtico e pode ser feito pelo clock da mquina ou por
um sinal externo. Esse registrador ser estudado em detalhes no captulo 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 aps os demais resets ser: uuuuuuuu


Registrador PCL (endereos 02h e 82h) e o PCLATH (endereos 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 aps os demais resets ser: 00000000


O PCLATH, parte alta (5 bits mais significativos) do Contador de Programa. Como a
rea de memria de programao do PIC16F87X maior que 256 bytes, no possvel 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 aps os demais resets ser: ---00000


O Contador de Programa (Program Counter = PC) e a Pilha (Stack) so dois
componentes importantes para a compreenso da instruo de salto e chamada a subrotina.
Como foi visto no captulo anterior, o PIC16F628 inicia a execuo do programa a partir do
Reset Vector, ou seja, da localizao de memria 0000H. Depois de ter executado esta instruo
passa para a prxima instruo memorizada na localizao 0001H e assim por diante. Se no
existisse instruo capaz de influenciar a execuo progressiva do programa, o PIC chegaria at
o final na ltima instruo memorizada na ltima localizao e no saberia mais como continuar.
Sabemos obviamente que no bem assim e qualquer sistema a microprocessador ou
linguagem de programao dispe de instruo de desvio, ou seja, instrues capazes de
modificar o fluxo de execuo do programa. Uma destas instrues o goto (do ingls go to, v
para). Quando o PIC encontra um goto no segue mais a instruo imediatamente aps, mas

Microcontrolador PIC16F87x

22

desvia-se diretamente para a localizao de memria especificada na instruo.


Faamos um exemplo:
ORG
Point1
movlw
goto

00H
10
Point1

No reset o PIC seguir a instruo movlw 10 memorizada na localizao 0000H que


colocar no acumulador o valor decimal 10. Onde ento passar a executar a prxima instruo
goto Point1. Esta instruo determinar um desvio incondicional para localizao de memria
especificada pelo label Point1, ou seja, de novo para localizao 0000H. O programa no far
outra coisa se no a de executar um ciclo infinito seguindo continuamente as instrues
especificadas. Durante este ciclo, para determinar qual a prxima instruo a ser seguida, o
PIC utiliza um registrador especial denominado Program Counter, ou seja, contador de
programa. Este ter sempre o endereo da prxima instruo a ser executada. No RESET este
estar sempre zerado, determinando o incio da execuo no endereo 0000H, e cada instruo
ter um incremento de um para poder passar para prxima instruo. A instruo goto permite a
colocao de um novo valor no Program Counter e consequentemente desvia a uma localizao
qualquer da rea de programa do PIC.
Uma outra instruo muito interessante o call, ou seja, a chamada a subrotina. Esta
instruo funciona de maneira muito similar ao goto com a nica diferena que, a primeira,
desvia para uma localizao de memria especificada e continua a execuo do programa,
enquanto o call desviar o programa para uma subrotina especificada e executar a mesma, e
retornar a execuo da instruo imediatamente aps a chamada call, o valor imediatamente
aps a chamada call ser armazenado em uma rea particular da memria denominada Stack
(Pilha).
Vejamos melhor com um exemplo:
ORG
Point1
movlw
call
goto
Point2
movlw
return

00H
10
Point2
Point1
11

Neste caso o PIC, aps ter executado movlw 10 passa a executar o call Point2. Antes de
desviar memoriza no Stack o endereo 0002H, ou seja, a prxima localizao ao call. Passa
ento a executar a instruo movlw 11, memorizada em correspondncia ao label Point2. E neste
ponto encontra uma nova instruo o return que, como podemos deduzir de seu nome, permite o
"RETORNO", ou seja, retorne a execuo da instruo imediatamente aps o call. Esta operao
denominada de: "chamada a subrotina", ou seja, uma interrupo momentnea do fluxo normal
do programa para "chamar" a execuo de uma srie de instrues, para depois retornar a
execuo 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
ingls significa "pilha" e por esse fato possvel empilhar um endereo sobre o outro para ser
recuperado quando necessrio. Este tipo de memorizao era antes denominado de LIFO do

23

Microcontrolador PIC16F87x

ingls Last In First Out, onde o ltimo elemento armazenado (last in) deve necessariamente ser
o primeiro a sair (last out). Graas ao Stack possvel efetuar vrios call, um dentro do outro, e
manter sempre o retorno ao fluxo do programa quando se encontra uma instruo return.
Vejamos um outro exemplo:
ORG
Point1
movlw
call
goto
Point2
movlw
call
return
Point3
movlw
return

00H
10
Point2
Point1
11
Point3

12

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
execuo da rotina Point1 que no caso a principal. Os endereos a serem memorizados no
stack so dois e quando vir a encontrar um segundo call procurar pelo return correspondente ao
primeiro e assim por diante. Diz-se ento que o call "nidificante", ou seja, um dentro do outro.
O PIC16F87X dispe de um stack de 8 nveis, ou seja um Stack que consegue armazenar
no mximo 8 chamadas subrotina. importante assegurar-se, durante a formulao de um
programa que, se tenha sempre uma instruo returm em correspondncia a um call para evitar o
perigo de desalinhamento do stack que em execuo pode gerar erros que dificilmente
encontraremos.
Registrador EEDATA (endereo 08h)
EEDATA o registrador de dados da EEPROM. Ele possui duas funes distintas: nas
operaes de escrita da EEPROM, ele deve ser preenchido com o dado a ser armazenado, j nas
operaes 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 aps os demais resets ser: uuuuuuuu

24

Microcontrolador PIC16F87x

Registrador EEADR (endereo 09h)


EEADR o registrador de endereos da EEPROM. Ele especifica o endereo de escrita ou
leitura do endereo 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 aps os demais resets ser: uuuuuuuu


Registrador INTCON (endereos 0BH e 8Bh)
Contm os vrios bits de habilitao e estados de todas as fontes de interrupo do
PIC16F628. Ele serve para configurar e identificar as interrupes.
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 aps os demais resets: 0000000u


Descrio dos bits:
bit 7: GIE, Bit de habilitao da interrupo global, p/ bit7=1 habilita todas as interrupes no
mascarveis e p/ bit7=0 desabilita todas as interrupes.
Bit 6: EEIE, Bit de habitao da interrupo completa de escrita na EEPROM interna do PIC, p/
bit6=1 habilita interrupo de escrita na EEPROM e p/ bit6=0 desabilita a interrupo.
Bit 5: T0IE, Bit de habitao da interrupo de overflow do Timer 0 (TMR0), p/ bit5=1 habilita
a interrupo de TMR0 e p/ bit5=0 desabilita a interrupo.
Bit 4: INTE, Bit de habitao da interrupo RB0/INT, p/ bit4=1 habilita a interrupo de
RB0/INT e p/ bit4=0 desabilita a interrupo.
Bit 3: RBIE, Bit de habitao da interrupo de mudana de nvel na porta B (bits RB7 a RB4),
p/ bit3=1 habilita a interrupo de mudana de nvel na porta B e p/ bit3=0 desabilita a
interrupo.
Bit 2: T0IF, Bit de flag da interrupo 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 no
ocorreu a interrupo.
Bit 1: INTF, Bit de flag da interrupo RB0/INT, se bit1=1 implica que ocorreu uma RB0/INT
e se bit1=0 implica que no ocorreu a interrupo.
Bit 0: RBIF, Bit de flag da interrupo de mudana de nvel na porta B, se bit0=1 implica que
ocorreu uma mudana de estado num dos pinos RB7:RB4 (deve ser zerado no programa) e se
bit0=0 implica que no ocorreu a interrupo.

25

Microcontrolador PIC16F87x

Registrador OPTION_REG(endereo 81h)


Contm vrios bits de controle. Serve para configurar uma srie de opes para a operao
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 aps os demais resets: 11111111


Descrio dos bits:
bit 7: /RBPU, bit de habilitao de pull-up na porta B, p/ bit7 = 1 desabilita pull-up e p/ bit7=0
habilita pull-up.
bit 6: INTEDG, bit de seleo de borda de interrupo, p/ bit6 = 1 interrupo na borda de
subida do pino RB0/INT e p/ bit6 = 0 interrupo na borda de descida do pino RB0/INT.
bit 5: T0CS, bit de seleo 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 seleo da borda da fonte de clock do TMR0, p/ bit4 = 1 incrementa na
transio de alto para baixo no pino RA4/T0CKI e p/ bit4 = 0 incrementa na transio de baixo
para alto no pino RA4/T0CKI.
Bit 3: PSA, bit de sinalizao 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 seleo da razo do prescaler.

PS2

PS1

PS0

Divisor p/ o TMR0

Divisor p/ o WDT

16

32

16

64

32

128

64

256

128

26

Microcontrolador PIC16F87x

Registrador EECON1 (endereo 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

R\W-0

R/W-x

R/W-0

R/S-0

R/S-0

Obs.: Valor dos bits nos demais resets: ---0q000


Descrio dos bits:
bit 7-5: No implementados, ler como 0.
bit 4: EEIF, bit de flag de interrupo na operao de escrita na EEPROM, se bit4 = 1 implica
que a operao de escrita foi completado (deve ser zerado no programa) e se bit4 = 0 implica
que a operao de escrita no foi completada ou ainda no foi inicializada.
bit 3: WRERR, bit de flag de erro da EEPROM, se bit3 = 1 implica que uma operao de escrita
foi prematuramente terminada e se bit3 = 0 implica que a operao de escrita foi completada.
bit 2: WREN, bit de habilitao 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 no 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 no pode ser
zerado no programa, pode somente ser setado). Se bit0 = 0 indica que a leitura de dados da
EEPROM no foi inicializada.
Registrador EECON2 (endereo 89h)
EECON2 no um registrador fsico. O EECON2 usado exclusivamente em uma
seqncia de escrita de dados na EEPROM. Veja o Captulo IX para mais detalhes.

27

Microcontrolador PIC16F87x

Captulo V - Conjunto de Instrues do PIC16F87X

Observaes quanto aos termos utilizados na construo dos nomes das instrues e seus
argumentos:

Work: Trata-se de um registrador temporrio para as operaes da ULA. No Assembler do


PIC, ele conhecido como W. Tambm comum cham-lo de acumulador.
File: Referncia a um registrador (posio de memria) propriamente dito. Utilizaremos a
letra F para sua representao nos nomes de instrues e f nos argumentos delas.
Literal: Um nmero qualquer que pode ser escrito na forma decimal, hexadecimal ou
binria. Utilizaremos a letra L para sua representao nos nomes de instrues e k nos
argumentos delas.
Destino: O local onde deve ser armazenado o resultado da operao. Os destinos podem ser
0 (W ) ou 1 (F). A letra d ser usada para indicar o destino de uma instruo, o destino pode
ser o acumulador (d=0) ou o registrador (d=1).
Bit: Refere-se a um bit especfico dentro de um byte. Utilizaremos a letra B para sua
representao nos nomes das instrues e b nos argumentos delas.

Para facilitar as operaes de seus registradores especiais na RAM (que como


recordamos estava includo no cdigo com a diretiva INCLUDE), a Microchip inseriu uma lista
de nomes que identificam univocamente qualquer registrador especial e a qual est associado o
endereo correspondente na rea da memria RAM.
Se, por exemplo, quisermos definir toda a linha do PORTB do PIC como sada, devemos
agir sobre o TRISB. Podemos escolher e referenciar diretamente o registrador com o seu
endereo:
movlw B'00000000'
movwf 86H

; Endereo de TRISB

ou ento, referenciar o mesmo registrador com o seu nome simblico, neste caso tendo que ter a
certeza de ter inserido a diretiva INCLUDE "P16F628.INC" (mostrado no Apndice A desta
apostila):
movlw B'00000000'
movwf TRISB

; Nome simblico do endereo de TRISB

Para facilitar o estudo das instrues do PIC, organizamos a seguir duas tabelas. Uma
com as instrues em ordem alfabtica e a outra com as instrues divididas em quatro grupos,
conforme as suas aplicaes:

Operaes com registradores;

Operaes com literais;

Operaes com bits;

Controles.

Microcontrolador PIC16F87x

28

Conjunto de instrues do PIC16F628


Operaes em ordem alfabtica
Instruo Argumento
Descrio
s
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
Lgica E entre k e W, guardando o resultado em W (W = W AND k).
ANDWF
f,d
Lgica 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 prxima linha se ele for 0 (zero).
BTFSS
f,b
Testa o bit b do registrador f, e pula a prxima linha se ele for 1 (um).
CALL
Label
Chamada a uma subrotina no endereo 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 prxima linha se o
resultado for zero (d = f 1, skip se zero).
GOTO
Label
Desvia para o endereo 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 prxima linha se o
resultado for zero (d = f+1, skip se zero).
IORLW
K
Lgica OU entre k e W, guardando o resultado em W (W = W OR k).
IORWF
f,d
Lgica 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 operao, gasta um ciclo de mquina sem fazer nada.
RETFIE
Retorno de uma interrupo.
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 inverso entre o nibble da parte alta e o nibble da parte
baixa de f, guardando o resultado em d.
XORLW
W
Lgica ou-exclusivo entre k e W, guardando o resultado em W (W=W
XOR k).
XORWF
f,d
Lgica ou-exclusivo entre W e f, guardando o resultado em d (d=W
XOR f).

29

Microcontrolador PIC16F87x

Conjunto de instrues do PIC16F628


Instruo

Argumentos

Descrio

Grupo 1: Operaes com registradores


ADDWF
ANDWF
CLRF
COMF
DECF
DECFSZ

f,d
f,d
F
f,d
f,d
f,d

Soma W e f, guardando o resultado em d (d = W + f).


Lgica E entre W e f, guardando o resultado em d (d = W AND f).
Limpa o registrador f (f = 0).
Pega o complemento de f, guardando o resultado em d (d = not f).
Decrementa f, guardando o resultado em d (d = f -1).
Decrementa f, guardando o resultado em d, e pula a prxima 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 prxima linha se o resultado
for zero (d = f+1, skip se zero).
IORWF
f,d
Lgica 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 inverso entre o nibble da parte alta e o nibble da parte baixa de f,
guardando o resultado em d.
XORWF
f,d
Lgica ou-exclusivo entre W e f, guardando o resultado em d (d=W XOR f).
Grupo 2: Operaes com literais
ADDLW
K
Soma k com W, guardando o resultado em W (W = W + k).
ANDLW
K
Lgica E entre k e W, guardando o resultado em W (W = W AND k).
IORLW
K
Lgica 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
Lgica ou-exclusivo entre k e W, guardando o resultado em W (W=W XOR k).
Grupo 3: Operaes 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 prxima linha se ele for 0 (zero).
BTFSS
f,b
Testa o bit b do registrador f, e pula a prxima linha se ele for 1 (um).
Grupo 4: Controles
CALL
Label
Chamada a uma subrotina no endereo Label.
CLRW
Limpa o acumulador (W = 0).
CLRWDT
Limpa o registrador WDT para evitar o reset (Watchdog timer = 0).
GOTO
Label
Desvia para o endereo Label.
NOP
Nenhuma operao, gasta um ciclo de mquina sem fazer nada.
RETFIE
Retorno de uma interrupo.
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.

30

Microcontrolador PIC16F87x

Explicao detalhada do conjunto de instrues do PIC.


1) ADDLW k
; Soma a constante k a W
Descrio: Soma a constante k ao valor memorizado no acumulador W e coloca o resultado no
acumulador.
Exemplo:
movlw 10
addlw
12
; aps 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

Descrio: Esta instruo soma o valor contido no acumulador W com o valor contido no
registrador endereado pelo parmetro 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
Descrio: 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 10101010B
andlw
11110000B
...
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.
Descrio: Esta instruo efetua o AND bit a bit entre o valor contido no acumulador W e o
valor contido no registrador endereado pelo parmetro f.
Exemplo: Freqentemente o AND ser utilizado para mascarar o valor de algum bit dentro de
um registrador. Se por exemplo quisssemos extrair do nmero binrio 01010101B os quatro
bits menos significativo a fim de obter o seguinte valor 00000101B, bastar preparar uma
mscara do tipo 00001111B e fazer o AND com o nosso valor, vejamos como:
movlw 01010101B ; Armazena em W o valor binrio
movwf 0CH
; Usa o endereo 0CH para armazenar o valor inicial da
mscara
movlw 00001111B ; Prepara a mscara do bit
andwf 0CH,W
; Efetua o AND e memoriza o resultado no acumulador W
O resultado em W ser 00000101B como descrito.

Microcontrolador PIC16F87x

31

W = 00001111 AND
f = 01010101 =
---------------W = 00000101
5) BCF f,b
; Zera o bit b do registrador F
Descrio: Esta instruo zera o bit b do registrador no endereo f .
Exemplo:
parm1
equ
0CH
movlw 11111111B ;Valor inicial
movwf parm1
bcf
parm1,0
Ao trmino do programa o registrador parm1 ser 11111110B.
6) BSF f,b
;Coloca em nvel alto o bit b no registrador F.
Descrio: Esta instruo coloca em um no bit b do registrador que est no endereo f.
Exemplo:
parm1 equ
0CH
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 prxima instruo se o bit b do registrador F for 0
Descrio: Testa o bit b contido no registrador no endereo f e pula a prxima instruo 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 prxima instruo.
goto
loop
;Se no, ficar no loop
Este programa executa um loop infinito. Entretanto, o mesmo programa no executar o
loop se substituirmos a instruo: movlw
11111110B
pela instruo: movlw
11111111B.
8) BTFSS f,b
; Pula a prxima instruo se o bit b do registrador F for 1
Descrio: Testa o bit b contido no registrador do endereo f e pula a instruo seguinte se este
for 1.

Exemplo:
parm1 equ

0CH

32

Microcontrolador PIC16F87x

org
00H
movlw 11111111B ;Valor inicial
movwf parm1
loop
btfss parm1,0 ;bit0 = 1 ? Se for, pular prxima instruo.
goto loop
;Se no, ficar no loop
Este programa executa um loop infinito. O mesmo programa no executar o loop se
substituirmos a instruo:
movlw 11111111B pela instruo: movlw 11111110B.
9) CALL k
; Chamada a uma subrotina
Descrio: Chama uma subrotina memorizada no endereo k. O parmetro k pode ser
especificado utilizando-se diretamente o valor numrico do endereo ou ento o relativo label.
Exemplo:
#define
LED1
1
org
00H
call
ledOn
; Chama a rotina ledOn
ledOn
btfsc PORTB,LED1
return

; testa o bit 1 da porta B

Quando a CPU do PIC encontra uma instruo CALL, memoriza no STACK o valor do
registrador PC+1 de modo a poder retornar para instruo aps o CALL, em seguida
escreve no PC o endereo da subrotina pulando a execuo desta ultima. O valor original
do PC ser recuperado pela subrotina com a execuo da instruo de retorno RETURN
ou RETLW.
No PIC16F628 esto disponveis 8 nveis de stack (pilha), ou seja a instruo CALL
dentro de uma subrotina pode ter no mximo 8 chamadas ou 8 nveis. As demais
chamadas sero sobrepostas s primeiras.
9) CLRF f
; Zera o registrador F
Descrio: Esta instruo zera o valor contido no registrador endereado pelo parmetro f.
Exemplo: Se quisermos zerar o registrador TMR0 no qual o endereo 01H hexadecimal, a
instruo a se executar ser:
clrf 01H
Ou, se no endereo do nosso cdigo incluirmos o arquivo P16F628.INC, poderemos utilizar
o nome simblico do registrador TMR0, ou seja, clrf TMR0.
11) CLRW
; Zera o registrador W
Descrio: Zera o valor contido no registrador W.
Exemplo:
clrw

12) CLRWDT
; Limpa o registrador WDT para no acontecer o Reset
Descrio: Esta instruo deve ser utilizada quando programarmos o PIC com a opo
Watchdog (fusvel WDTE). Nesta modalidade o PIC habilita um timer que, uma vez

Microcontrolador PIC16F87x

33

transcorrido um determinado tempo, efetua o reset do mesmo. Para evitar o reset do nosso
programa deveremos executar ciclicamente a instruo CLRWDT para zerar o timer antes deste
tempo. Se no zerarmos o WDT neste tempo, o circuito de watchdog (do ingls co de guarda)
interpretar este como um bloco de programa em execuo e efetuar o reset para bloquea-lo.
Exemplo:
org
00H
loop
clrwdt
goto loop
13) COMF f,d
; Efetua o complemento do registrador F
Descrio: Esta instruo efetua o complemento do valor contido no registrador
endereado pelo parmetro f.
Exemplo:
parm1 equ
0CH
org
00H
movlw 01010101B
movwf parm1
comf parm1,F
Ao trmino da execuo do programa o valor do registrador parm1 ser 10101010B.
14) DECF f,d
; Decrementa o contedo do registrador F
Descrio: Esta instruo decrementa o contedo do registrador endereado pelo parmetro 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 prxima instruo se o
resultado for zero.
Descrio: Decrementa o valor de registrador do endereo f e se o resultado for zero pula a
prxima instruo. Exemplo:
counter equ
0CH
org
00H
movlw 10
;counter = 10
movwf counter
loop
decfsz counter,F
;counter = counter 1, se counter = 0, pula prxima instruo
goto loop
;se no, continua no loop
Este programa executa 10 vezes a instruo decfsz at que counter seja = 0.

16) GOTO k
; Desvia a execuo do programa para o endereo especificado k.
Descrio: Determina o desvio incondicional do programa em execuo para o endereo k. O
parmetro k pode ser especificado utilizando-se diretamente um valor numrico do endereo ou
ento o relativo label.

Microcontrolador PIC16F87x

34

Exemplo:
org
00H
loop
goto loop
Este programa executa um cilclo (loop) infinito.
17) INCF f,d
; Incrementa o valor do registrador no endereo F.
Descrio: Incrementa o contedo do registrador no endereo 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 prxima instruo se o
resultado for zero.
Descrio: Incrementa o valor do registrador f e se o resultado for zero pula a prxima
instruo.
Exemplo:
counter
equ
0CH
org
00H
movlw 250
;counter = 250
movwf counter
loop
incfsz counter,F ;counter = counter + 1, se counter = 0 ? pular prxima instruo
goto loop
; se no, continuar no loop
Este programa executa para 256-10 = 6 vezes a instruo 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
Descrio: 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
Aps 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
Descrio: Esta instruo efetua o OR inclusive entre o valor contido no acumulador W e o
valor contido no registrador endereado pelo parmetro f.
Exemplo:
parm1 equ 0CH
org
00H
movlw 00001111B

Microcontrolador PIC16F87x

35

movwf parm1
movlw 11111111B
iorwf
parm1,F
Ao trmino do programa o valor do registrador parm1 ser 11111111B.
21) MOVLW k
; Copia para W o valor constante k
Descrio: Passa ao acumulador W um valor constante k.
Exemplo:
org
00H
movlw 20
Aps ter executado este programa o acumulador W ir a 20.
22) MOVF f,d
;Copia o contedo do registrador f para o destino d
Descrio: Esta instruo copia o contedo do registrador endereado pelo parmetro f para o
parmetro de destino d. Exemplo: O exemplo a seguir copia o valor contido no registrador do
endereo 0CH no acumulador W:
movf 0CH,W
23) MOVWF f
; Copia o contedo do registrador W para o registrador F
Descrio: Esta instruo copia o contedo do registrador W no registrador de parmetro f.
Exemplo: Para copia o valor 10H no registrador TMR0. A instruo 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 operao
Descrio: Esta instruo no executa nenhuma operao 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 interrupo
Descrio: Esta instruo deve ser colocada no trmino de cada subrotina de controle de
interrupes para retornar o controle ao programa principal.
Exemplo:
org 00H
loop
goto loop ;Loop infinito
org 04H ;Interrupt vector
intHandler
retfie
;Retorna da interrupo
Neste cdigo o programa principal executa um loop infinito. Se habilitarmos uma das
interrupes do 16F628 ele no apenas verificar o controle como ir automaticamente ao
programa alocado no endereo 04H (no exemplo intHandler), a instruo RETFIE
determinar ento o retorno ao loop principal.

Microcontrolador PIC16F87x

36

26) RETLW k
; Retorna de uma rotina com uma constante k em W
Descrio: Esta instruo retorna o controle de uma rotina ao programa principal. A diferena
desta em relao instruo RETURN que retflw permite retornar, atravs 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
Descrio: Esta instruo deve ser inserida no termino de cada subrotina para retornar a
execuo 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 contedo do registrador f passando pelo Carry
Descrio: Rotaciona o bit contido no registrador do endereo 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:

37

Microcontrolador PIC16F87x
BIT7

BIT6

BIT5

BIT4

BIT3

BIT2

BIT1

BIT0

CARRY

Figura 7 Rotao de bit a esquerda


O contedo 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 trmino do programa o registrador parm1 ser 10101010B enquanto o CARRY ser
0.
29) RRF f,b
; Rotaciona para a direita o contedo do registrador f passando
pelo Carry
Descrio: Rotaciona o bit contido no registrador do endereo 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 Rotao de bit a direita


O contedo 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 trmino do programa o registrador parm1 ser 00101010B enquanto o CARRY ser
1.
30) SLEEP ; Coloque o PIC (para dormir) em standby
Descrio: Esta instruo bloqueia a execuo do programa em andamento e coloca o PIC em
standby (sleep do ingls = dormir).
Exemplo:
org 00H
start

Microcontrolador PIC16F87x

38

sleep
31) SUBLW k
; Subtraia de k o valor em W
Descrio: 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.
Descrio: Esta instruo subtrai o valor contido no registrador W do valor contido no
registrador endereado pelo parmetro f.
Exemplo: Analisando um exemplo extrado do datasheet da Microchip:
Se inserirmos a instruo:
subwf REG1,F
Onde reg1 o endereo 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.
Descrio: Troca o valor dos quatro bits mais significativo (D7-D4) contido no registrador do
endereo f com os quatro bits menos significativo(D3-D0) do mesmo.
Exemplo:
movlw 11110000B
;Valor inicial
swapf
parm1,F
Ao trmino do programa o registrador parm1 ser 00001111B.
34) XORLW k
; Efetua o OR exclusivo entre W e uma constante k
Descrio: Efetua o OR exclusivo entre o valor contido no acumulador W e o valor constante k.
Exemplo:
org
00H
start
movlw 00000000B
xorlw 11110000B
...
Aps 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
Descrio: Esta instruo efetua o OR exclusivo(XOR) entre o valor contido no acumulador W
e o valor contido no registrador endereado pelo parmetro f.
Exemplo: Efetuar um XOR entre o registrador W e o registrador REG1 por ns definido no
endereo 0CH com a diretiva:

Microcontrolador PIC16F87x

39

REG1 EQU 0CH


podemos utilizar a instruo IORWF de duas formas, dependendo onde queremos colocar o
resultado, ou seja:
xorwf COUNTER,F ;COUNTER = COUNTER XOR W
ou ento:
xorwf COUNTER,W ;W = COUNTER XOR W

Microcontrolador PIC16F87x

40

Captulo VI - AS INTERRUPES DO PIC16F87X

A interrupo uma tcnica particular do PIC que permite interceptar eventos externos
ao programa em execuo, interrompe momentaneamente a operao do programa em
andamento, controla o evento com uma subrotina apropriada e retorna para a execuo do
programa.
Fazendo uma analogia, podemos dizer que a interrupo para o PIC o que para ns
representaria uma chamada telefnica. Para recebermos um telefonema no precisamos nos
preocupar em ficar levantando continuamente o monofone do gancho para ver se tem algum
querendo falar conosco, mas podemos tranqilamente aguardar pelo toque da campainha quando
algum nos chamar. Quando ento apenas levantamos o monofone do gancho e interrompemos
momentaneamente o sistema de chamada, respondemos ao telefonema e, uma vez terminada a
conversao, retornamos o monofone ao gancho, ou seja, do ponto onde havamos interrompido.

Transportando o termo deste pargrafo ao PIC veremos que:


O nosso telefone corresponde ao programa em execuo;
A chamada de algum corresponde ao evento de controle;
O monofone corresponde a requisio de interrupo;
A nossa reposta ao telefone corresponde a subrotina de controle da interrupo.

evidente que assim como extremamente mais eficaz se ter uma campainha conectada
ao telefone extremamente mais eficaz controlar nosso evento com uma interrupo ao invs de
diretamente pelo programa.
O PIC16F87x esta preparado para controlar interrupes ao final de 15 eventos
diferentes, vejamos quais so:

interrupo externa EM RB0;


interrupo por overflow do timer TMR0;
interrupo por overflow do timer TMR1;
interrupo por overflow do timer TMR2;
interrupo por mudana de nvel nos pinos da porta B (pinos RB7 a RB4);
interrupo por escrita completa na EEPROM;
interrupo da porta paralela (PSP);
interrupo dos conversores A/D;
interrupo de recepo da USART;
interrupo de transmisso da USART;
interrupo da comunicao serial (SPI e I2C);
interrupo do CCP1 (Capture/Compare/PWM);
interrupo do CCP2;
interrupo dos comparadores;
interrupo de coliso de dados (Bus Collision).

Microcontrolador PIC16F87x

41

Nesta apostila sero detalhadas as seguintes interrupes:


Interrupo de TIMER 0
Eessa interrupo 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, no dependendo de anlises 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 mquina, como tambm por um
sinal externo. Neste caso, ele passa a ser um contador de pulsos, podendo ser utilizado para
outras finalidades.
Interrupo externa (RB0/INT)
Essa interrupo gerada por um sinal externo ligado a uma porta especfica 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 comunicao entre micros, garantindo o sincronismo, o reconhecimento
de boto ou outro sinal do sistema que necessite de uma ao imediata. Essa interrupo
acontece ou na borda de subida ou na borda de descida conforme a configurao da mesma.
Interrupco por mudana de estado (RB4 a RB7)
Essa interrupo acontece em ambos os casos, na borda de subida ou na borda de
descida, basta haver mudana de estado. Esse tipo de interrupo 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.
Interrupo de fim de escrita na EEPROM
Essa interrupo serve para detectarmos o final de uma rotina de escrita na EEPROM do
PIC. A utilizao da interrupo no obrigatria para que a escrita funcione, mas como a
EEPROM lenta na hora de escrever, em alguns sistemas a sua utilizao pode ser necessria
para evitar uma parada durante a escrita na EEPROM.
A interrupo 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.

42

Microcontrolador PIC16F87x

Figura 9 Quatro interrupes do PIC16F87x


Registrador INTCON

GIE

EEIE

T0IE

INTE

RBIE

T0IF

INTF

RBIF

INTE (bit 4) se este bit estiver em 1 habilitar a interrupo de troca de estado sobre a
linha RB0

T0IE (bit 5) se este bit estiver em 1 habilitar a interrupo de final de contagem do


registrador TMR0

RBIE (bit 3) se este bit estiver em 1 habilitar a interrupo de troca de estado sobre uma
das linhas de RB4 a RB7

EEIE (bit 6) se este bit estiver em 1 habilitar a interrupo de final de escrita sobre um
endereo da EEPROM

GIE (bit 7) bit de habilitao geral de interrupo. Esse bit deve ser setado em 1 antes
dos demais.

Vetor de Interrupo e Controle de Interrupo (Interrupt vector e Interrupt handler),


qualquer que seja o evento habilitado, ao se manifestar, o PIC interrompe a execuo do
programa em andamento, memoriza automaticamente no STACK o valor corrente do
PROGRAM COUNTER (PC) e pula para a instruo presente no endereo de memria 0004H
denominada Interrupt vector (vetor de interrupo). Deste ponto em diante devemos colocar a
nossa subrotina de controle denominada Interrupt Handler (controle de interrupo). Pode-se
habilitar mais interrupes e, a primeira providncia da interrupt handler a de verificar qual o
evento habilitado que gerou a interrupo e a execuo da parte do programa relativo. Este
controle pode ser efetuado utilizando a Interrupt flag.
Interrupt flag (sinalizador de interrupo), dado que qualquer interrupo gera uma

Microcontrolador PIC16F87x

43

chamada do endereo 04H, no registrador INTCON est presente o flag que indica qual o evento
que gerou a interrupo vejamos:

INTF (bit 1), se for 1 porque a interrupo RB0/INT ocorreu.

T0IF (bit 2), se for 1 porque ocorreu uma interrupo de TMR0.

RBIF (bit 0), se for 1 porque ocorreu uma interrupo de troca de estado de uma das
linhas de RB4 a RB7.

Como se pode ver a interrupo de final de escrita na EEPROM no tem previsto


nenhum flag de sinalizao para que a interrupt handler deva considerar que a interrupo um
estado gerado deste evento quando todos os trs flags supra citados iro a 0.
Importante: Uma vez conhecido qual o flag que est ativo, a interrupt handler deve zerlo, ou ento no mais gerar interrupo correspondente.
Retorno de uma interrupt handler, quando for gerada uma interrupo o PIC
desabilitada automaticamente o bit GIE (global Interrupt Enable) do registrador INTCON de
modo a desabilitar todas as interrupes restantes. Para poder retornar ao programa principal e
reinicializar em 1 este bit deve-se utilizar a instruo: RETFIE

Microcontrolador PIC16F87x

44

Captulo VII - O CONTADOR/TEMPORIZADOR (TMR0)

O registrador TMR0 um contador, ou seja, um registrador particular, na qual, seu


contedo v-se incrementado com cadncia regular e programada ditada pelo hardware do PIC.
Na prtica, a diferena de um outro registrador, que o TMR0 no mantm inalterado o valor
que memorizado, mas o incrementa continuamente, se, por exemplo, escrevermos nele o valor
10 com a instruo:
movlw 10
movwf TMR0
Aps um tempo por quatro ciclos de mquina, o contedo do registrador comea a ser
incrementado de +1, ou seja, 11, 12, 13 e assim por diante com a cadncia constante e
independente da execuo do resto do programa.
Se por exemplo, aps ter colocado um valor no registrador TMR0, executarmos um loop
infinito
movlw
movwf

10
TMR0

loop
goto

loop

o registrador TMR0 ser incrementado pelo hardware interno do PIC durante a execuo do
loop. Uma vez atingido o valor 255 o registrador TMR0 ser zerado automaticamente
recomeando ento a contagem, mas no do valor originalmente imposto e sim do zero.
A freqncia diretamente proporcional a freqncia de clock aplicada ao chip e pode
ser modificada programando-se oportunamente os seus bits de configurao. 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

Microcontrolador PIC16F87x

45

O bloco Fosc/4 e T0CKI representados esquerda representam as duas possveis fontes


de sinal para o contador TMR0. Fosc/4 um sinal gerado internamente no PIC pelo circuito de
clock e igual a freqncia 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 16F87x.
O blocos T0CS e PSA so dois comutadores de sinal na qual esto 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 programvel e que seu funcionamento ser explicado
no prximo passo.
Vejamos na prtica como possvel 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 configurao 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 freqncia Fosc/4 igual a um quarto da freqncia
de clock. Utilizando-se um cristal de quartzo de 4Mhz teremos uma freqncia igual a 1 MHz.
Tal freqncia ser enviada diretamente ao registrador TMR0 sem nenhuma modificao. A
cadncia de contagem que se obtm ento igual a de 1 milho de incrementos por segundo do
valor presente no TMR0.
Imaginemos agora modificar o registrador de STATUS, o bit T0CS de 0 para 1 a
configurao que obteremos seguinte:

46

Microcontrolador PIC16F87x

Figura 12 - Percurso do sinal usando clock externo pelo pino T0CKI

Desta vez ser o sinal aplicado ao pino TOCKI do PIC a ser enviado diretamente ao
contador TMR0 determinando a freqncia de contagem. Aplicando-se por exemplo a este pino
uma freqncia par de 100Hz obteremos uma de contagem igual a cem incrementos por
segundo.
A presena da porta lgica XOR (exclusive OR) na entrada TOCKI do PIC permite
determinar o caminho do bit TOSE do registrador OPTION se o contador TMR0 deve ser
incrementado na descida do pulso (TOSE=1) ou na subida do pulso (TOSE=0) do sinal externo
aplicado.
Na figura seguinte est representada a correspondncia entre a cadncia do sinal externo
e o valor que assume o contador TMR0 :

Figura 13 - Cadncia do sinal externo

O ltimo bloco a ser analisado para poder utilizar complemente o registrador TMR0 o
PRESCALER. Se configurar-mos o bit PSA do registrador OPTION em 0 enviamos ao
registrador TMR0 o sinal de sada do PRESCALER como visvel na figura abaixo:

47

Microcontrolador PIC16F87x

Figura 14 - O PRESCALER como divisor

O PRESCALER consiste na prtica de um divisor programvel de 8 bits utilizado no


caso pela freqncia de contagem enviada ao contador TMR0 que demasiada alta para nossos
propsitos. No exemplo descrito na lio anterior haviamos visto que utilizando um cristal de
4Mhz era obtido uma freqncia de contagem igual a 1 Mhz que para muitas aplicaes poder
ser muito elevada. Com o uso do PRESCALER podemos dividir interiormente a freqncia
Fosc/4 configurando os bits PS0, PS1, PS2 do registrador OPTION segundo a tabela abaixo:

PS2

PS1

PS0

Divisor

Freqncia de sada do prescaler (Hz) p/ cristal de 4 MHz

500.000 = 4MHz/(4 * 2)

250.000 = 4MHz/(4 * 4)

125.000 = 4MHz/(4 * 8)

16

62.500 = 4MHz/(4 * 16)

32

31.250 = 4MHz/(4 * 32)

64

15.625 = 4MHz/(4 * 64)

128

7.813 = 4MHz/(4 * 128)

256

3.906 = 4MHz/(4 * 256)

Microcontrolador PIC16F87x

48

Captulo VIII MODO POWER DOWN, MODO SLEEP E O WDT

O modo Power Down/Sleep um estado particular de funcionamento do PIC utilizado


para reduzir o consumo de corrente no momento em que o PIC no utilizado. Se pegarmos
como exemplo um controle remoto para TV veremos que na maior parte do tempo o PIC
permanece aguardando que algum pressione uma tecla. Apenas quando pressionamos, o PIC
efetua uma breve transmisso e se coloca de novo a espera de um novo pressionar de tecla. O
tempo de utilizao efetivo da CPU do PIC ento limitado a poucos milisegundos necessrio
para efetuar a transmisso. Para evitar o consumo intil frente a limitada energia da bateria
possvel desligar boa parte do circuito de funcionamento do PIC e reativ-lo somente quando um
evento externo ocorrer.
Para entrar no modo Power Down, basta executar a instruo sleep, nesse modo, como o
prprio nome diz, o microcontrolador colocado para dormir e reduzir consequentemente a
corrente absorvida que passar de cerca de 2mA (a 5 volts com clock de 4Mhz) para cerca dos
2uA, ou seja 1000 vezes menos.
Quando entramos neste modo, o oscilador imediatamente paralisado, e com ele todo o
processamento. O estado das portas mantido, isto , aquelas que eram entradas continuam
como entradas, assim como o nvel lgico das portas que eram sadas. No entanto, como o
objetivo normalmente economizar energia, o estado das portas deve ser minuciosamente
checado e acertado antes de entrarmos neste modo. Configurar as portas para entrada, quando
possvel, resulta em maior economia de energia.
Para despertar o PIC do seu sono, podemos utilizar trs maneiras possveis:
1. Por meio de um reset externo, colocando em 0 o pino /MCLR (pino 4).
2. Por um estouro de WDT, no caso de ele estar habitado.
3. Por meio de um interrupo externa RB0/INT, ou por mudana de estado na porta B
(RB4, RB5, RB6 e RB7) ou no trmino da operao de escrita na EEPROM.
No primeiro caso, o PIC ser resetado e a execuo comear da posio 00h. No
segundo caso o programa continuar a ser executado na linha seguinte instruo SLEEP. E no
terceiro caso, o PIC se comporta como no atendimento de uma interrupo, o programa ir para
a rotina de interrupo e ento retornar para execuo aps a instruo SLEEP.
O WACHTDOG TIMER (WDT)
O Wachtdog Timer na prtica um contador automtico incrementado por meio de um
oscilador interno do PIC, mas complemente independente do resto do circuito. Com o prescaler
de 1:1, o seu tempo de estouro, ou seja, 256 incrementos, equivalente a 18 ms. O prescaler
utilizado para aumentarmos este tempo. Caso o WDT estoure, um reset do sistema ir ocorrer
imediatamente. Para evitar o reset automtico deve-se utilizar a instruo CLRWDT em algum
trecho do programa para zerar o prescaler e assim no permitindo o mesmo, terminar sua
contagem. Se a CPU no executa esta instruo antes de terminar a contagem ser entendido

49

Microcontrolador PIC16F87x

como um bloqueio de programa por motivo qualquer, e ser efetuado o reset da CPU.
O perodo mnimo para que a CPU seja resetada de cerca de 18ms (isso depender da
temperatura e da tenso de alimentao). Porem possvel programar o PRESCALER para
Wachtdog Timer para obter um tempo de retardo maior com cerca de 2 a 3 segundos.
Para configurar o Wachtdog Timer devemos habilitar na fase de programao o bit
WDTE do byte de configurao (no __CONFIG, incio do programa) .
Para ajustar o PRESCALER ao WDT, devemos agir sobre o bit PSA do registrador
OPTION_REG. O bit PSA dever setado em 1 com a instruo:
BSF OPTION_REG,PSA
Caso contrrio o prescaler estar ligado ao TIMER 0. Obviamente ajustando o prescaler
ao WTD no ser possvel ajust-lo para TIMER 0 e vice-versa.
Intervindo sobre o valor do bit PS0, PS1 e PS2 do mesmo registrador OPTION_REG
podemos obter diversos intervalos de retardo. A habilitao correta dever ser feita tendo em
conta o mximo retardo que podemos obter dentro do nosso programa entre a execuo de duas
instrues CLRWD sucessivas.
Na tabela seguinte est representada a correspondncia entre os valores destes bit's e
os intervalos que obteremos.

PS2

PS1

PS0

Divisor

Perodo de retardo do WDT

18ms

36ms

72ms

144ms

16

288ms

32

576ms

64

1.152s

128

2.304s

50

Microcontrolador PIC16F87x

Captulo IX - Escrita e Leitura na EEPROM do PIC16F87X

A memria EEPROM do PIC16F87x pode armazenar at 256 bytes de dados, endereos


de 00h a FFh. Os registradores de controle, de dado e de endereo da EEPROM para esse PIC
so os seguintes:

1. EECOM1: registrador de controle, veja definio dos bits no Captulo IV.


2. EECOM1: registrador no implementado fisicamente, ele usado exclusivamente em uma

escrita sequencial de dados na EEPROM.


3. EEDATA: registrador de dados.
4. EEADR: registrador de endereos.

Passos que devero ser seguidos para a leitura de dados na EEPROM:


1. Escrever o endereo no registrador EEADR;
2. Colocar em nvel alto o bit de controle RD (EECON1<0>);
3. O dado colocado na registrador EEDATA e est pronto para ser pego no prximo

ciclo de mquina. EEDATA segurar o valor at que uma outra leitura seja ativada ou
at que seja escrita em EEDATA um outro valor diferente.
Exemplo:
bcf

STATUS,RP0

; Vai para o banco 0

movf
movwf
bsf
bsf
bcf
movf

Endereco,W
EEADR
STATUS,RP0
EECON1,RD
STATUS,RP0
EEDATA,W

; W = Endereo onde vai ser armazenado o dado


; Escrita do endereo em EEADR
; Vai para o banco 1
; Habilita a leitura
; Vai para o banco 0
; Armazena o dado em W (W=EEDATA)

Passos que devero ser seguidos para a escrita de dados na EEPROM:


Escrever o endereo no registrador EEADR;
Escrever o dado no registrador EEDATA;
Programar sequncia de controle para habilitar a escrita;
Colocar em nvel alto o bit de controle WR (EECON1<1>) para iniciar a escrita.
Obs.: Tipicamente uma operao de escrita demora 10 ms.

1.
2.
3.
4.

Exemplo: bcf
movf
movwf
movf

STATUS,RP0 ; Vai para o banco 0


Endereo,W
; W = Endereo onde vai ser armazenado o dado
EEADR
; Escrita do endereo em EEADR
Dado,W
; W = Dado que ser armazenado na EEPROM

Microcontrolador PIC16F87x

51

movwf EEDATA
; Escrita do dado em EEDATA
bsf
STATUS,RP0 ; Vai para o banco 1
;programao da seqncia de controle
bsf
EECOM1,WREN
movlw 55h
; W = 55h
movwf EECON2
movlw 0Aah
; W = AAh
movwf EECON2
; Escrita do dado em EEDATA
; fim da programao da seqncia de controle
bsf
EECON1,WR ; Habilita a escrita
bcf
STATUS,RP0 ; Retorna ao banco 0
Obs.: Para economizar energia, recomenda-se colocar os bits 6 e 7 de EEADR (EEADR<7:6>)
desligados (clear). Com eles setados o consumo cerca de 400 A, j com eles clear o
consumo cerca de 150 A.

Microcontrolador PIC16F87x

52

BIBLIOGRAFIA

1. Souza, David Jos de, Desbravando o PIC, Baseado no Microcontrolador PIC16F628;


Editora rica, 2a edio, 2000.
2. PIC16/17 MICROCONTROLLER DATA BOOK, Microchip, 1996/1997.
3. Sites: www.microchip.com
4. http://www2.ele.ufes.br/~hans/pic/index.html,

Apndice A - INTRODUO AO MPLAB


O MPLAB um ambiente integrado para o estudo e desenvolvimento com a famlia PIC de
microcontroladores. Sua principal caracterstica a total integrao de seus mdulos com o ambiente
Windows, permitindo a fcil cpia de arquivos e trechos de arquivos de um aplicativo para outro. Neste
ambiente, alm da edio de cdigo-fonte, podemos tambm compilar programas e corrigir seus erros, caso
existam. Outra ferramenta importante a simulao do programa, que pode ser realizada passo-a-passo para
verificarmos se o trabalho tm erros de lgica.
A Figura 1 mostra a janela principal do MPLAB onde temos um menu principal, uma barra de
ferramentas com vrios cones e uma janela do gerenciador de projeto e janela de mensagens de sada.

Barra de Ferramentas

Menu Principal

Janela de mensagens de sada

Janela do
gerenciador

Figura 1 Tela principal do MPLAB

Para se escrever um programa no MPLAB, precisamos antes assimilar o conceito de projeto.

Microcontrolador PIC16F87x

54

O Projeto no MpLab

Entende-se por projeto um conjunto de arquivos e informaes que diz ao MPLAB


qual a situao de um certo trabalho em particular. Por exemplo, num certo projeto
designado EXEMPLO.MCP temos duas janelas abertas: a janela do gerenciador de projeto
e o cdigo-fonte exemplo.asm. Em outro projeto podemos ter outros arquivos sendo
simulados o que caracteriza outro projeto. Com o gerenciamento de projetos presente no
MPLAB no precisamos lembrar quais as janelas que cada projeto estava usando no
momento em que encerramos o trabalho, pois ao carregarmos o projeto desejado todas as
informaes relativas ao mesmo sero recuperadas.
Para a montagem de um projeto vamos supor que foi desenvolvido o programa para
controlar 8 leds dispostos no PORTB do PICF628 ou PIC16F87x. Gravamos este programa
na pasta PIC com o nome de SEQLEDS.ASM. A listagem deste programa para o
PIC16F628 encontra-se em anexo.

CRIAO DO PROJETO - PRIMEIRO PASSO

Uma vez que voc abriu o MPLAB a primeira coisa a se fazer criar um projeto ou
abrir um projeto criado anteriormente. O projeto que vamos criar ter o nome de
LED.MCP. importante ressaltar que o projeto e o cdigo-fonte SEQLEDS.ASM tm
que ser salvos na mesma pasta.
No menu principal, na opo Project o MPLAB possui o Project Wizard que nos
facilita o trabalho de criao do projeto. A Figura 2 mostra a janela inicial do Project
Wizard.

55

Microcontrolador PIC16F87x

Figura 2 Project Wizard

Click em avanar para executarmos a prxima etapa.

A seguir, precisamos definir com qual microcontrolador vamos trabalhar. Neste


exemplo ser selecionado o PIC16F628. A Figura 3 detalha este passo no MPLAB.

56

Microcontrolador PIC16F87x

Figura 3 Seleo do microcontrolador.

CRIAO DO PROJETO - SEGUNDO PASSO

Os programadores de micorcontrolador usam basicamente dois tipos de cdigo-fonte: ASSEMBLY


e LINGUAGEM C.
O cdigo Assembly, que utilizamos neste curso, usa mnemnicos para trabalhar cada operao
(instruo). As instrues atuam nos bits e bytes dos registradores internos do PIC.

J a linguagem C, tem prontos comandos que realizam, muitas vezes, mais de uma
instruo assembly.
A vantagem de usar Assembly que a arquitetura interna do microcontrolador
estudado fica muito clara, alm do desenvolvimento de programas menores e mais rpidos.

57

Microcontrolador PIC16F87x

A linguagem C traz a vantagem da rapidez no desenvolvimento dos programas.


A Figura 4 mostra a prxima janela do Project Wizard. Nesta etapa, selecionamos o
compilador que iremos trabalhar e verificamos o local onde o mesmo est gravado. Para
trabalharmos com a programao Assembly, selecionaremos a opo MPASM, como
mostra a figura. Em Active ToolSuite esto as outras opes de compiladores.

Figura 4 Escolha do compilador.

58

Microcontrolador PIC16F87x

CRIAO DO PROJETO - TERCEIRO PASSO


Nessa etapa, definiremos o nome do projeto e o local de gravao dos arquivos do
mesmo. O projeto e o codigo-fonte tm que ser salvos na mesma pasta. A Figura 5 mostra a
janela que controla esta etapa.
CRIAO DO PROJETO - QUARTO PASSO
Agora transferiremos o cdigo-fonte Assembly (ASM) para o projeto como
mostrado na Figura 6. O arquivo que vamos trabalhar o SEQLEDS.ASM.

Figura 5- Nome e local do proejto.

59

Microcontrolador PIC16F87x

Figura 6 Cdigo-fonte do projeto.

Na ltima janela, temos um resumo do projeto como mostra a Figura 7.

60

Microcontrolador PIC16F87x

Figura 7- Concluso da montagem do projeto.

Compilando o Projeto

Compilar transformar o cdigo-fonte em linguagem de mquina para o


microcontrolador poder executar. A ferramenta Assembler que realiza essa tarefa, mas
continuaremos a utilizar a palavras compilao e copilar para nos referir a isso.
Para compilarmos o cdigo-fonte SEQLEDS.ASM, presente no projeto LED.MCP,
basta irmos ao menu principal, selecionarmos a opo Project e depois Build All. Podemos
tambm pressionarmos simultaneamente as teclas <CTRL> e <F10>. Com uma dessas
aes, aparece na janela de mensagens do MPLAB informaes sobra a compilao
executada. Se algum erro foi detectado aparecer mensagem de erro. Clicando em cima da
mensagem o MPLAB leva ao erro no cdifo-fonte. Se nenhum erro foi detectado pelo
compilador aparecer a mensagem:

BUILD SUCCEEDED

61

Microcontrolador PIC16F87x

A Figura 8 mostra as janelas e mensagens do processo de compilao.

Figura 8 Processo de compilao.

Executando o programa passo-a-passo

Para podermos executar o programa passo-a-passo para eliminarmos os erros de


lgica que por ventura possam existir teremos que sair do modo de compilao para o
modo SIMULAO.
Para isso vamos clicar na opo Debugger (menu principal), depois Select Tools e
3-MPLAB SIM. A Figura 9 mostra estes passos em detalhes. Quando o modo de simulao
estiver escolhido vrias ferramentas novas aparecem na opo Debugger. Uma dessa

62

Microcontrolador PIC16F87x

opes Step InTo (execuo passo-a-passo). A tecla <F7> tambm realiza essa tarefa.
A Figura 10 mostra a como realizada a execuo passo-a-passo.

Figura 9 Seleo do modo Simulao.

63

Microcontrolador PIC16F87x

Figura 10 Execuo passo-a-passo.

Acompanhando o valor registradores

Podemos acompanhar o valor dos registradores que fazem parte da arquitetura


interna do PIC de duas formas:
1) Janela com todos os registradores: esta opo pode ser verificada na Figura 11.
2) Janela com registradores escolhidos pelo usurio: esta opo pode ser verificada
na Figura 12. A tecla ADD SFR faz a adio de registradores janela de
observao.

64

Microcontrolador PIC16F87x

Figura 11 Registradores de Funes Especiais.

Figura 12 Janela de observao de registradores.

Alterando valor de bit de entrada

Como sabemos os pinos que compem as portas de entrada/sada dos

65

Microcontrolador PIC16F87x

microcontroladores PIC podem ser configurados como entrada ou sada. Quando


configuramos algum pino como entrada e necessitamos simular o programa com essa
configurao, temos a necessidade de alterar, de maneira assncrona, o valor (nvel alto
para baixo ou vice-versa) desse pino.
A Figura 13 mostra como abrir o Modo de Estmulos do PIC. Basta clicar em
Debugger e depois Stimulus Controller.

Figura 13 Controle de Estmulos Externos.

Figura 14 Janela de Estmulos Externos.

66

Microcontrolador PIC16F87x

A Figura 14 mostra a janela que faz o controle dos estmulos externos. Para
acrescentar um pino que foi previamente configurado como entrada, basta clicar em Add
Row e configurar de acordo com a necessidade as colunas Pin e Action. A tecla Fire
habilita o estimulo externo.

Gravando um programa no microcontrolador

Inicialmente necessrio definir o programador e habilit-lo. necessrio que o


programador esteja conectado porta serial do PC com o microcontrolador instalado.
A Figura 15 mostra a opo Programmer PicStart Plus no menu principal de
MPLAB.

Figura 15 Definindo o programador.

Depois do passo anterior basta acionar a opo Program no mesmo caminho


apontado pela figura anterior.

Apndice B DETALHES DOS PORTs

Vamos ver agora explicaes mais detalhadas sobre as portas de entrada e sada e os
respectivos registradores de direo de dados: PORTA, PORTB, TRISA e TRISB.
Iniciaremos com o grupo RA0, RA1, RA2 e RA3 na qual representamos, na figura
seguinte, o esquema do estado de escrita extrado do data sheet da Microchip
(www.microchip.com):

Figura 3 - Diagrama de blocos dos pinos RA3:RA0

Como dito acima, a configurao de uma linha como entrada ou sada depende do estado
do bit no registrador TRIS (TRISA para o PORTA e TRISB para o PORTB).
Pegaremos como exemplo a linha RA0 e analisaremos o funcionamento do estado de
sada seja quando a mesma funciona como entrada ou como sada.
Funcionamento como entrada
Para configurar a linha RA0 como entrada, devemos colocar em 1 o bit 0 do registrador

Microcontrolador PIC16F87x

68

TRISA com a instruo:


bsf

TRISA,0

Esta instruo determinar uma comutao a 1 do estado lgico do flip-flop do D-latch


indicado no bloco com o nome TRIS latch. Para outra linha de I/O existe um destes flip-flop e o
estado lgico em que se trava depende estritamente do estado lgico do relativo bit no
registrador TRIS (ou melhor dizendo, todos os bit's do registrador TRIS fisicamente
implementado com um TRIS latch).
A sada Q do TRIS latch conectada a entrada de uma porta lgica do tipo OR. Isto
significa que, independente do valor presente a outra entrada, a sada da porta OR estar sempre
em 1 enquanto uma de suas entradas valer 1 (veja na tabela verdade). E nesta condio o
transistor P no conduz e mantm a linha RA0 desconectada do positivo da alimentao.
Do mesmo modo a sada negativa Q do TRIS latch conectada a entrada de uma porta
AND onde a sada desta estar sempre em 0 enquanto uma de suas entradas valer 0 (veja tabela
verdade). E nesta condio em que o transistor N no conduz mantendo a linha RA0
desconectada da massa. O estado lgico da linha RA0 depender exclusivamente do circuito
externo a que o conectarmos.
Aplicando 0 ou 5 volts ao pino RA0, ser possvel lermos o estado presente no circuito
externo a entrada do bloco representado por TTl input buffer e do latch de entrada.
Funcionamento como sada
Para configurar a linha de RA0 como sada, devemos colocar em 0 o bit 0 do registrador
TRISA com a instruo: bcf TRISA,0
Esta determina a comutao para 0 da sada Q do TRIS latch ( e para 1 a sada Q
negativa). E neste estado o valor da sada da porta OR e AND depende exclusivamente do estado
de sada do Q negativo do Data Latch. Como para o TRIS latch, em que o Data Latch depende
do estado de um bit em um registrador, particularmente do registrador PORTA. A sua sada
negativa ser enviada para entrada das duas portas lgicas OR e AND e que esto diretamente
sobre a base do transistor P e N.
Se colocarmos em 0 o bit 0 do registrador PORTA com a instruo:
PORTA,0

bcf

obtermos a conduo do transistor N e portanto ir a 0 a linha RA0. Se ao invs colocarmos em


1 o bit 0 com a instruo:
bsf

PORTA,0

obteremos a conduo do transistor P e portanto ir a +5 volts a linha RA0. Nesta condio ser
sempre possvel rever o valor enviado sobre a linha atravs do circuito de entrada.
Estado de sada da linha RA4
Analisaremos agora o funcionamento do estado de sada da linha RA4 que diferente de
todas as outras linhas de I/O enquanto compartilha o mesmo pino do PIC16c84 com o TOCKI o
qual iremos analisar no prximo passo.
Na figura seguinte est descrito o esquema de blocos do estado de sada extrado do data
sheet Microchip:

69

Microcontrolador PIC16F87x

Figura 4 - Diagrama de blocos do pino RA4


A lgica de comutao substancialmente idntica ao grupo das linha RA0 a 3 com
exceo da ausncia da porta OR e do transistor P, ou seja de todos os circuitos que permitem a
ligao ao positivo, da linha RA4. Isto significa em termos prticos, que quando a linha RA4
est programada em sada poder assumir um nvel que depender do circuito externo pois na
realidade no est conectada ao positivo e sim desconectada. Este tipo de circuito de sada
chama-se "coletor aberto" e til para aplicaes em que necessrio compartilhar uma mesma
ligao com mais pinos de sada ou que se tenha a necessidade de colocar em alta impedncia
uma linha de sada e podendo assim reprogram-la como linha de entrada.
Se quisermos tornar seguro que a linha RA4 v a 1 devemos conectar externamente um
resistor de pull-up, ou seja um resistor conectado ao positivo da alimentao.
Veremos em seguida a utilizao da linha indicada no esquema acima TMR0 clock input.
Estado de sada das linhas RB0, RB1, RB2 e RB3
Onde que para este grupo de linhas permanece substancialmente invariada a lgica de
comutao. Estas dispe de um circuito a mais, o weak pull-up ativvel quando a linha for
programada como entrada.
A entrada de fato, como explicado anteriormente, a linha vem completamente desligada
do PIC. O estado da linha depende ento exclusivamente do circuito externo. Se o circuito do
tipo de coletor aberto ou simplesmente constitudo de uma simples chave que, quando
pressionada, conecta a massa a linha de I\O, necessrio inserir um resistor de pull-up vinda do
positivo para tornar seguro quando a chave for solta o nvel voltar a uma condio lgica 1
estvel sobre a linha de entrada. O circuito de weak pull-up permite evitar o uso do resistor de
pull-up e possvel de ser ativado agindo sobre o bit RBPU do registrador OPTION.
Na figura seguinte esta representado o esquema de blocos do estado de sada extrado do

Microcontrolador PIC16F87x

70

data sheet da Microchip:

Figura 5 - Diagrama de blocos dos pinos RB3:RB0


Alm disso a linha RB0 sozinha, apresenta uma caracterstica muito particular. Esta,
quando for configurada como linha de entrada, pode gerar, em correspondncia a uma troca de
estado lgico, uma interrupt, ou seja uma interrupo imediata do programa em execuo e uma
chamada a uma subrotina especial denominada interrupt handler. Mas falaremos disso em
seguida.
Estado de sada das linhas RB4, RB5, RB6 e RB7
O circuito de comutao deste grupo de linhas idntico ao grupo RB0 a 3. Esta linha
dispe tambm de um circuito de weak pull-up. E mais, com respeito a linha RB0 - 3 tem a
vantagem de poder revelar variaes de estado sobre qualquer linha e gerar uma interrupo da
qual falaremos no captulo sobre interrupes.
Na figura seguinte est reproduzido o esquema de blocos do estado de sada extrado do
data sheet Microhip.

Microcontrolador PIC16F87x

Figura 6 - Diagrama de blocos dos pinos RB7:RB4

71

Microcontrolador PIC16F87x

72

Apndice C - KIT DIDTICO PARA PIC16F87x

O kit didtico apresentado tem a funo de ensinar programar o PIC atravs de


dispositivos lgicos como:

LED (diodo emissor de luz);

Teclado push-boton;

Teclado matricial (telefnico);

Display de 7 segmentos;

Display de Cristal Lquido;

Controle de rels;

Comunicao serial USART;

Conversor A/D;

PWM;

Projeto de frequencmetro.
Na figura dada abaixo mostra-se a interligao do PIC16F87x com esses dispositivos.

73

Microcontrolador PIC16F87x

TECLADO
MATRICIAL

L1

L2
L3

Vcc
L4
10K

C1

MCLR
1 MCLR

RB7 40

2 RA0

RB6 39

3 RA1

RB5 38

4 RA2

RB4 37

REL 1

5 RA3

RB3 36

REL 2

6 RA4

RB2

35

REL 3

7 RA5

RB1

34

8 RE0

RB0

33

ENT. AN. 1
ENT. AN. 2

ENTRADAS
ANALGICAS

ENT. AN. 3

9 RE1
10 RE2

PIC16F87X

C3

C2

PUSH-BOTON

INTERRUPO EXTERNA

32

VCC

31

GND

Buzzer

VCC

11

RD7 30

GND

12

RD6 29

13

RD5 28

14

RD4 27

15 RC0

RC7 26

16 RC1

RC6

17 RC2

RC5 24

18 RC3

RC4 23

RS

19 RD0

RD3 22

20 RD1

RD2 21

470
470

ULN2803

LEDS

4MHz

4511

470

RX
COM. SERIAL
TX
25

BCD/7SEG

DISPLAYs 7 SEG
RS

10K

V0
Vcc

E
R/W

B4
B0

B1

B2

B3

10

11

B5

12

3
2
1

DISPLAY DE CRISTAL LQUIDO - LCD

B6

13

B7

14

74

Microcontrolador PIC16F87x

Apndice D Display de Cristal Lquido - LCD

Adaptado de apostila dos Professores:

Ilton L. Barbacena
Claudio Afonso Fleury

1. INTRODUO
Os mdulos LCD so interfaces de sada muito til em sistemas microprocessados. Estes
mdulos podem ser grficos e a caracter. Os mdulos LCD grficos so encontrados com
resulues de 122x32, 128x64, 240x64 e 240x128 dots pixel, e geralmente esto disponveis
com 20 pinos para conexo. Os LCD comuns (tipo caracter) so especificados em nmero de
linhas por colunas e so encontrados nas configuraes previstas na Tabela 1.
Tabela 1 - Mdulos LCD disponveis
Nmero de
Colunas

Nmero de
Linhas

Quantidade de
pinos

14

12

14/15

16

14/16

16

14/16

16

14/16

20

14/16

20

14/16

20

14/16

24

14/16

24

14/16

40

16

40

16

75

Microcontrolador PIC16F87x

Os mdulos podem ser encontrados com LED backlight (com uma iluminao de fundo)
para facilitar as leituras durante a noite. Neste caso, a alimentao deste led faz-se normalmente
pelos pinos 15 e 16 para os mdulos comuns e 19 e 20 para os mdulos grficos, sendo os pinos
15 e 19 para ligao ao anodo e os pinos 16 e 20 para o catodo. A corrente de alimentao deste
led varia de 100 a 200mA, dependendo do modelo.
Estes mdulos utilizam um controlador prprio, permitindo sua interligao com com
outras placas atravs de seus pinos, onde deve ser alimentado o mdulo e interligado o
barramento de dados e controle do mdulo com a placa do usurio. Naturalmente que alm de
alimentar e conectar os pinos do mdulo com a placa do usurio dever haver um protocolo de
comunicao entre as partes, que envolve o envio de bytes de instrues e bytes de dados pelo
sistema do usurio.
A Tabela 2 descreve cada pino do mdulo ou do display para conexo deste a outras
placas:
Tabela 2 - Pinagem dos Mdulos LCD

Pino

Funo

Descrio

Alimentao

Terra ou GND

Alimentao

VCC ou +5V

V0

Tenso para ajuste de contraste (ver Figura 1)

RS

R/W Seleo:

1 - Leitura, 0 - Escrita

1 ou (1 0) - Habilita, 0 - Desabilitado

B0

B1

B2

Barramento

10

B3

de

11

B4

Dados

12

B5

13

B6

14

B7

15

A (qdo existir)

Anodo p/ LED backlight

16

K (qdo existir)

Catodo p/ LED backlight

Seleo:

Chip select

1 - Dado, 0 - Instruo

LSB

MSB

Microcontrolador PIC16F87x

76

Assim como em um rdio-relgio todo mdulo LCD permite um ajuste na intensidade da


luz emitida ou ajuste de contraste, isto possvel variando-se a tenso no pino 3. A Figura 1
mostra um circuito tpico e recomendado pela maioria dos fabricantes para efetuar este ajuste.
Alguns fabricantes recomenda o uso de um resistor de 4K7 em srie com o potencimetro de
10K.

Figura 1 - Detalhe do controle de contraste do mdulo LCD

2. PROGRAMAO / INSTRUES
A Tabela 3 traz um resumo das instrues mais usadas na comunicao com os
mdulos LCD.

77

Microcontrolador PIC16F87x

Tabela 3 - Instrues mais comuns


DESCRIO

MODO

RS

R/W

Cdigo
(Hexa)

Display

Liga (sem cursor)

0C

Desliga

0A / 08

01

Liga

0E

Desliga

0C

Desloca para Esquerda

10

Desloca para Direita

14

Cursor Home

02

Cursor Piscante

0D

Cursor com Alternncia

0F

Sentido de deslocamento do

Para a esquerda

04

cursor ao entrar com caracter

Para a direita

06

Deslocamento da mensagem

Para a esquerda

07

ao entrar com caracter

Para a direita

05

Deslocamento da mensagem

Para a esquerda

18

sem entrada de caracter

Para a direita

1C

End. da primeira posio

primeira linha

80

segunda linha

C0

Limpa Display com


Home cursor
Controle do Cursor

78

Microcontrolador PIC16F87x

2.1- DESCRIO DETALHADA DAS INSTRUES


2.1.1

Limpa Display

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Esta instruo escreve o caracter ASCII 32 que corresponde ao branco ou barra de espao
em todos os endereos da DDRAM apagando a mensagem que estiver escrita. O cursor
retorna ao endereo zero, ou seja, posio mais a esquerda da primeira linha.

2.1.2 - Cursor Home

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Faz retornar o cursor para a posio mais a esquerda da primeira linha e faz voltar
posio original mensagens previamente deslocadas. O contedo da DDRAM permanece
inalterado.

2.1.3 - Fixa o modo de operao

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Esta instruo tem efeito somente durante a leitura ou escrita de dados, portanto, deve ser
ativada na inicializao.
-Estabelece o sentido de deslocamento do cursor (X=0 p/ esquerda, X=1 p/
direita)

79

Microcontrolador PIC16F87x

-Estabelece se a mensagem deve ou no ser deslocada com a entrada de um novo


caracter
S=1 SIM, S=0 NO. Exemplo: X=1 e S=1 => mensagem desloca p/ direita.

2.1.4 - Controle do Display

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

A mensagem fica aparente quando D=1 e desaparece quando D=0, porm o contedo da
DDRAM fica inalterado. O cursor fica aparente quando C=1 e desaparece quando C=0,
porm as propriedades de escritas vigentes permanecem inalteradas. O cursor quando
aparente liga a ltima linha que compem o caracter, exceto quando B=1, que apresenta
em alternncia com uma matriz com todos os pontos negros em intervalos de 0,4
segundos. Quando B=1 e C=0, obteremos a ativao intermitente de uma matriz
completa (todos os pontos da matriz).
2.1.5 - Deslocamento do Cursor ou da Mensagem

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Desloca o cursor ou a mensagem sem que para isso tenha que escrever ou ler dados do
display. Utilizado para posicionamento dos dados no display.

FUNO

Desloca o cursor para a esquerda e decrementa o contador de endereo.

Desloca o cursor para a direita e incrementa o contador de endereo.

Desloca a mensagem e o cursor para a esquerda.

Desloca a mensagem e o cursor para a direita

2.1.6 - Estabelece o modo de utilizao do Mdulo LCD

80

Microcontrolador PIC16F87x

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Y estabelece o modo de comunicao. Se Y=1 estabelece 8 bits e quando Y=0 ser 4 bits,
enviados em duas operaes, com os 4 bits (Nible) mais significativos sendo enviados
primeiro. N fixa o nmero de linhas: N=0 para uma linha e N=1 para duas ou mais
linhas. F fixa o tipo da matriz: F=0 para matriz 7x5 ou 8x5 e F=1 para matriz 10x5
(somente possvel quando apresentando em uma linha).

2.1.7 - Endereamento da CGRAM

CGRAM uma regio da memria RAM destinada para criao de caracteres especiais,
como por exemplo: , , , etc.

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Estabelece o endereo da CGRAM no contador de endereos (AC) como um nmero


binrio AAAAAA e aps isto os dados sero escritos ou lidos pela CPU neste endereo.
Cada caracter especial ocupa 8 endereos na CGRAM.
2.1.8 - Endereamento da DDRAM

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Estabelece o endereo da DDRAM no contador de endereos (AC) como um nmero


binrio AAAAAAA e aps isto os dados sero escritos ou lidos pela CPU neste
endereo. Para os display de uma linha AAAAAAA varia de 80H a CFH. J para todos
os display de duas linhas varia de 80H a A7H para a primeira linha e de C0H a E7H para

81

Microcontrolador PIC16F87x

a segunda linha.

2.1.9 - Busy Flag (BF)

RS
CDIGO

R/W
1

B7

B6

B5

B4

B3

B2

B1

B0

BF

MSB

LSB

Busy Flag ou o bit 7 indica ao sistema onde est conectado o mdulo LCD, se o
controlador do mdulo est ocupado com alguma operao interna (BF=1), e neste caso,
no aceita nenhuma instruo at que BF volte para 0.
Alm disso, permite a leitura do contedo do contador de endereos (AC) expressa por
AAAAAAA. O contador de endereos pode conter tanto endereo da CGRAM como da
DDRAM, depende neste caso, da instruo anterior.

2.1.10 - Escrita de dados na DDRAM ou CGRAM

RS
CDIGO

R/W
0

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Escreve o byte AAAAAAAA tanto na CGRAM como na DDRAM, dependendo da


instruo anterior (que define o endereo). Aps a escrita, o endereo automaticamente
incrementado ou decrementado de uma unidade dependendo do modo escolhido (ver
item 3.1.3).

2.1.11 - Leitura de dados na DDRAM ou CGRAM

82

Microcontrolador PIC16F87x

RS
CDIGO

R/W
1

B7

B6

B5

B4

B3

B2

B1

B0

MSB

LSB

Faz uma leitura na CGRAM ou na DDRAM, dependendo da instruo anterior (que


define o endereo). importante que precedendo a esta leitura seja executado a instruo
de estabelecimento do endereo da CGRAM ou DDRAM, pois caso contrrio o dado lido
invlido.

2.3- INICIALIZAO DOS MDULOS LCD

Toda vez que alimentamos o mdulo LCD deve ser executado o procedimento de
inicializao, que consiste no envio de uma seqncia de instrues para configurar o modo de
operao para execuo de um dado programa de interfaceamento. Em muitos display este
procedimento ocorre automaticamente, dentro de condies especficas que envolve
temporizaes mnimas referente a transio do nvel lgico 0 para 1, ao ligarmos a fonte. Em
caso de dvidas, recomendamos o envio destas instrues aps o reset do sistema.

2.3.1- Inicializao para sistemas 8 bits de dados (5 instrues)

Entre as duas primeiras instrues recomendamos um delay de 15 mS. As demais


instrues podem ser escritas aps checar o Busy Flag.

Instrues em Hexadecimal (8 bits)


MDULO LCD

1 linha - Matriz 7x5 e 8x5

30

15mS

30

15mS

06

BF

0E

BF

01

1 linha - Matriz 10x5

34

15mS

34

15mS

06

BF

0E

BF

01

2 linha - Matriz 7x5 e 8x5

38

15mS

38

15mS

06

BF

0E

BF

01

2.3.2 - Inicializao para sistemas 4 bits de dados (5 instrues)

83

Microcontrolador PIC16F87x

Entre as quatro primeiras instrues recomendamos um delay de 15 mS. As demais


instrues podem ser escritas aps checar o Busy Flag. Estes bits (nible) devem estar
conectados aos pinos 11, 12.13 e 14.

Instrues em Hexadecimal (4 bits)


MDULO LCD

10

11

12

1 linha - Matriz 7x5 e 8x5

1 linha - Matriz 10x5

2 linha - Matriz 7x5 e 8x5

3. ROTEIRO PARA PROGRAMAO


A seguir passaremos a descrever um resumo dos procedimentos para utilizao de um
mdulo ou display LCD:

1. Ao energizar o mdulo ajuste o potencimetro de controle do brilho ou contraste at obter a


visualizao da matriciao na primeira linha para mdulo de duas linhas ou at a matriciao
de meia linha para mdulos de uma linha.
2. Alguns mdulos de uma linha s funcionam com a instruo 38 ao invs de 30, conforme
instrues de inicializao.
3. O sinal de Enable (pino 6) dever ser gerado conforme a temporizao mostrada na Figura 2.
Os cdigos de dados ou de instrues s sero processados pelo processador do mdulo aps
a descida do sinal do Enable.
4. Para ajustar a velocidade de comunicao entre a CPU do usurio e o mdulo LCD existem
duas possibilidades:
Intercalar uma rotina de atraso de aproximadamente 15 mS entre as instrues.
Fazer a leitura do Busy Flag antes do envio de cada instruo e s enviar quando o
mesmo for 0. Neste caso, a nica exceo ser durante a inicializao.
5. Durante a inicializao enviar a seqncia correta das instrues de inicializao conforme
item 3.4
6. Para programar caracteres na CGRAM, faa inicialmente o endereamento da mesma.

Microcontrolador PIC16F87x

84

7. Aps a escrita de dados na CGRAM envie a instruo 01, para posicionar o cursor.
8. Para escrever os caracteres especiais previamente gravados na CGRAM, utilize os cdigos de
00 at 07 correspondente aos endereos bases de 40, 48 at 78 em hexa.
9. Comandos teis:

FIXAO DAS CONDIES DE UTILIZAO

Instruo

1 linha 5x7 (8 bits)

30H

2 linha 5x7 (8 bits)

38H

1 linha 5x10 (8 bits)

34H

1 linha 5x7 (4 bits)

20H

2 linha 5x7 (4 bits)

28H

1 linha 5x10 (4 bits)

24H

CONTROLE DISPLAY

Instruo

Display aceso c/ cursor fixo

0EH

Display aceso c/ cursor intermitente

0FH

Display aceso sem cursor

0CH

Display apagado

08H

MODO DE OPERAO

Instruo

Escreve deslocando a mensagem para esquerda (cursor fixo)

07H

Escreve deslocando a mensagem para a direita (cursor fixo)

05H

Escreve deslocando o cursor para a direita

06H

Microcontrolador PIC16F87x

Escreve deslocando o cursor para a esquerda

OUTROS COMANDOS TEIS

85
04H

Instruo

Limpa display e retorna o cursor para o inicio

01H

Retorna o cursor para o inicio (sem alterar a DDRAM)

02H

Desloca somente o cursor para a direita

14H

Desloca somente o cursor para a esquerda

10H

Desloca o cursor + mensagem para a direita

1CH

Desloca o cursor + mensagem para a esquerda

18H

Desloca o cursor para posio inicial da segunda linha

C0H

Desloca o cursor para posio inicial da primeira linha

80H

CGRAM (caracteres especiais)

Instruo

Endereo inicial para construir caracteres especiais

40H

Para escrever o primeiro caracter (previamente construdos)

00H

Para escrever o ltimo caracter (previamente construdos)

07H

Obs:
Aps o endereamento da CGRAM, o cursor se desloca para a primeira posio
da segunda linha (ou metade), portanto recomendado enviar a instruo 01 ou
limpa display e cursor home.

Microcontrolador PIC16F87x

86

4. CUIDADOS ESPECIAIS COM MDULOS LCD


4.1- MANUSEIO
Somente retire o mdulo de sua embalagem protetora imediatamente antes de sua
instalao
No guarde os mdulos em recintos de alta temperatura e alta umidade. A temperatura
de armazenamento dever estar compreendida entre 5 e 30 oC.
O LCD coberto por uma lmina plstica polarizada a qual no pode ser riscada.
Cuidado em seu manuseio. Para a limpeza da lmina utilize cotonetes embebido em
benzina. No utilize outros tipos de solventes.
Observe cuidadosamente os procedimentos de controle anti-esttico quando manusear
os mdulos. Eles incorporam circuitos integrados CMOS LSI os quais so sensveis
descarga eletrosttica. No toque nos terminais do conector, trilhas do circuito
impresso e/ou terminais do CI.

4.2- INSTALAO

Nunca desmonte o mdulo


Use uma estao de solda aterrada para soldagem de conectores ou terminais.
montador dever tambm ser convenientemente aterrado.
Sempre que o projeto o permita, instale o mdulo atrs de uma janela protetora de
plstico ou vidro.
Somente retire a fita adesiva que protege a lmina plstica frontal imediatamente antes
de seu uso.

4.3 - OPERAO
Nunca instale ou desconecte o mdulo com sua alimentao ligada.
Sempre opere os mdulos respeitando sua gama de temperatura de operao.
Observe cuidadosamente os valores das tenses de alimentao e os nveis dos sinais
de controle.
Ajuste a tenso no pino 3 (V0) para obter o contraste mais conveniente para uma dada
aplicao.

Você também pode gostar