Você está na página 1de 40

Professor Sérgio Minas Melconian.

MICROCONTROLADOR
PIC16F877A

FUNDAMENTOS
E
PROGRAMAÇÃO BÁSICA

1
Professor Sérgio Minas Melconian.

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.

2
Professor Sérgio Minas Melconian.

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.

3
Professor Sérgio Minas Melconian.

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;

4
Professor Sérgio Minas Melconian.

Pinagem – Encapsulamento PDIP - 40 Pinos

5
Professor Sérgio Minas Melconian.

Nomenclatura dos pinos

Nome do Pino Nº Caracte Tipo Descrição


rística
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- / 4 I/O TTL I/O DIGITAL OU ANALÓGICO OU TENSÃO NEGATIVA DE
CVREF 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 / 7 I/O TTL I/O DIGITAL OU ENTRADA ANALÓGICA OU HABILITAÇÃO
C2OUT 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).

6
Professor Sérgio Minas Melconian.
RD4 / PSP4 27 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).

7
Professor Sérgio Minas Melconian.

Estrutura Interna do PIC16F877A

O diagrama de blocos (original Microchip) indicado a baixo mostra as diversas partes que compõem o
microcontrolador.

8
Professor Sérgio Minas Melconian.

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.

9
Professor Sérgio Minas Melconian.

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.

10
Professor Sérgio Minas Melconian.

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.

11
Professor Sérgio Minas Melconian.

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.

12
Professor Sérgio Minas Melconian.

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 a memó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.

13
Professor Sérgio Minas Melconian.

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

14
Professor Sérgio Minas Melconian.

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.
Decrementa f, guardando o resultado em d e pula a próxima linha
DECFSZ f,d se o resultado for zero.
INCF f,d Incrementa f, guardando o resultado em d.
Incrementa f, guardando o resultado em d e pula a próxima linha se
INCFSZ f,d 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.
Executa uma inversão entre as partes alta e baixa de f, guardando
SWAPF f,d em d.
XORWF f,d Lógica "ou exclusivo" entre k e W guardando o resultado em d.

15
Professor Sérgio Minas Melconian.

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.

16
Professor Sérgio Minas Melconian.

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

17
Professor Sérgio Minas Melconian.

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

SIM BOTÃO NÃO


ACENDE O LED PRESSIONADO? APAGA O LED

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.

18
Professor Sérgio Minas Melconian.

;**************************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

19
Professor Sérgio Minas Melconian.

;*************************************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.

20
Professor Sérgio Minas Melconian.

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

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

21
Professor Sérgio Minas Melconian.

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 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 PORTB ;LIMPA TODO PORTB

22
Professor Sérgio Minas Melconian.

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

23
Professor Sérgio Minas Melconian.

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.

24
Professor Sérgio Minas Melconian.

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


25
Professor Sérgio Minas Melconian.

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?)

26
Professor Sérgio Minas Melconian.

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).

27
Professor Sérgio Minas Melconian.

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

Fluxograma

INICIO

CONFIGURAÇÕES
INICIAIS

LIMPA
REGISTRADOR
STATUS,C

ROTACIONAR O BIT
(3X)

LIMPA LED
(PORTB)

28
Professor Sérgio Minas Melconian.

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


29
Professor Sérgio Minas Melconian.

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

30
Professor Sérgio Minas Melconian.

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.

31
Professor Sérgio Minas Melconian.

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

32
Professor Sérgio Minas Melconian.

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.

33
Professor Sérgio Minas Melconian.

;*************************************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

34
Professor Sérgio Minas Melconian.

;*************************************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

35
Professor Sérgio Minas Melconian.

;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)

36
Professor Sérgio Minas Melconian.

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.

37
Professor Sérgio Minas Melconian.

Esquema Elétrico da Placa de Teste

38
Professor Sérgio Minas Melconian.

Lay-out Placa de Teste

Observação: Adicione dois JUMPERS conforme representados em vermelho.

39
Professor Sérgio Minas Melconian.

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/

40

Você também pode gostar