Buscar

Microcontrolador PIC16F877A

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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

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

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Professor Sérgio Minas Melconian. 
 1 
 
 
MICROCONTROLADOR 
PIC16F877A 
 
 
 
 
 
FUNDAMENTOS 
E 
PROGRAMAÇÃO BÁSICA 
 
 
 
 
Professor Sérgio Minas Melconian. 
 2 
 
Introdução 
 
 
 PIC – PROGRAMMABLE INTERRUPT CONTROLLER (CONTROLADOR DE INTERRUPÇÃO 
PROGRAMÁVEL) é um componente eletrônico programável produzido pela Microchip Technology Inc, utilizado 
no controle de processos e atividades lógicas. 
 Os microcontroladores são compostos de uma única pastilha de silício encapsulada, popularmente chamada de CI 
(Circuito Integrado) e todos os elementos necessários para o controle das atividades estão internamente ligados a 
pastilha de silício. Aliás, essa é a característica principal que diferencia os microcontroladores dos 
microprocessadores. 
 O PIC16F877A está enquadrado na família 8 bits de microcontroladores Microchip, possui via de programação 
com 14 bits e um conjunto de 35 instruções. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 3 
 
Arquiteturas dos Microcontroladores 
 
 
 Os microcontroladores apresentam uma estrutura interna de máquina na qual irá determinar a maneira como os 
dados e o programa serão processados. 
 As arquiteturas mais utilizadas para sistemas computacionais digitais são: 
 
 Arquitetura Von Neumann: A Unidade Central de Processamento (CPU) está conectada a memória de dados e 
programa por um único barramento (bus) de 8 bits. 
 Arquitetura Harvard: A Unidade Central de Processamento (CPU) está conectada a memória de dados e 
memória de programa por barramento (bus) distintos. Sendo o barramento de dados composto por 8 bits e o 
barramento de programa formado por 14 bits (caso da família 16F). 
 
 
 
 
 
 
 
 
 
 
Arquitetura Harvard x Von Neumann 
 
 Os microcontroladores PIC utilizam como estrutura interna de máquina a arquitetura Harvard, a qual possibilita 
uma velocidade de processamento mais rápida, pois em quanto uma instrução está sendo executada, outra já está 
sendo buscada na memória. Além do mais, o fato do barramento de instruções ser maior do que 8 bits, o OPCODE 
(referência à instrução que um determinado processador possui para conseguir realizar determinadas tarefas) inclui 
o dado e o local onde ele vai operar, o que indica que apenas uma posição de memória será utilizada por instrução, 
levando a uma economia de memória de programa. 
 
Filosofias RISC E CISC 
 
 
 O fato do PIC trabalhar com a arquitetura Harvard, possibilita utilizar uma tecnologia chamada RISC (Reduced 
Instruction Set Computer) – Computador com Set de Instruções Reduzido. Ou seja, pode-se trabalhar com uma 
lista de códigos de instruções de programação de cerca de 35 instruções (esse número varia um pouco de modelo 
para modelo). 
 Já se fossemos utilizar a tecnologia CISC (Complex Instruction Set Computer) – Computador com Set de 
Instruções Complexo, seriam necessários se conhecer cerca de 100 instruções de programação. Tornando o 
aprendizado mais árduo, porém algumas funções na tecnologia CISC se tornam mais fáceis, pois já existem, logo 
para o programador que utiliza o set reduzido, há uma maior cobrança das suas habilidade. 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 4 
 
O PIC16F877A 
 
 
• Microcontrolador de 40 pinos; 
 
• Memória de programa 14 bits com 8k words, capacidade de escrita e leitura pelo próprio código interno; 
 
• Arquitetura Harvard e tecnologia RISC com 35 instruções; 
 
• 33 portas configuráveis como entrada e saída; 
 
• 15 interrupções disponíveis; 
 
• Memória de programação E2PROM FLASH permite a gravação do programa diversas vezes por meio de 
pulsos elétricos no mesmo CI, não é necessário apagá-lo por meio de luz ultravioleta; 
 
• Memória E2PROM (não-volátil) interna com 256 Bytes; 
 
• Memória RAM com 368 Bytes; 
 
• 3 TIMERs (dois de 8 bits e um de 16 bits); 
 
• Comunicação serial padrão RS232: SPI, I2C e USART; 
 
• Conversores A/D 10 bits (8x) e Comparadores analógicos (2x); 
 
• Dois módulos CCP: Capture, Compare e PWM; 
 
• Programação in-circuit (alta e baixa tensão); 
 
• Power-on Reset (POR) interno – Ao ligar o microcontrolador, ele garante funcionamento correto do PIC; 
 
• Brown-out Reset (BOR) interno – Ele “Reseta” o PIC sempre que a tensão de alimentação for menor que 
4V; 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 5 
 
Pinagem – Encapsulamento PDIP - 40 Pinos 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 6 
 
Nomenclatura dos pinos 
 
Nome do Pino Nº Caracte
rística 
Tipo Descrição 
OSC1 / CLKIN 13 I ST/CMOS4 ENTRADA PARA OSCILADORES EXTERNOS. 
OSC2 / CLKOUT 14 O - SAÍDA P/ CRISTAL. 
MCLR / VPP 1 I/P ST MASTER CLEAR (RESET) EXTERNO. SÓ FUNCIONA COM O PINO 
EM NÍVEL LÓGICO “1”. 
ENTRADA PARA TENSÃO DE PROGRAMAÇÃO EM 13V. 
VSS 12/31 P - GND (TERRA). 
VDD 11/32 P - ALIMENTAÇÃO POSITIVA. 
RA0 / AN0 2 I/O TTL I/O DIGITAL OU ANALÓGICO. 
RA1 / AN1 3 I/O TTL I/O DIGITAL OU ANALÓGICO. 
RA2 / AN2 / VREF- / 
CVREF 
4 I/O TTL I/O DIGITAL OU ANALÓGICO OU TENSÃO NEGATIVA DE 
REFERÊNCIA ANALÓGICA. 
RA3 / AN3 / VREF+ 5 I/O TTL I/O DIGITAL OU ANALÓGICO OU TENSÃO POSITIVA DE 
REFERÊNCIA ANALÓGICA. 
RA4 / T0CKI / C1OUT 6 I/O ST I/O DIGITAL (OPEN DRAYN, NÃO CONSEGUE GERAR NÍVEL 
LÓGICO ALTO) OU ENTRADA EXTERNA DO CONTADOR TMR0 
OU SAÍDA DO COMPARADOR 1. 
RA5 / SS / AN4 / 
C2OUT 
7 I/O TTL I/O DIGITAL OU ENTRADA ANALÓGICA OU HABILITAÇÃO 
EXTERNA PARA COMUNICAÇÃO SPI OU SAÍDA DO 
COMPARADOR 2. 
RB0 / INT 33 I/O TTL/ST1 I/O DIGITAL COM INTERRUPÇÃO EXTERNA. 
RB1 34 I/O TTL I/O DIGITAL. 
RB2 35 I/O TTL I/O DIGITAL. 
RB3 / PGM 36 I/O TTL I/O DIGITAL OU ENTRADA PARA PROGRAMAÇÃO EM 5V. 
RB4 37 I/O TTL I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO. 
RB5 38 I/O TTL I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO. 
RB6 / PGC 39 I/O TTL/ST2 I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO 
OU CLOCK DA PROGRAMAÇÃO SERIAL OU PINO DE IN-CIRCUIT 
DEBUGGER. 
RB7 / PGD 40 I/O TTL/ST2 I/O DIGITAL COM INTERRUPÇÃO POR MUDANÇA DE ESTADO 
OU DATA DA PROGRAMAÇÃO SERIAL OU PINO DE IN-CIRCUIT 
DEBUGGER 
RC0 / T1OSO / T1CKI 15 I/O ST I/O DIGITAL OU SAÍDA DO OSCILADOR EXTERNO PARA TMR1 
OU ENTRADA DE INCREMENTO PARA TMR1. 
RC1 / T1OSI / CCP2 16 I/O ST I/O DIGITAL OU ENTRADA DO OSCILADOR EXTERNO PARA 
TMR1 OU ENTRADA DO CAPTURE2 OU SAÍDAS PARA 
COMPARE2/PWM2. 
RC2 / CCP1 17 I/O ST I/O DIGITAL OU ENTRADA DO CAPTURE1 OU SAÍDAS PARA 
COMPARE1/PWM1. 
RC3 / SCK / SCL 18 I/O ST I/O DIGITAL OU ENTRADA/SAÍDA DE CLOCK PARA 
COMUNICAÇÃO SERIAL SPI / I2C. 
RC4 / SDI / SDA 23 I/O ST I/O DIGITAL OU ENTRADA DE DADOS PARA SPI OU VIA DE 
DADOS (I/O) PARA I2C. 
RC5 / SDO 24 I/O ST I/O DIGITAL OU SAÍDA DE DADOS PARA SPI. 
RC6 / TX / CK 25 I/O ST I/O DIGITAL OU TX (TRANSMISSÃO) PARA COMUNICAÇÃO 
USART ASSÍNCRONA OU CLOCK PARA COMUNICAÇÃO 
SÍNCRONA. 
RC7 / RX / DT 26 I/O ST I/O DIGITAL OU RX (RECEPÇÃO) PARA COMUNICAÇÃO USART 
ASSÍNCRONA OU DATA PARA COMUNICAÇÃO SÍNCRONA. 
RD0 / PSP0 19 I/O TTL/ST3 I/O DIGITAL OU DADO 0 (COMUNICAÇÃO PARALELA). 
RD1 / PSP1 20 I/O TTL/ST3 I/O DIGITAL OU DADO 1 (COMUNICAÇÃO PARALELA). 
RD2 / PSP2 21 I/O TTL/ST3 I/O DIGITAL OU DADO 2 (COMUNICAÇÃO PARALELA). 
RD3 / PSP3 22 I/O TTL/ST3 I/O DIGITAL OU DADO 3 (COMUNICAÇÃO PARALELA). 
Professor Sérgio Minas Melconian. 
 7 
