Escolar Documentos
Profissional Documentos
Cultura Documentos
MICROCONTROLADOR
PIC16F877A
FUNDAMENTOS
E
PROGRAMAÇÃO BÁSICA
1
Professor Sérgio Minas Melconian.
Introdução
2
Professor Sérgio Minas Melconian.
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).
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.
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;
• 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;
• 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.
5
Professor Sérgio Minas Melconian.
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:
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.
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.
7
Professor Sérgio Minas Melconian.
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.
De maneira simplificada pode-se utilizar como cálculo de ciclo de máquina a seguinte equação:
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:
9
Professor Sérgio Minas Melconian.
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.
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.
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.
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.
• 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
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;
15
Professor Sérgio Minas Melconian.
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.
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.
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
O Programa
;*************************************************************************************
;* PROGRAMA LIGA LED POR MEIO DE UM BOTÃO *
;*************************************************************************************
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
18
Professor Sérgio Minas Melconian.
;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*************************************
;*****************************************FLAGS***************************************
;***************************************CONSTANTES************************************
; FILTRO PARA EVITAR RUIDOS DOS BOTÕES. "NÃO SERÁ UTILIZADO NESTE PROGRAMA".
;****************************************ENTRADAS*************************************
;*****************************************SAÍDAS**************************************
;*************************************VETOR DE RESET**********************************
;***********************************INICIO DA INTERRUPÇÃO*****************************
19
Professor Sérgio Minas Melconian.
;*************************************INICIO DO PROGRAMA******************************
INICIO
MOVLW B'00000001'
MOVWF TRISB ;DEFINE RB0 COMO ENTRADA E DEMAIS PORTS B COMO SAÍDA (1 ->
;ENTRADA, 0 -> SAÍDA).
;*************************************ROTINA PRINCIPAL********************************
MAIN
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
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.
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
ACENDE O LED
SIM
APAGA O LED
21
Professor Sérgio Minas Melconian.
O Programa
;****************************************************************************************************
;* PROGRAMA CONTADOR DE TEMPO (DELAY) *
;****************************************************************************************************
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
INICIO
22
Professor Sérgio Minas Melconian.
MOVLW B'00000001'
MOVWF TRISB ;CONFIGURA PORTB,0 COMO ENTRADA E DEMAIS PINOS COMO SAÍDA.
MAIN
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)
MOVLW .4
MOVWF TEMPO3 ;TEMPORIZA 1s
DL3
MOVLW .250
MOVWF TEMPO2 ;TEMPORIZA 1/4s = 0.25s
DL2
MOVLW .250
MOVWF TEMPO1 ;TEMPORIZA 1ms
DL1
23
Professor Sérgio Minas Melconian.
Exercícios Propostos
24
Professor Sérgio Minas Melconian.
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 *
;****************************************************************************************************
__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
INICIO
MOVLW B'00000000'
MOVWF TRISA ;CONFIGURA TODO PORTA COMO SAÍDA.
;**************************************ROTINA DE DELAY********************************
26
Professor Sérgio Minas Melconian.
Exercícios Propostos
27
Professor Sérgio Minas Melconian.
Neste quarto exemplo será estudada uma rotina para rotação de bit.
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 *
;*********************************************************************************************
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;***************************************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.
;*****************************************SAÍDAS**************************************
;*************************************VETOR DE RESET**********************************
;***********************************INICIO DA INTERRUPÇÃO*****************************
;*************************************INICIO DO PROGRAMA******************************
INICIO
MOVLW B'00000000'
MOVWF TRISB ;DEFINE PORTS B COMO SAÍDA (1 -> ENTRADA, 0 -> SAÍDA).
;*************************************ROTINA PRINCIPAL********************************
MAIN
;**************************************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
30
Professor Sérgio Minas Melconian.
;**************************************FIM DO PROGRAMA********************************
Exercícios Propostos
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.
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 *
;*************************************************************************************
__CONFIG _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;***************************************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.
;*****************************************FLAGS***************************************
; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA.
;***************************************CONSTANTES************************************
; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
;****************************************ENTRADAS*************************************
;*****************************************SAÍDAS**************************************
33
Professor Sérgio Minas Melconian.
;*************************************VETOR DE RESET**********************************
;***********************************INICIO DA INTERRUPÇÃO*****************************
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"
34
Professor Sérgio Minas Melconian.
;*************************************INICIO DO PROGRAMA******************************
INICIO
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
;*************************************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
ATUALIZA
CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO DISPLAY
;**************************************FIM DO PROGRAMA********************************
36
Professor Sérgio Minas Melconian.
Exercícios Propostos
37
Professor Sérgio Minas Melconian.
38
Professor Sérgio Minas Melconian.
39
Professor Sérgio Minas Melconian.
Referências
• Datasheet PIC16F877A.
• http://www.labtools.com.br/
40