RD4 / PSP427 I/O TTL/ST3 I/O DIGITAL OU DADO 4 (COMUNICAÇÃO PARALELA). 
RD5 / PSP5 28 I/O TTL/ST3 I/O DIGITAL OU DADO 5 (COMUNICAÇÃO PARALELA). 
RD6 / PSP6 29 I/O TTL/ST3 I/O DIGITAL OU DADO 6 (COMUNICAÇÃO PARALELA). 
RD7 / PSP7 30 I/O TTL/ST3 I/O DIGITAL OU DADO 7 (COMUNICAÇÃO PARALELA). 
RE0 / RD / AN5 8 I/O TTL/ST3 I/O DIGITAL OU CONTROLE DE LEITURA DA PORTA PARALELA 
OU ENTRADA ANALÓGICA. 
RE1 / WR / AN6 9 I/O TTL/ST3 I/O DIGITAL OU CONTROLE DE ESCRITA DA PORTA PARALELA 
OU ENTRADA ANALÓGICA. 
RE2 / CS / AN7 10 I/O TTL/ST3 I/O DIGITAL OU CONTROLE DE ESCRITA DA PORTA PARALELA 
OU ENTRADA ANALÓGICA. 
 
Legenda: 
 
I => Input (Entrada); 
O => Output (Saída); 
I/O => Input/Output (Entrada ou Saída); 
P => Power (Alimentação); 
- => Não utilizado; 
TTL => Pino tipo TTL; 
ST => Pino tipo Schmitt Trigger; 
 
Notas: 
 
1
 Entrada tipo ST, quando configurado como interrupção externa. 
2
 Entrada tipo ST, durante o modo do programação serial. 
3
 Entrada tipo ST, quando configurado como I/O de uso geral e TTL quando usado em modo de porta paralela. 
4
 Entrada tipo ST, quando em modo RC e CMOS no geral. 
 
 
Observação quanto TTL e Schmitt Trigger (ST) 
 
 
 As portas do PIC podem ser do tipo TTL ou ST, isso é um dado muito importante no momento de se utilizá-las, 
pois há interferência direta nos níveis de tensão (0 ou 1) interpretados pelo microcontrolador. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(1), (2) Região incerta, mantém nível anterior (0 ou 1). 
 
 
 
 
Professor Sérgio Minas Melconian. 
 8 
 
Estrutura Interna do PIC16F877A 
 
 O diagrama de blocos (original Microchip) indicado a baixo mostra as diversas partes que compõem o 
microcontrolador. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 9 
 
Ciclo de Máquina 
 
 Todo microcontrolador possui um sinal de clock para poder trabalhar. No caso dos microcontroladores PIC o sinal 
de clock é internamente dividido por 4. Assim sendo se utilizarmos um oscilador externo que gere um clock de 
4MHz, tem-se um clock interno de 1MHz e um ciclo de máquina de 1µs. 
 
CKint = CKext / 4 onde: CKint = Clock interno; 
 CKext = Clock externo; 
 
TCM = 1 / Ckint onde: CM = Tempo de Ciclo de Máquina; 
 
 
De maneira simplificada pode-se utilizar como cálculo de ciclo de máquina a seguinte equação: 
 
TCM = 4 / Freq. Osc. onde: TCM = Tempo de Ciclo de Máquina; 
 Freq. Osc. = Freqüência do Oscilador; 
 
Observação: No caso do microcontrolador PIC16F877A, a Microchip garante perfeito funcionamento do ciclo de 
máquina com um oscilador de até 20MHz. 
 
 Ao observar as equações anteriores é possível perceber que os TCM estão relacionados a uma constante de valor 
4, mas qual o motivo desse número? Fácil o entendimento. 
 Para executar uma única instrução pelo processador, algumas operações são realizadas. O fato do processamento 
não ser paralelo, exige operações de processamentos executados em sub-ciclos de máquina, originados pela divisão 
do clock externo. Estes sub-ciclos são conhecidos por Q1, Q2, Q3 e Q4. 
 O program counter (contador de programa) é incrementado no instante Q1 automaticamente. Dentro dos quatro 
tempos (Q1 a Q4), a instrução carregada para ULA é executada, sendo trocadas informações com a memória de 
dados e o registrador W (Work) sempre que necessário. Por fim, no instante Q4, a próxima instrução é buscada da 
memória de programa e colocada na ULA. 
 Esse processo é conhecido como PIPELINE, ele permite que todas as instruções sejam executadas em um ciclo de 
máquina. 
 Observação: As exceções são os jumps (saltos) realizados no program counter, como chamadas de rotinas e 
retornos que gastam 2 ciclos de máquina. 
 
 
Exemplo PIPELINE 
 
Vamos imaginar uma lavanderia, na qual possui quatro atividades a serem realizadas. 
Seqüência de trabalho: 
 
• Colocar a roupa na máquina de lavar; 
• Depois de lavada colocar na secadora; 
• Depois de seca passar o ferro; 
• Por fim guardá-la no armário. 
 
 
 
 
Professor Sérgio Minas Melconian. 
 10 
 
 
Ciclo sem PIPELINE 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ciclo com PIPELINE 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Supondo que cada etapa gaste 30 minutos para ser realizada, utilizando o ciclo sem PIPELINE, um cesto de roupas 
levará 2h para ficar pronto. Já utilizando o ciclo com PIPELINE, o mesmo cesto ficará pronto em apenas 30 
minutos. Ao final de duas horas teremos lavado 4 cestos de roupas. 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 11 
 
Seqüência no PIC 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Memórias 
 
Memória de Programa: É a memória onde ficará armazenada as instruções do programa no qual fará o controle 
das atividades. No caso do PIC16F877A esta é uma memória do tipo FLASH de 8192 palavras (8K) e 14 bits. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 12 
 
Demais características da memória de programa 
 
Vetor de Reset: É a posição 0x0000h de endereço da memória de programa, é para onde o programa vai quando é 
reiniciado (reset). 
Vetor de interrupção: É a posição 0x0004h de endereço da memória de programa, é a posição de memória para 
onde serão desviados todos os processamentos de interrupção. Este PIC possui 15 tipos de interrupções diferentes. 
Pilha (STACK): É uma região, fisicamente separada da memória de programa, onde serão guardados os endereços 
de retorno quando utilizados desvios para chamada de rotinas. Quando o programa é desviado por meio do 
comando CALL, o endereço seguinte ao ponto que estava sendo executado é guardado na pilha, ao fim da rotina, o 
programa retorna ao ponto que estava. 
 O PIC16F877A possui uma pilha com 8 níveis, possibilitando guardar até 8 endereços de retorno (8 desvios 
consecutivos). Caso o programador tente ocupar mais de 8 níveis da pilha, a informação mais antiga será perdida. 
 A pilha desse PIC armazena endereços de 13bits, sendo suficiente para gerenciar 8k de memória de programa. 
 
Memória de Dados: A memória de dados é volátil do tipo RAM (Random Access Memory). Serve para guardar 
as variáveis e os registradores utilizados pelo programa. Ela armazena dados de 8 bits e está dividida em dois 
grupos: Registradores Especiais e Registradores de uso geral. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 13 
 
Demais características da memória de dados 
 
Registradores Especiais: Região da memória de dados onde se encontram todos os registradores especiais e que 
são utilizados pelo PIC para a execução do programa e processamento da ULA. 
Registradores de uso geral: Região da memória de dados onde é possível armazenar até 368 Bytes de variáveis 
definidas pelo programador, para serem escritas ou lidas pelo programa. 
 
Observação: A memória de dados está divida em 4 bancos de memória (Banco 0, Banco 1, Banco 2 e Banco 3), 
isso ocorre devido a existência de apenas 7 bits para endereçamento de todos os registradores, com isso só se pode 
gerenciar 128 endereços diferentes. Por isso que o fabricante dividiu amemória em quatro grupos de 128 Bytes 
cada. 
 
Acesso aos bancos de memória 
 
Para acessar os bancos de memória é preciso gerenciar os registradores STATUS <RP1:RP0>. 
 
BANCO RP1 RP0 
0 0 0 
1 0 1 
2 1 0 
3 1 1 
 
Observação: Sempre que o PIC for ligado, o Banco 0 será o primeiro a ser selecionado. 
 
Interrupções 
 
 As interrupções são ferramentas que possibilitam a execução de determinadas situações no momento em que elas 
ocorrem. Normalmente elas são geradas devido ações externas. 
 O PIC 16F877A é composto por 15 interrupções diferentes, as quais sempre serão desviadas para o vetor de 
interrupção (0004h) da memória de programa. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 14 
 
 
 As 15 interrupções que compõem o PIC 16F877A são: 
 
• Interrupção de Timer 0; 
• Interrupção Externa; 
• Interrupção por mudança de Estado; 
• Interrupção da Porta Paralela (PSP); 
• Interrupção dos Conversores A/D; 
• Interrupção de Recepção da USART; 
• Interrupção de Transmissão da USART; 
• Interrupção da Comunicação Serial (SPI e I2C); 
• Interrupção do CCP1 (Capture/Compare/PWM); 
• Interrupção do Timer 1; 
• Interrupção de Timer 2; 
• Interrupção de fim de escrita na E2PROM/FLASH; 
• Interrupção de Colisão de Dados (BUS Collision); 
• Interrupção dos Comparadores; 
 
 
 
Características Elétricas 
 
 
Temperatura de Trabalho -55ºC até +125ºC 
Temperatura de Armazenamento -65ºC até +150ºC 
Tensão de Trabalho 4V a 5,5V 
Tensão Máxima no Pino VDD (em relação a Vss) -0,3V a 7,5V 
Tensão Máxima no MCRL (em relação a Vss) 0 a 14V 
Tensão Máxima no Pino RA4 (em relação a Vss) 0 a 8,5V 
Tensão Máxima nos Demais Pinos (em relação a Vss) -0,3V a (VDD + 0,3V) 
Dissipação Máxima de Energia 1W 
Corrente Máxima de Saída no Pino Vss 300mA 
Corrente Máxima de Entrada no Pino VDD 250mA 
Corrente Máxima de Saída de um Pino (em VDD) 25mA 
Corrente Máxima de Entrada de um Pino (em Vss) 25mA 
Corrente Máxima de Entrada do PORTA, PORTB e PORTE 200mA 
Corrente Máxima de Saída do PORTA, PORTB e PORTE 200mA 
Corrente Máxima de Entrada do PORTC e PORTD 200mA 
Corrente Máxima de Saída do PORTC e PORTD 200mA 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 15 
 
Set de Instruções 
 
O Set de instruções é dividido em quatro grupos, os quais compõem um conjunto com 35 instruções: 
• Operações com registradores; 
• Operações com literais; 
• Operações com bits; 
• Controles; 
 
Operações com Registradores 
Instrução Argumentos Descrição 
ADDWF f,d Soma W e f guardando o resultado em d. 
ANDWF f,d Lógica "E" entre W e f, guarda o resultado em d. 
CLRF f Limpa f. 
COMF f,d Calcula o complemento de f guardando o resultado em d 
DECF f,d Decrementa f, guardando o resultado em d. 
DECFSZ f,d 
Decrementa f, guardando o resultado em d e pula a próxima linha 
se o resultado for zero. 
INCF f,d Incrementa f, guardando o resultado em d. 
INCFSZ f,d 
Incrementa f, guardando o resultado em d e pula a próxima linha se 
o resultado for zero. 
IORWF f,d Lógica "ou" entre W e f, guardando o resultado em d. 
MOVF f,d Move f para d (copia f em d). 
MOVWF f Move W para f (copia W em f). 
RLF f,d Rotaciona f um bit para esquerda. 
RRF f,d Rotaciona f um bit para direita. 
SUBWF f,d Subtrai W de f (f - W) guardando o resultado em d. 
SWAPF f,d 
Executa uma inversão entre as partes alta e baixa de f, guardando 
em d. 
XORWF f,d Lógica "ou exclusivo" entre k e W guardando o resultado em d. 
 
 
 
 
Professor Sérgio Minas Melconian. 
 16 
 
Operações com Literais 
Instrução Argumentos Descrição 
ADDLW K Soma k com W, guardando o resultado em W. 
ANDLW K Lógica "E" entre k e W, guardando o resultado em W. 
IORLW K Lógica "OU" entre k e W, guardando o resultado em W. 
MOVLW K Move k para W. 
SUBLW K Subtrai W de k (k - W), guardando o resultado em W. 
XORLW K Lógica "OU EXCLUSIVO” entre k e W, guardando o resultado em W. 
 
Operações com bit 
Instrução Argumentos Descrição 
BCF f,b Impõe 0(zero) ao bit do registrador f. 
BSF f,b Impõe 1 (um) ao bit do registrador f. 
BTFSC f,b Testa o bit b do registrador f e pula a próxima linha se for 0 (zero). 
BTFSS f,b Testa o bit b do registrador f e pula a próxima linha se for 1 (um). 
 
Controles 
Instrução Argumentos Descrição 
CLRW - Limpa w. 
NOP - Gasta um ciclo de máquina sem fazer nada. 
CALL R Executa a rotina R. 
CLRWDT - Limpa o registrador WDT para não acontecer reset. 
GOTO R Desvia para o ponto R mudando o PC. 
RETFIE - Retorna de uma interrupção. 
RETLW K Retorna de uma rotina com k em W. 
RETURN - Retorna de uma rotina sem afetar W. 
SLEEP Coloca o PIC em modo sleep (dormindo) para economia de energia. 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 17 
 
Fluxogramas 
 
 Os fluxogramas são ferramentas que ajudam o programador a estruturar de maneira gráfica uma seqüência 
lógica de atividades que posteriormente serão executadas por um determinado programa. 
 
Elementos utilizados na construção dos fluxogramas: 
 
 
Inicio ou Término – Símbolo utilizado para representar inicio ou término de 
programa; 
 
 
Processo – Símbolo utilizado para descrever uma determinada tarefa; 
 
 
 
Dados – Símbolo utilizado para descrição de entrada de dados; 
 
 
 
 
Tomada de decisão – Símbolo utilizado para testes condicionais. E tomada de 
decisão pode seguir um fluxo verdadeiro ou falso. 
 
 
Exemplo: Serão somados dois números inteiros A+B, se o resultado for par guarda em P, já se o resultado 
for impar guarda em I e finaliza o programa. 
 
 Inicio 
 
 
 Pega número A. 
 
 
 Pega número B. 
 
 
 Soma A+B 
 
 
 Não Sim 
 Guarda A+B em I A+B é Par? Guarda A+B em P 
 
 
 
 FIM 
 
 
 
Professor Sérgio Minas Melconian. 
 18 
 
Primeiro Exemplo – Botão e LED 
 
Será dado inicio a programação dos microcontroladores PIC com um programa tradicional e simples de se 
entender. 
 
Funcionamento: Ao apertar um botão, um LED se manterá ligado até o botão ser solto. 
 
Fluxograma 
 
 
 
 INICIO 
 
 
 CONFIGURAÇÕES 
 INICIAIS 
 
 1 
 
 SIM BOTÃO NÃO 
 ACENDE O LED PRESSIONADO? APAGA O LED 
 
 
 
 1 
 
 
 
 
O Programa 
 
 
;************************************************************************************* 
;* PROGRAMA LIGA LED POR MEIO DE UM BOTÃO * 
;************************************************************************************* 
 
;***************************CONFIGURAÇÃO PARA GRAVAÇÃO************************* 
 
#INCLUDE <P16F877A.INC> ;MODELO DO MICROCONTROLADOR UTILIZADO. 
 
 __CONFIG_CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC 
 
; CP - CODE PROTECTION (HABILITA OU DESABILITA LEITURA DA MEMÓRIA DE PROGRAMA). 
; DEBUG - DEPURADOR DA PLACA ICD 2 (HABILITA OU DESABILITA DEPURADOR DA PLACA ICD 2). 
; PWRTE - POWER UP TIMER (HABILITA OU DESABILITA TEMPORIZADOR QUE AGUARDA 72 ms PARA 
;ESTABILIZAR O PIC). 
; WDT - WATCHDOG TIMER ("CÃO DE GUARDA" TEMPORIZADOR QUE RESETA O PIC QUANDO SISTEMA 
;TRAVADO). 
; BOREN - BROWN OUT DETECT (SE A ALIMENTAÇÃO VDD FOR MENOR QUE 4V DURANTE 100 MICRO-SEG. 
;O PIC RESETA). 
; LVP - LOW VOLTAGE PROGRAM (SISTEMA DE PROGRAMAÇÃO EM BAIXA TENSÃO). 
; XT - OSCILADOR DO TIPO CRISTAL. 
 
Professor Sérgio Minas Melconian. 
 19 
 
;**************************DEFINIÇÃO DOS BANCOS DE MEMÓRIA RAM************************ 
 
#DEFINE BANK0 BCF STATUS, RP0 ;SETA BANK 0 DE MEMÓRIA. 
#DEFINE BANK1 BSF STATUS, RP0 ;SETA BANK 1 DE MEMÓRIA. 
 
;O PIC 16F877A POSSUI QUATRO BANCOS DE MEMÓRIAS PARA OS REGISTRADORES ESPECIAIS (SFR). POR 
;ISSO, QUANDO QUEREMOS ACESSAR ALGUM REGISTRADOR SFR, DEVEMOS PRIMEIRO INFORMAR AO 
;SISTEMA QUAL BANK QUEREMOS TRABALHAR. 
;PARA ISSO DEVEMOS ALTERAR OS BITS RP0 E RP1 NO REGISTRADOR STATUS. 
;TABELA: 
; BANCO RP1 RP0 
; 0 0 0 
; 1 0 1 
; 2 1 0 
; 3 1 1 
;OBS: SEMPRE QUE O PIC INICIA, RP1 E RP0 SÃO INICIADOS COM ZERO.LOGO O BANK 0 É SEMPRE O 
;PRIMEIRO SELECIONADO. 
 
;***************************************VARIÁVEIS************************************* 
 
CBLOCK 0X70 ;ENDEREÇO LOCALIZADO NA MAMÓRIA DE DADOS DO BANK 0. FOI 
;ESCOLHIDO, POIS ESTÁ LOCALIZAÇÃO É ACESSADA DE QUALQUER BANCO, FACILITANDO A OPERAÇÃO. 
 
ENDC ;FIM DO BLOCO DE MEMÓRIA. 
 
;*****************************************FLAGS*************************************** 
 
; SINALIZA QUEM GEROU A INTERRUPÇÃO. "NÃO SERÁ UTILIZADO NESTE PROGRAMA". 
 
;***************************************CONSTANTES************************************ 
 
; FILTRO PARA EVITAR RUIDOS DOS BOTÕES. "NÃO SERÁ UTILIZADO NESTE PROGRAMA". 
 
;****************************************ENTRADAS************************************* 
 
#DEFINE BOTAO_0 PORTB,0 ;BOTÃO QUE LIGA O SISTEMA - (PINO 33 - RB0) 
 
;*****************************************SAÍDAS************************************** 
 
#DEFINE LED_1 PORTB,1 ;LED 1 - (PINO 34 - RB1) 
 ;0 -> APAGADO 
 ;1 -> ACESO 
 
;*************************************VETOR DE RESET********************************** 
 
ORG 0X0000 ;ENDEREÇO DO VETOR DE RESET 
GOTO INICIO ;PULA PARA O INICIO 
 
;***********************************INICIO DA INTERRUPÇÃO***************************** 
 
ORG 0X0004 ;ENDEREÇO DO VETOR DE INTERRUPÇÃO 
RETFIE ;RETORNA DA INTERRUPÇÃO 
 
Professor Sérgio Minas Melconian. 
 20 
 
;*************************************INICIO DO PROGRAMA****************************** 
 
INICIO 
 
CLRF PORTB ;LIMPA PORTB 
 
BANK1 ;TRABALHAR COM BANK1 
 
MOVLW B'00000001' 
MOVWF TRISB ;DEFINE RB0 COMO ENTRADA E DEMAIS PORTS B COMO SAÍDA (1 -> 
;ENTRADA, 0 -> SAÍDA). 
 
BANK0 ;TRABALHAR COM BANK0 
 
;*************************************ROTINA PRINCIPAL******************************** 
 
MAIN 
 
BTFSC BOTAO_0 ;O BOTÃO_0 ESTÁ PRESSIONADO? 
GOTO BOTAO_LIBERADO ;VAI PARA BOTÃO_LIBERADO. 
GOTO BOTAO_PRESSIONADO ;VAI PARA BOTÃO_PRESSIONADO. 
 
BOTAO_LIBERADO 
BCF LED_1 ;APAGA LED_1 
GOTO MAIN ;RETORNA AO LOOP PRINCIPAL (MAIN) 
 
BOTAO_PRESSIONADO 
BSF LED_1 ;ACENDE LED_1 
GOTO MAIN ;RETORNA AO LOOP PRINCIPAL (MAIN) 
 
;**************************************FIM DO PROGRAMA******************************** 
END ;FIM DO PROGRAMA (OBRIGATÓRIO) 
 
 
Exercícios Propostos 
 
Utilizando como parâmetro o primeiro exemplo, faça as seguintes alterações: 
 
A) Inverta a lógica do LED, ao pressionar o botão o LED apagará e ao liberá-lo o LED acenderá. 
B) Ao apertar o botão faça dois LEDs acenderem. 
C) Utilize dois botões e quatro LEDs. Quando um botão for pressionado dois LEDs acesos se apagarão, já o 
outro botão ao ser pressionado acenderá dois LEDs que estavam apagados. 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 21 
 
Segundo Exemplo – Contador de Tempo (DELAY) 
 
 
Neste segundo exemplo será estudada uma rotina para contar tempo. 
 
 
Funcionamento: Ao apertar um botão, um LED se manterá ligado por 1s e desligará logo em seguida. 
 
 
Fluxograma 
 
 
 
 INICIO 
 
 
 CONFIGURAÇÕES 
 INICIAIS 
 
 1 
 
 SIM BOTÃO NÃO 
 PRESSIONADO? APAGA O LED 1 
 
 
 ACENDE O LED 
 
 
 
 
 
 CONTADOR DE NÃO DECREMENTA 
 TEMPO = 0s? CONTADOR DE TEMPO. 
 
 
 SIM 
 
 
 APAGA O LED 
 
 
 
 1 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 22 
 
O Programa 
 
;**************************************************************************************************** 
;* PROGRAMA CONTADOR DE TEMPO (DELAY) * 
;**************************************************************************************************** 
 
;******************************** ARQUIVOS DE DEFINIÇÃO DO PIC ********************************** 
 
#INCLUDE <P16F877A.INC> ;MODELO DO MICROCONTROLADOR UTILIZADO - PIC 16F877A 
 
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC 
 
;******************************** PAGINAÇÃO DE MEMÓRIA DO PIC ********************************** 
 
#DEFINE BANK0 BCF STATUS,RP0 ;HABILITA BANCO 0 DE MEMÓRIA 
#DEFINE BANK1 BSF STATUS,RP0 ;HABILITA BANCO 1 DE MAMÓRIA 
 
;********************************** DEFINIÇÃO DAS VÁRIAVEIS ************************************** 
 
CBLOCK 0X70 ;INICIO DA MEMÓRIA DE ÚSUARIO 
 
TEMPO1 ;CONTADOR DE TEMPO1 (VALOR 250) 
TEMPO2 ;CONTADOR DE TEMPO2 (VALOR 250) 
TEMPO3 ;CONTADOR DE TEMPO3 (VALOR 4) 
 
ENDC ;FIM DO BLOCO DE MEMÓRIA 
 
;**************************************** ENTRADAS ************************************************ 
 
#DEFINE BOTAO_0 PORTB,0 ;BOTÃO QUE LIGA O SISTEMA - (PINO 33 - RB0) 
 
;***************************************** SAÍDAS *************************************************** 
 
#DEFINE LED_1 PORTB,1 ;PORTA DO LED1 (PINO 34 - RB1) 
 ;0 -> APAGADO 
 ;1 -> ACESO 
 
;************************************* VETOR DE RESET ********************************************* 
 
ORG 0X0000 ;ENDEREÇO INICIAL PARAPROCESSAMENTO 
GOTO INICIO ;VAI PARA INICIO DO PROGRAMA 
 
;********************************* INICIO DA INTERRUPÇÃO ***************************************** 
 
ORG 0X0004 ;ENDEREÇO INICIAL DA INTERRUPÇÃO 
RETFIE ;RETORNA DA INTERRUPÇÃO 
 
;********************************** INICIO DO PROGRAMA ******************************************* 
 
INICIO 
 
CLRF PORTB ;LIMPA TODO PORTB 
 
Professor Sérgio Minas Melconian. 
 23 
 
BANK1 ;HABILITA BANCO 1 DE MEMÓRIA DO PIC 
 
MOVLW B'00000001' 
MOVWF TRISB ;CONFIGURA PORTB,0 COMO ENTRADA E DEMAIS PINOS COMO SAÍDA. 
 
BANK0 ;RETORNA PARA O BANCO 0 DE MEMÓRIA DO PIC 
 
;*********************************** ROTINA PRINCIPAL ********************************************** 
 
MAIN 
 
BTFSC BOTAO_0 ;O BOTÃO_0 ESTÁ PRESSIONADO? 
GOTO BOTAO_LIBERADO ;VAI PARA BOTÃO_LIBERADO. 
GOTO BOTAO_PRESSIONADO ;VAI PARA BOTÃO_PRESSIONADO. 
 
BOTAO_LIBERADO 
BCF LED_1 ;APAGA LED_1 
GOTO MAIN ;RETORNA AO LOOP PRINCIPAL (MAIN) 
 
BOTAO_PRESSIONADO 
BSF LED_1 ;ACENDE LED_1 
CALL DELAY ;CHAMA ROTINA DE DELAY 
BCF LED_1 ;DESLIGA LED_1 
GOTO MAIN ;RETORNA AO LOOP PRINCIPAL (MAIN) 
 
;*********************************** ROTINA DE DELAY ********************************************* 
 
DELAY ;ROTINA DE DELAY 
 
MOVLW .4 
MOVWF TEMPO3 ;TEMPORIZA 1s 
 
DL3 
 
MOVLW .250 
MOVWF TEMPO2 ;TEMPORIZA 1/4s = 0.25s 
 
DL2 
 
MOVLW .250 
MOVWF TEMPO1 ;TEMPORIZA 1ms 
 
DL1 
 
NOP ;GASTA UM CICLO DE MÁQUINA. 
DECFSZ TEMPO1 ;DECREMENTA TEMPO1 
GOTO DL1 
 
DECFSZ TEMPO2 ;DECREMENTA TEMPO2 
GOTO DL2 
 
DECFSZ TEMPO3 ;DECREMENTA TEMPO3 
GOTO DL3 
Professor Sérgio Minas Melconian. 
 24 
 
RETURN ;RETORNA DA ROTINA DE DELAY 
 
;*********************************** FIM DO PROGRAMA ********************************************* 
 
END ;FIM DO PROGRAMA 
 
 
Exercícios Propostos 
 
Utilizando como parâmetro o segundo exemplo, faça as seguintes alterações: 
 
A) Ao apertar um botão, um LED ficará ligado por 5s e desligado logo em seguida. 
B) Ao apertar um botão, ligue o LED_1, após 2s ligue o LED_2 e os desligue após 2s. 
C) Ao ligar o microcontrolador, o LED_1 deve se manter aceso constantemente, passados 4s o LED_2 deverá 
piscar 5 vezes com um DELAY de 1s apagado e 3s ligado. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 25 
 
Terceiro Exemplo – Gerando Som (BUZZER) 
 
 
Neste terceiro exemplo será estudada uma rotina para se gerar som com um cristal piezelétrico (Buzzer). 
 
 
Funcionamento: Para um buzzer soar, é necessário alimentá-lo com uma fonte de sinal. Neste caso, o PIC ira 
gerar ondas quadradas com freqüência tal para o funcionamento do mesmo. 
 
 
Fluxograma 
 
 
 
 INICIO 
 
 
 CONFIGURAÇÕES 
 INICIAIS 
 
 
 
 GERAR ONDA 
 QUADRADA COM 
 FREQUÊNCIA f. 
 
 
 
 
 
O Programa 
 
;**************************************************************************************************** 
;* PROGRAMA BUZZER * 
;**************************************************************************************************** 
 
;********************************* ARQUIVOS DE DEFINIÇÃO DO PIC ********************************** 
 
#INCLUDE <P16F877A.INC> ;MODELO DO MICROCONTROLADOR UTILIZADO - PIC 16F877A 
 
__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC 
 
;********************************* PAGINAÇÃO DE MEMÓRIA DO PIC ********************************** 
 
#DEFINE BANK0 BCF STATUS,RP0 ;HABILITA BANCO 0 DE MEMÓRIA 
#DEFINE BANK1 BSF STATUS,RP0 ;HABILITA BANCO 1 DE MAMÓRIA 
 
;*********************************** DEFINIÇÃO DAS VÁRIAVEIS ************************************* 
 
CBLOCK 0X70 ;INICIO DA MEMÓRIA DE ÚSUARIO 
 
TEMPO1 ;VARIAVEL TEMPO1 
Professor Sérgio Minas Melconian. 
 26 
 
ENDC ;FIM DO BLOCO DE MEMÓRIA 
 
;******************************************* SAÍDAS ************************************************ 
 
#DEFINE BUZZER PORTA,5 ;PORTA DO BUZZER 
 
;************************************** VETOR DE RESET ******************************************** 
 
ORG 0X0000 ;ENDEREÇO INICIAL PARA PROCESSAMENTO 
GOTO INICIO ;VAI PARA INICIO DO PROGRAMA 
 
;*********************************** INICIO DA INTERRUPÇÃO **************************************** 
 
ORG 0X0004 ;ENDEREÇO INICIAL DA INTERRUPÇÃO 
RETFIE ;RETORNA DA INTERRUPÇÃO 
 
;********************************** INICIO DO PROGRAMA ******************************************* 
 
INICIO 
 
CLRF PORTA ;LIMPA TODO PORTA 
 
BANK1 ;HABILITA BANCO 1 DE MEMÓRIA DO PIC 
 
MOVLW B'00000000' 
MOVWF TRISA ;CONFIGURA TODO PORTA COMO SAÍDA. 
 
BANK0 ;RETORNA PARA O BANCO 0 DE MEMÓRIA DO PIC 
 
;************************************ ROTINA PRINCIPAL ******************************************** 
 
MAIN ;INICIO DA ROTINA PRINCIPAL 
 
BSF BUZZER ;SETA O PORTA,5 (BUZZER) 
CALL DELAY_MS ;CHAMA ROTINA DE DELAY 
BCF BUZZER ;LIMPA O PORTA,5 (BUZZER) 
CALL DELAY_MS ;CHAMA ROTINA DE DELAY 
GOTO MAIN ;VAI PARA O INICIO DA ROTINA PRINCIPAL 
 
 
;**************************************ROTINA DE DELAY******************************** 
 
DELAY_MS ;ROTINA DE DELAY 
 
 
MOVLW .50 ;MOVER O NUMERO 50 EM DECIMAL PARA W (VALOR MAXIMO = 256) 
MOVWF TEMPO1 ;MOVER O NUMERO 50 PARA TEMPO1 
 
NOP ;PERDE UM CICLO DE MÁQUINA (SÓ PARA GANHAR TEMPO) 
 
DECFSZ TEMPO1,F ;DECREMENTA TEMPO1 E GUARDA O RESULTADO EM F, E PULA A PROXIMA LINHA 
SE RESULTADO FOR ZERO (FIM DO TEMPO1?) 
 
Professor Sérgio Minas Melconian. 
 27 
 
GOTO $-2 ;NÃO, VOLTA DUAS INSTRUÇÕES 
 ;SIM, PASSOU TEMPO 
 
RETURN ;RETORNA DA ROTINA DE DELAY 
 
;************************************* FIM DO PROGRAMA ******************************************* 
 
END ;FIM DO PROGRAMA 
 
 
Exercícios Propostos 
 
Utilizando como parâmetro o terceiro exemplo, faça as seguintes alterações: 
 
A) Altere as freqüências geradas, deixando o som mais grave. 
B) Faça o buzzer soar de maneira que fique bipando com delay de 2s. 
C) Insira 3 botões, cada um ao ser pressionado ira gerar uma freqüência diferente. (o som só será escutado em 
quanto o botão estiver pressionado). 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 28 
 
Quarto Exemplo – Rotação de Bit 
 
 
Neste quarto exemplo será estudada uma rotina para rotação de bit. 
 
 
Funcionamento: Um bit ficará rotacionando para esquerda. 
 
LED ESTADO 
L0 LIGA 
L0 DESLIGA 
L1 LIGA 
L1 DESLIGA 
L2 LIGA 
L2 DESLIGA 
L3 LIGA 
L3 DESLIGA 
 
FluxogramaINICIO 
 
 
 CONFIGURAÇÕES 
 INICIAIS 
 
 
 
 LIMPA 
 REGISTRADOR 
 STATUS,C 
 
 
 
 
 ROTACIONAR O BIT 
 (3X) 
 
 
 
 
 LIMPA LED 
 (PORTB) 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 29 
 
O Programa 
 
 
;********************************************************************************************* 
;* PROGRAMA ROTAÇÃO DE BIT COM RLF * 
;********************************************************************************************* 
 
;******************************CONFIGURAÇÃO PARA GRAVAÇÃO***************************** 
 
#INCLUDE <P16F877A.INC> ;MODELO DO MICROCONTROLADOR UTILIZADO. 
 
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC 
 
;**************************DEFINIÇÃO DOS BANCOS DE MEMÓRIA RAM************************ 
 
#DEFINE BANK0 BCF STATUS, RP0 ;SETA BANK 0 DE MEMÓRIA. 
#DEFINE BANK1 BSF STATUS, RP0 ;SETA BANK 1 DE MEMÓRIA. 
 
 
;***************************************VARIÁVEIS************************************* 
 
CBLOCK 0X70 ;ENDEREÇO LOCALIZADO NA MAMÓRIA DE DADOS DO BANK 0. FOI ESCOLHIDO, POIS 
;ESTÁ LOCALIZAÇÃO É ACESSADA DE QUALQUER BANCO, FACILITANDO A OPERAÇÃO. 
 
TEMPO1 ;CONTADOR PARA DELAY 1ms 
TEMPO2 ;CONTADOR PARA DELAY 1/4s = 0,25s 
TEMPO3 ;CONTADOR PARA DELAY 1s 
 
ENDC ;FIM DO BLOCO DE MEMÓRIA. 
 
;*****************************************SAÍDAS************************************** 
 
#DEFINE LED PORTB ;DEFINE PORTB COMO LED. 
 ;0 -> APAGADO 
 ;1 -> ACESO 
 
;*************************************VETOR DE RESET********************************** 
 
ORG 0X0000 ;ENDEREÇO DO VETOR DE RESET 
GOTO INICIO ;PULA PARA O INICIO 
 
;***********************************INICIO DA INTERRUPÇÃO***************************** 
 
ORG 0X0004 ;ENDEREÇO DO VETOR DE INTERRUPÇÃO 
RETFIE ;RETORNA DA INTERRUPÇÃO 
 
;*************************************INICIO DO PROGRAMA****************************** 
 
INICIO 
 
CLRF PORTB ;LIMPA PORTB 
 
BANK1 ;TRABALHAR COM BANK1 
Professor Sérgio Minas Melconian. 
 30 
 
MOVLW B'00000000' 
MOVWF TRISB ;DEFINE PORTS B COMO SAÍDA (1 -> ENTRADA, 0 -> SAÍDA). 
 
BANK0 ;TRABALHAR COM BANK0. 
 
;*************************************ROTINA PRINCIPAL******************************** 
 
MAIN 
 
BCF STATUS,C ;LIMPA CARRY (REGISTRADOR RELACIONADO AS OPERAÇÕES MATEMÁTICAS) 
MOVLW B'00000001' ;MOVER VALOR 1 EM BINÁRIO PARA W (VALOR MENOS SIGNIFICATIVO) 
MOVWF LED ;MOVER VALOR DE W (W=1)PARA LED (PORTB) 
CALL DELAY_1S ;CHAMA ROTINA DE DELAY 
 
RLF LED ;ROTACIONA BIT DO LED PARA ESQUERDA 
CALL DELAY_1S ;CHAMA ROTINA DE DELAY 
 
 
RLF LED ;ROTACIONA BIT DO LED PARA ESQUERDA 
CALL DELAY_1S ;CHAMA ROTINA DE DELAY 
 
RLF LED ;ROTACIONA BIT DO LED PARA ESQUERDA 
CALL DELAY_1S ;CHAMA ROTINA DE DELAY 
 
CLRF LED ;LIMPA LED 
GOTO MAIN ;RETORNA PARA MAIN 
 
;**************************************ROTINA DE DELAY******************************** 
 
DELAY_1S ;ROTINA DE DELAY 
 
MOVLW .4 
MOVWF TEMPO3 ;TEMPORIZA 1s 
 
DL3 
 
MOVLW .250 
MOVWF TEMPO2 ;TEMPORIZA 1/4s = 0.25s 
 
DL2 
 
MOVLW .250 
MOVWF TEMPO1 ;TEMPORIZA 1ms 
 
DL1 
 
NOP ;GASTA UM CICLO DE MÁQUINA. 
DECFSZ TEMPO1 ;DECREMENTA TEMPO1 
GOTO DL1 
 
DECFSZ TEMPO2 ;DECREMENTA TEMPO2 
GOTO DL2 
 
Professor Sérgio Minas Melconian. 
 31 
 
DECFSZ TEMPO3 ;DECREMENTA TEMPO3 
GOTO DL3 
 
RETURN ;RETORNA DA ROTINA DE DELAY 
 
;**************************************FIM DO PROGRAMA******************************** 
 
END ;FIM DO PROGRAMA (OBRIGATÓRIO) 
 
 
Exercícios Propostos 
 
Utilizando como parâmetro o quarto exemplo, faça as seguintes alterações: 
 
A) Inverta o sentido de rotação do bit para a direita. 
B) Ao invés de rotacionar apenas o bit como no exemplo, rotacione o bit, mantendo o anterior ligado. 
 
LED ESTADO 
L0 LIGA 
L1 LIGA 
L2 LIGA 
L3 LIGA 
L0 DESLIGA 
L1 DESLIGA 
L2 DESLIGA 
L3 DESLIGA 
 
C) Mantenha a seqüência pedida no item B (iniciar ligada) e insira um botão que ao ser pressionado, irá manter 
todos os LEDs ligados por 5s, em seguida a seqüência do item B voltará a rotacionar. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 32 
 
Quinto Exemplo – Display 7 segmentos (Catodo Comum) 
 
 
Neste quinto exemplo será estudada uma rotina para aplicação do display de 7 segmentos catodo comum.. 
 
 
Funcionamento: Um botão ira incrementar um contador que vai de 0 à 15 e outro botão ira decrementar o mesmo. 
 
 
Fluxograma 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 33 
 
O Programa 
 
;************************************************************************************* 
;* PROGRAMA CONTADOR - DISPLAY 7 SEGMENTOS E CONTADOR * 
;************************************************************************************* 
 
;******************************CONFIGURAÇÃO PARA GRAVAÇÃO********************** 
 
#INCLUDE <P16F877A.INC> ;MODELO DO MICROCONTROLADOR UTILIZADO. 
 
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC 
 
;**************************DEFINIÇÃO DOS BANCOS DE MEMÓRIA RAM***************** 
 
#DEFINE BANK0 BCF STATUS, RP0 ;SETA BANK 0 DE MEMÓRIA. 
#DEFINE BANK1 BSF STATUS, RP0 ;SETA BANK 1 DE MEMÓRIA. 
 
;***************************************VARIÁVEIS************************************ 
 
CBLOCK 0X70 ;ENDEREÇO LOCALIZADO NA MAMÓRIA DE DADOS DO BANK 0. FOI ESCOLHIDO, POIS 
;ESTÁ LOCALIZAÇÃO É ACESSADA DE QUALQUER BANCO, FACILITANDO A OPERAÇÃO. 
 
CONTADOR ;ARMAZENA O VALOR DA CONTAGEM 
FLAGS ;ARMAZENA OS FLAGS DE CONTROLE 
FILTRO1 ;FILTRAGEM PARA O BOTÃO 1 
FILTRO2 ;FILTRAGEM PARA O BOTÃO 2 
 
ENDC ;FIM DO BLOCO DE MEMÓRIA. 
 
;*****************************************FLAGS*************************************** 
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA. 
 
#DEFINE ST_BT0 FLAGS,0 ;STATUS DO BOTÃO 0 
#DEFINE ST_BT1 FLAGS,1 ;STATUS DO BOTÃO 1 
 
;***************************************CONSTANTES************************************ 
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA 
 
MIN EQU .0 ;VALOR MÍNIMO PARA O CONTADOR 
MAX EQU .15 ;VALOR MÁXIMO PARA O CONTADOR 
T_FILTRO EQU .255 ;FILTRO PARA BOTÃO 
 
;****************************************ENTRADAS************************************* 
 
#DEFINE BOTAO_0 PORTB,0 ;PORTA DO BOTÃO - (PINO 35 - RB2) 
#DEFINE BOTAO_1 PORTB,1 ;PORTA DO BOTÃO - (PINO 34 - RB1) 
 
;*****************************************SAÍDAS**************************************;NÃO SERÁ UTILIZADO NESTE PROGRAMA. 
 
 
 
Professor Sérgio Minas Melconian. 
 34 
 
;*************************************VETOR DE RESET********************************** 
 
ORG 0X0000 ;ENDEREÇO DO VETOR DE RESET 
GOTO INICIO ;PULA PARA O INICIO 
 
;***********************************INICIO DA INTERRUPÇÃO***************************** 
 
ORG 0X0004 ;ENDEREÇO DO VETOR DE INTERRUPÇÃO 
RETFIE ;RETORNA DA INTERRUPÇÃO 
 
;********************ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY 7 SEGMENTOS*************** 
 
; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER 
; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ 
; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTD. 
; a 
; ********** 
; * * 
; f * * b 
; * g * 
; ********** 
; * * 
; e * * c 
; * d * 
; ********** *. 
 
CONVERTE 
MOVF CONTADOR,W ;COLOCA CONTADOR EM W 
ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR 
 ;CONSIDERAR SOMENTE ATÉ 15 
ADDWF PCL,F ;SOMA DESLOCAMENTO AO PROGRAM COUTER, GERANDO UMATABELA"CASE" 
 
; B'PGFEDCBA' ; POSIÇÃO CORRETA DOS SEGUIMENTOS 
 RETLW B'00111111' ; 00 - RETORNA SÍMBOLO CORRETO 0 
 RETLW B'00000110' ; 01 - RETORNA SÍMBOLO CORRETO 1 
 RETLW B'01011011' ; 02 - RETORNA SÍMBOLO CORRETO 2 
 RETLW B'01001111' ; 03 - RETORNA SÍMBOLO CORRETO 3 
 RETLW B'01100110' ; 04 - RETORNA SÍMBOLO CORRETO 4 
 RETLW B'01101101' ; 05 - RETORNA SÍMBOLO CORRETO 5 
 RETLW B'01111101' ; 06 - RETORNA SÍMBOLO CORRETO 6 
 RETLW B'00000111' ; 07 - RETORNA SÍMBOLO CORRETO 7 
 RETLW B'01111111' ; 08 - RETORNA SÍMBOLO CORRETO 8 
 RETLW B'01101111' ; 09 - RETORNA SÍMBOLO CORRETO 9 
 RETLW B'01110111' ; 10 - RETORNA SÍMBOLO CORRETO A 
 RETLW B'11111111' ; 11 - RETORNA SÍMBOLO CORRETO B 
 RETLW B'00111001' ; 12 - RETORNA SÍMBOLO CORRETO C 
 RETLW B'10111111' ; 13 - RETORNA SÍMBOLO CORRETO D 
 RETLW B'01111001' ; 14 - RETORNA SÍMBOLO CORRETO E 
 RETLW B'01110001' ; 15 - RETORNA SÍMBOLO CORRETO F 
 
 
 
 
Professor Sérgio Minas Melconian. 
 35 
 
;*************************************INICIO DO PROGRAMA****************************** 
 
INICIO 
 
 BANK1 ;ALTERA PARA O BANCO 1 
 
 MOVLW B'00000011' 
 MOVWF TRISB ;DEFINE RB0 E RB1 COMO ENTRADA 
 MOVLW B'00000000' 
 MOVWF TRISC ;DEFINE TODO O PORTC COMO SAÍDA 
 MOVLW B'00000000' 
 MOVWF TRISD ;DEFINE TODO O PORTD COMO SAÍDA 
 
 
 
 BANK0 ;ALTERA PARA O BANCO 0 
 
 CLRF PORTB ;LIMPA O PORTB 
 CLRF PORTC ;LIMPA O PORTC 
 CLRF PORTD ;LIMPA O PORTD 
 CLRF FLAGS ;LIMPA TODOS OS FLAGS 
 MOVLW MIN 
 MOVWF CONTADOR ;INICIA CONTADOR = MIN = 0 
 GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE 
 
;*************************************ROTINA PRINCIPAL******************************** 
 
MAIN 
 BSF PORTC,3 ;ATIVA O DISPLAY DA PLACA. 
 MOVLW T_FILTRO 
 MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO 
 MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO 
 
CHECA_BT0 
 BTFSC BOTAO_0 ;O BOTÃO 0 ESTÁ PRESSIONADO? 
 GOTO BT0_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO 
 ;SIM 
 DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO 
 ;TERMINOU? 
 GOTO CHECA_BT0 ;NÃO, CONTINUA ESPERANDO 
 ;SIM 
 BTFSS ST_BT0 ;BOTÃO JÁ ESTAVA PRESSIONADO? (FLAG) 
 GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO 
 GOTO CHECA_BT1 ;SIM, CHECA BOTÃO 1 
 
BT0_LIB 
 BCF ST_BT0 ;MARCA BOTÃO 0 COMO LIBERADO (FLAG) 
 
CHECA_BT1 
 BTFSC BOTAO_1 ;O BOTÃO 1 ESTÁ PRESSIONADO? 
 GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO 
 ;SIM 
 DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO 
Professor Sérgio Minas Melconian. 
 36 
 
 ;TERMINOU? 
 GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO 
 ;SIM 
 BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO? (FLAG) 
 GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO 
 GOTO MAIN ;SIM, VOLTA AO LOOPING 
 
BT1_LIB 
 BCF ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO (FLAG) 
 GOTO MAIN ;RETORNA AO LOOPING 
 
DEC ;AÇÃO DE DECREMENTAR 
 BSF ST_BT0 ;MARCA BOTÃO 0 COMO JÁ PRESSIONADO (FLAG) 
 MOVF CONTADOR,W ;COLOCA CONTADOR EM W 
 XORLW MIN ;APLICA XOR ENTRE CONTADOR E MIN 
 ;PARA TESTAR IGUALDADE. SE FOREM 
 ;IGUAIS, O RESULTADO SERÁ ZERO 
 BTFSC STATUS,Z ;RESULTOU EM ZERO? 
 GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. 
 ;NÃO 
 DECF CONTADOR,F ;DECREMENTA O CONTADOR 
 GOTO ATUALIZA ;ATUALIZA O DISPLAY 
 
INC ;AÇÃO DE INCREMENTAR 
 BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO (FLAG) 
 MOVF CONTADOR,W ;COLOCA CONTADOR EM W 
 XORLW MAX ;APLICA XOR ENTRE CONTADOR E MAX 
 ;PARA TESTAR IGUALDADE. SE FOREM 
 ;IGUAIS, O RESULTADO SERÁ ZERO 
 BTFSC STATUS,Z ;RESULTOU EM ZERO? 
 GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. 
 ;NÃO 
 INCF CONTADOR,F ;INCREMENTA O CONTADOR 
 GOTO ATUALIZA ;ATUALIZA O DISPLAY 
 
ATUALIZA 
 CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO DISPLAY 
 
 MOVWF PORTD ;ATUALIZA O PORTD PARA VISUALIZARMOS O VALOR DE 
 ; CONTADOR NO DISPLAY. 
 GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL 
 
;**************************************FIM DO PROGRAMA******************************** 
 
 END ;FIM DO PROGRAMA (OBRIGATÓRIO) 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 37 
 
Exercícios Propostos 
 
Utilizando como parâmetro o quinto exemplo, faça as seguintes alterações: 
 
A) Faça um contador OCTAL (0 à 7). 
B) Faça um contador ALFABÉTICO de A à H. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 38 
 
 
Esquema Elétrico da Placa de Teste 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Professor Sérgio Minas Melconian. 
 39 
 
Lay-out Placa de Teste 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Observação: Adicione dois JUMPERS conforme representados em vermelho. 
 
Professor Sérgio Minas Melconian. 
 40 
 
Referências 
 
• Desbravando o PIC - Ampliado e Atualizado para PIC 16F628A. 
 Autor: David José de Souza. 
 Editora: Érica. 
 
• PIC16F877A Conectando o PIC – Recursos Avançados. 
 Autor (es): David José de Souza e Nicolas César Lavinia. 
 Editora: Érica. 
 
• Microcontroladores PIC - Técnicas Avançadas. 
 Autor: Fabio Pereira. 
 Editora: Érica. 
 
• Apostila – Microarquitetura de alto desempenho – Pipeline. 
 Autor: Gabriel P. Silva. 
 Universidade Federal de Rio de Janeiro. 
 
• Datasheet PIC16F877A. 
 
• http://www.labtools.com.br/

Outros materiais