Você está na página 1de 12

DISCIPLINA: SISTEMAS MICROPROCESSADOS - SEMESTRE 2022 - II

INTRODUÇÃO AO ASSEMBLY
EGOAVIL, J. Ciro1 , SANTOS, B. Thalysson 2
1
Professor do Curso de Engenharia Elétrica, Fundação Universidade Federal de Rondônia, Porto Velho, Rondônia, Brasil (e-mail: ciro.egoavil@unir.br)
2
Acadêmico do Curso de Engenharia Elétrica, Fundação Universidade Federal de Rondônia, Porto Velho, Rondônia, Brasil (email: thalysson.eletrica@gmail.com)

RESUMO Microcontroladores são largamente empregados na indústria, desde as aplicações mais


básicas como o controle de eletrodomésticos, até sistemas altamente sensíveis como mecanismos de
segurança automotiva. O presente roteiro laboratorial introduz as configurações iniciais da plataforma de
desenvolvimento MPLAB, focado na criação de um projeto em linguagem Assembly para a gravação em
um microcontrolador PIC. O programa gerado na IDE é então executado no emulador PICSimLab para
demonstrar o funcionamento das funções implementadas no código fonte.

PALAVRAS CHAVE Microcontroladores, PIC, Assembly, MPLAB, IDE.

I. INTRODUÇÃO sequências de outras instruções são categorizadas como


tarefa de atribuir ao computador a realização de um linguagens de alto nível (figura 1).
A trabalho passa pela necessidade de se criar uma lista
de instruções que possa ser entendida pelo computador e
implique na geração de uma resposta ou resultado desejado.
Essa sequência de instruções passada ao computador pode
ser compreendida como um algoritmo computacional, que
deve ser corretamente entendido e executado pela máquina,
e provocar uma determinada resposta de acordo com a lógica
implementada no programa. Um algoritmo computacional
pode ser informalmente definido como:
[...] um procedimento computacional bem definido
que toma algum valor ou conjunto de valores
como entrada, e produz algum valor ou conjunto
de valores como saída [2].
No entanto, assim como os humanos, os computadores
não reconhecem uma sequência qualquer de caracteres ou
símbolos como uma ideia ou instrução. Máquinas computa- Figura 1: Hierarquia das linguagens de programação [4].
cionais estão aptas à operar em seu próprio "idioma", cujas
mensagens são formadas apenas de sequências de números A linguagem de programação Assembly é uma linguagem
binários, que fisicamente são manipulados na forma de de baixo nível, portanto permite que o usuário construa
sinais elétricos que variam entre os níveis lógicos alto e códigos fonte em linguagem de máquina de uma forma
baixo (comumente 5V e 0V respectivamente) [1]. um pouco mais fácil, já que os comandos em hexadecimal
Uma vez que um algoritmo robusto em linguagem de passados ao computador são substituídos por mnemônicos
máquina é praticamente ininteligível aos humanos, são cri- e palavras em inglês, que são mais facilmente memoráveis.
adas linguagens de programação que permitem a utilização No entanto, justamente por ser uma linguagem de progra-
de palavras durante a elaboração de um código fonte, que mação de baixo nível, suas instruções e comandos lidam
são transcritas posteriormente para a linguagem de máquina, diretamente com as funções de hardware, o que assegura
o que exime o programador do encargo de lidar com a uma grande robustez e consistência dos programas escritos
complexidade intrínseca à tal linguagem. As linguagens que nessa linguagem [2].
mais se aproximam da linguagem de máquina, ou seja, Neste trabalho será proposta a elaboração de dois progra-
cujos comandos são transcritos quase diretamente à ela, mas simples em linguagem Assembly para implementação
são chamadas de linguagens de baixo nível. Enquanto que no PIC16F877A. Como alternativa à implementação real
as linguagens que usam transcrições complexas em várias no microcontrolador físico, o emulador PICSimLab será
camadas, que possuem instruções que executam grandes adotado para simular a placa de desenvolvimento McLab2.

Roteiro 01, 2023 1


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

A. OBJETIVOS A seguir, na caixa Device digite ou selecione


1) Objetivo Geral PIC16F877A que é o microcontrolador que será utilizado
O objetivo principal do trabalho é apresentar e provocar no projeto e clique em Next, conforme a figura 4.
a familiarização ao ambiente de programação MPLAB,
de modo a mostrar sua utilização na criação, compilação
e gravação de programas para microcontroladores PIC e
emular a execução em tempo real através da plataforma
PICSimLab.

2) Objetivos Específicos
• Criar um projeto no ambiente MPLAB X;
• Configurar o projeto para a gravação no PIC;
• Emular o programa na plataforma PICSimLab.

B. MATERIAIS UTILIZADOS
• Software MPLAB X IDE v5.35;
• Software PICSimLab.
Figura 4: Seleção do Microcontrolador [4].
II. CRIAÇÃO DE UM PROJETO NO MPLAB X
Após realizada a instalação do MPLAB X e do emulador Neste passo, a ferramenta de programação deve ser sele-
PICSimLab, execute o software e aguarde a inicialização cionada. Selecione Simulator e clique em Next conforme
de todos os módulos e sistemas. Uma tela parecida com a a figura 5.
figura 2 será apresentada ao final da inicialização.

Figura 2: Tela inicial do MPLAB [4].

Para iniciar a programação no MPLAB, existe a neces- Figura 5: Seleção do simulador [4].
sidade de se criar um Projeto, onde estarão anexados os
arquivos fontes e todas as informações relativas ao projeto. No próximo passo, selecione o compilador mpasm e
Para criá-lo no MPLAB, clique no menu File → New clique em Next conforme a figura 6.
Project. Na caixa de diálogo que surgirá a seguir (Figura
3), selecione Stand Alone e clique em Next.

Figura 3: Definições do projeto [4]. Figura 6: Seleção do compilador [4].

2 Roteiro 01, 2023


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

No último passo, nomeie o projeto, em seguida selecione


o diretório onde será salvo e clique em Finish, conforme a
figura 7.

Figura 9: Propriedades do arquivo principal [4].

Primeiramente, os bits de configuração do microcontro-


lador devem ser definidos. No menu superior clique em
Production → Set Configuration Bits, como mostra a
figura 10. Configure a coluna Option como mostrado na
Figura 7: Seleção do nome e diretório [4].

III. EXEMPLO 1
Como exemplo, propõe-se a implementação de um pro-
grama em Assembly que acione um LED conectado à porta
RB1 sempre que um botão conectado à porta RB0 seja
acionado. O código completo que realiza esta função é
apresentado no apêndice A, e explicado linha à linha nesta
seção. Figura 10: Configuração dos bits do programa [4].

A. ARQUIVO FONTE figura 11 e clique em Generate Source Code to Output.


No menu esquerdo, clique com o botão direito do mouse Copie o código gerado e cole-o no início do código fonte,
em Source Files (figura 8), em seguida em New, e clique
em newpic_8b_general.asm.

Figura 11: Configuração dos bits do programa [4].

como mostrado na figura 12.

Figura 8: Criação do arquivo principal [4].

Dê um nome para o arquivo e clique em Finish, como


na figura 9. Um arquivo principal é gerado e aberto, que
mostra um código fonte de exemplo. Apague-o para criar
um novo programa.
Figura 12: Configuração dos bits do programa [4].

Roteiro 01, 2023 3


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

B. BANCOS DE MEMÓRIA Neste trabalho são usados os bits 0 e 1 da porta PORTB,


O microcontrolador utilizado neste trabalho possui quatro que podem ser declarados como RB0 e RB1. Com o mesmo
bancos de memória, dentro dos quais estão dispostos todos objetivo de facilitar a declaração dessa porta no decorrer do
os registradores, funções e espaços de memória disponíveis. código, os comandos botao e led são definidos no script
A figura 23 do Apêndice C mostra a organização dos 2 a seguir.
quatro bancos de memória bem como o endereço de 1 #define botao PORTB,RB0
memória de cada registrador e função. 2 #define led PORTB,RB1
Os endereços 03h, 83h, 103h e 183h são ocupados
Script 2: Comandos para as portas de entrada e saída.
pelo registrador STATUS, que possibilita que o programa
alterne entre os bancos. Este registrador está disposto da
maneira como mostra a figura 13, sendo que os bits RP1 e D. VETOR DE RESET
RP0 determinam em qual dos quatro bancos o programa é É necessário indicar o endereço de memória do micro-
executado. controlador onde o programa será iniciado, e então apontar
É imediato que, uma vez iniciado no banco 00, o em que parte do código o programa deve começar. Para isso,
o script 3 usa a instrução ORG (origem) para designar o
endereço 00h como posição de origem do programa. Em
seguida a instrução goto (Vá para) é usada com a label
inicio como argumento, o que indica que as instruções
contidas nesta parte do programa devem ser executadas.
Figura 13: Composição do registrador STATUS [1].
1 org H'00'
2 goto inicio
programa necessita alterar apenas o bit RP0 para navegar
entre os bancos 00 e 01. Como o programa implementado Script 3: Vetor de Reset.
neste trabalho utiliza apenas os registradores e endereços
destes dois bancos, as instruções para alternar entre os
bancos se resumem em escrever 1 ou 0 no bit RP0 do E. CONFIGURAÇÕES INICIAIS
registrador STATUS. Para isso são usadas as instruções BCF Uma rotina deve ser criada para estabelecer as configura-
e BSF para limpar e escrever valor o 1 respectivamente. ções iniciais do microcontrolador. Neste trabalho essa rotina
Para facilitar a navegação entre os dois bancos, dois foi chamada de inicio, e contém a definição dos modos
comandos podem ser criados no cabeçalho do programa, de de operação das portas utilizadas, sendo que RB0 é entrada
modo a definir que, quando as palavras bank0 e bank1 fo- e RB1 uma porta de saída.
rem declaradas os respectivos bancos devem ser escolhidos De acordo com o mapa de memória do apêndice C, o
através dos comandos do script 1. registrador TRIS está no banco 1 do microcontrolador, e por
isso, como mostra o script 4, o banco 1 é selecionado e em
1 #define bank0 bcf STATUS,RP0 ;RP0 = 0
seguida o número binário 00000001 é gravado no registrador
2 #define bank1 bsf STATUS,RP0 ;RP0 = 1
TRISB para indicar que apenas o bit 0 da porta PORTB será
Script 1: Comandos para alternar entre os bancos. usado como entrada. Em seguida o banco 0 é selecionado,
e então o valor binário 00000000 é gravado no registrador
PORTB, para levar à zero todas os bits da porta utilizada.
C. PORTAS I/O
Conforme a folha de dados do fabricante [3], o 1 inicio
PIC16F877A possui cinco portas de entrada e saída que po- 2 bank1
3 movlw H'01' ;ou B'00000001'
dem ser configuradas para diferentes propósitos, sendo que
4 movwf TRISB
a porta PORTB foi escolhida para utilização neste trabalho.
5 bank0
Esta porta possui 8 bits que podem ser configurados para 6 movlw H'00' ;ou B'00000000'
saída ou para entrada de informações. A figura 14 mostra a 7 movwf PORTB
disposição dos bits desta porta.
Script 4: Rotina "inicio".

F. LAÇO INFINITO
Definidas as configurações iniciais, uma rotina de repeti-
ção deve ser iniciada para fazer com que o microcontrola-
dor sempre execute determinadas tarefas. Neste trabalho o
Figura 14: Composição da porta PORTB [1]. programa deve verificar se o botão conectado à porta RB0
foi acionado, e acender ou apagar o LED de acordo com o
estado do botão.
4 Roteiro 01, 2023
Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

Como mostra o script 5, a instrução BTFSC verifica se o IV. SIMULAÇÃO DO PROGRAMA NO PICSIMLAB
botão foi acionado, e em caso negativo a rotina apaga_led é Inicialize o PICSimlab e defina a placa à ser utilizada
chamada e grava o valor 0 na saída correspondente ao LED, através do menu superior. Clique em Board → McLab2
e se o botão for pressionado a instrução chamada na linha 3 como na figura 17.
é ignorada e a instrução BSF da linha 4 grava o valor 1 na
saída do LED. Ao final da rotina a instrução GOTO indica
que o laço infinito deve ser reiniciado.
1 loop
2 btfsc botao
3 goto apaga_led
4 bsf led
5 goto loop
6

7 apaga_led
8 bcf led
9 goto loop
10 end
Script 5: Laço infinito.

Figura 17: Seleção da placa no emulador [4].


G. GERAR ARQUIVOS DO PROJETO
No menu superior clique em Production → Build Main
Após selecionar a placa McLab2, para definir o micro-
Project, como na figura 15, para compilar o programa e
controlador utilizado clique em Microcontroller no menu
gerar os arquivos do projeto.
superior e depois em PIC16F877A, como mostra a figura
18.

Figura 15: Compilação do programa [4].

Se não houver nenhum erro a mensagem da figura 16 será Figura 18: Seleção do microcontrolador no emulador [4].
exibida, e agora o arquivo está pronto para ser gravado no
microcontrolador. Depois, para definir o clock do microcontrolador, clique
no menu suspenso à esquerda, como mostra a figura 19, e
escolha o valor 4.

Figura 16: Mensagem de sucesso na compilação [4].

Existem várias ferramentas possíveis para realizar a gra-


vação do programa desenvolvido no microcontrolador, como
o PICkit3. Para o propósito deste trabalho o programa será Figura 19: Seleção do clock no emulador [4].
implementado no emulador PICSimLab.
Roteiro 01, 2023 5
Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

Por último, o arquivo compilado para o microcontrolador O código mostrado no script 6 mostra essa sequência
deve ser carregado no PICSimLab. Clique no menu superior de instruções, sendo as linhas 3 e 5 responsáveis por
em File → Load Hex (figura 20). chamar uma rotina que faz o microcontrolador aguardar 500
milissegundos, explicada adiante.
1 loop
2 bsf PORTB,RB0
3 call delay500ms
4 bcf PORTB,RB0
5 call delay500ms
6 goto loop
Script 6: Laço infinito para o exemplo 2.

B. ROTINAS DE DELAY
Além de definir os mnemônicos para acessar as portas
e para alternar entre os bancos de memória, também é
necessário definir no cabeçalho os registradores de uso geral
para contar os ciclos de funcionamento do microcontrolador,
Figura 20: Carregamento do arquivo hexadecimal [4]. uma vez que o programa deste exemplo atua em função
de tempos decorridos. O script 7 define dois registradores
Navegue até o diretório raíz do projeto, e na pasta nos endereços de memória 0x20 e 0x21 para armazenar a
dist → default → production selecione e abra o arquivo contagem dos ciclos.
com extensão hex como mostrado na figura 21, e então o 1 #define temp1 H'20'
programa será executado no emulador PICSimLab. 2 #define temp2 H'21'
Script 7: Registradores de uso geral.

Para que o microcontrolador sempre aguarde 500 milis-


segundos antes de alterar o estado do LED, é necessário
fazê-lo contar seus ciclos de trabalho de maneira que, ao
alcançar uma determinada quantidade de ciclos decorridos,
as instruções para ligar ou desligar o LED sejam executadas.
Dentre as várias formas de se contar ciclos de trabalho,
uma delas é apresentada no script 8 a seguir.
1 delay500ms
2 movlw D'200'
3 movwf temp1
4

Figura 21: Carregamento do arquivo hexadecimal [4]. 5 delay_aux1


6 movlw D'250'
7 movwf temp2
8
V. EXEMPLO 2
9 delay_aux2
Propõe-se a elaboração de um segundo programa que faça
10 nop ;______________________
piscar o LED conectado à porta RB0, com intervalos fixos 11 nop ;
de 500 milissegundos entre as mudanças de estado. Para 12 nop ;
isso implemente o código fonte mostrado no Apêndice B 13 nop ; Contagem regressiva
em um novo projeto. Para isso repita os passos das seções 14 nop ; do registrador temp2
II a III-B. 15 nop ; 10 x 250 -> 2500 ciclos
16 nop ;
A. LAÇO INFINITO 17 decfsz temp2 ;
18 goto delay_aux2 ;______________________
O programa desta seção se propõe a fazer um LED
19 decfsz temp1 ; Rpte a contagem de temp2
acender de forma intermitente, com intervalos fixos de
20 goto delay_aux1 ; 200x -> 500000 ciclos
tempo. Para que isso ocorra, o código implementado precisa 21 return
atribuir valor 1 à porta RB0, aguardar um intervalo de 22 end
tempo, e então alterar o valor da porta para 0 e aguardar mais
Script 8: Rotinas para um delay de 500ms.
um intervalo de tempo e repetir a sequência indefinidamente.
6 Roteiro 01, 2023
Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

Sempre que a rotina delay500ms é chamada em al-


guma parte do programa, o valor decimal 200 é gravado
no registrador temp1 (linhas 2 e 3), e automaticamente a
rotina delay_aux1 é iniciada, e o valor decimal 250 é
gravado no registrador temp2 (linhas 6 e 7).
Após isso a rotina delay_aux2 se inicia e conta um
ciclo de máquina a cada instrução nop declarada. Em
seguida, na linha 17 a instrução decfsz decresce uma
unidade do valor de temp2, e então a instrução goto
faz o programa reiniciar a rotina delay_aux2, que até
aqui consumiu 10 ciclos de máquina. Quando o valor do
registrador temp2 chegar a zero terão decorridos, portanto,
2500 ciclos de máquina.
Quando isso ocorrer a linha 18 será ignorada e a instrução
decfsz na linha 19 fará decrescer o valor do registrador
temp1 em uma unidade. Com isso, a instrução goto na li-
nha 20 faz a rotina delay_aux1 ser executada novamente,
e faz iniciar mais uma etapa de 2500 ciclos, que se repete
até temp1 chegar ao valor zero.
Portanto, com o registrador temp1 configurado inicial-
mente em 200, e temp2 configurado em 250, nota-se que
o processo completo de execução do script 8 leva cerca
de 2500 × 200 = 500000 ciclos de máquina, o que
equivale à aproximadamente 500 milissegundos para um
microcontrolador que usa um cristal oscilador de 4MHz.
A figura 22 apresenta um fluxograma que descreve o
comportamento o programa enquanto executa a função de
delay mostrada no script 8.

VI. ATIVIDADES EXPERIMENTAIS


1) Implemente o programa do Exemplo 1 (Anexo A)
e faça um segundo LED na porta RB2 acender de
forma complementar ao primeiro LED na porta RB1,
de acordo com o botão na porta RB0, conforme a
tabela 1 abaixo.
Tabela 1: Tabela-verdade para o exercício 1. Figura 22: Fluxograma da função delay500ms do script 8 [4].

Botão LED 1 LED 2


0 0 1 Referências
1 1 0 [1] Microchip Technology, AZ, USA. MPLAB X IDE User’s
Guide. (2022). Acessado: 20 de Fevereiro de 2023. Disponível:
https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide#
2) Faça um programa que acione um LED quando um [2] Hyde, Randall. The Art of Assembly Language. 2ed, No Starch
Press, 2010.
botão for pressionado, e o mantenha aceso até que [3] Microchip Technology, AZ, USA. PIC16F877A Datasheet.
o botão seja pressionado novamente (Latch-Mode). (2013). Acessado: 20 de Fevereiro de 2023. Disponível:
Dica: Utilize uma rotina de Delay para evitar o efeito https://www.microchip.com/en-us/product/PIC16F876A
[4] Autoria própria.
Bouncing.
Observação: Os códigos implementados devem ser entre-
gues organizados e comentados.

Roteiro 01, 2023 7


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

CIRO J. EGOAVIL Possui graduação em Enge-


nharia Eletrônica - Universidad Nacional Mayor
de San Marcos - UNMSM, Lima, Peru (1992),
mestrado em Engenharia Elétrica pela Universi-
dade Federal de Santa Catarina - UFSC, Florianó-
polis, SC (1998) e doutorado pela Universidade
Federal de Santa Maria - UFSM, RS (2018).
Atualmente é professor Adjunto do curso de
Engenharia Elétrica da Universidade Federal de
Rondônia. Tem experiência na área de Engenharia
Biomédica, com ênfase Processamento digital de sinais. Atuando principal-
mente nos seguintes temas: Sistemas Embarcados; Eficiência Energética;
Geração de Energia Fotovoltáica; Monitoração e Controle de Processos
Industriais e; Modelagem de Sistemas de Elétricos de Potência.

THALYSSON B. DOS SANTOS Nascido na ci-


dade de Ibirité, Minas Gerais, possui formação de
nível médio pela Escola Estadual Pedro Vieira de
Melo, na cidade de Jaru, Rondônia. Atualmente
graduando do curso de Engenharia Elétrica pela
Fundação Universidade Federal de Rondônia -
UNIR, campus de Porto Velho.

8 Roteiro 01, 2023


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

APÊNDICE A - CÓDIGO FONTE DO EXEMPLO 1


1 ; --- Arquivos incluidos no projeto ---
2 #include <p16f877a.inc> ; Inclui o arquivo do microcontrolador
3

4 ; CONFIG
5 ; __config 0x3F3A
6 __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
7

8 ; --- Paginacao de memoria ---


9 #define bank0 bcf STATUS,RP0 ; Cria mnemonico para o banco 0 de memoria
10 #define bank1 bsf STATUS,RP0 ; Cria mnemonico para o banco 1 de memoria
11

12 ; --- Entradas ---


13 #define botao PORTB,RB0 ; Botao 1 ligado em RB0
14

15 ; --- Saidas ---


16 #define led PORTB,RB1 ; LED 1 ligado em RB1
17

18 ; --- Vetor de RESET ---


19 org H'00' ; Origem no endereco 0000h de memoria
20 goto inicio ; Desvia do vetor de interrupcao
21

22

23 ; --- Programa principal ---


24 inicio
25 bank1 ; Seleciona Banco 1
26 movlw H'01' ; W = 0b00000001 (ou 0x01)
27 movwf TRISB ; Passa W para o registrador TRISB
28 bank0 ; Seleciona o banco 0 de memoria
29 movlw H'00' ; W = 0b00000000 (ou 0x00)
30 movwf PORTB ; Passa W para o registrador PORTB
31

32 loop
33 btfsc botao ; Se o botao for pressionado pula a linha.
34 goto apaga_led ; Vai para a rotina que apaga o LED
35 bsf led ; Liga LED
36 goto loop ; Retorna para a label loop
37

38 apaga_led
39 bcf led ; Apaga o LED
40 goto loop ; Retorna para a label loop
41

42 end ; Fim do programa

Script 9: Código fonte do exemplo 1.

Roteiro 01, 2023 9


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

APÊNDICE B - CÓDIGO FONTE DO EXEMPLO 2


1 ; --- Arquivos i n c l u d o s no projeto ---
2 #include <p16f877a.inc> ; Inclui o arquivo do microcontrolador
3 ; CONFIG
4 ; __config 0x3F3A
5 __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
6 ; --- P a g i n a o de m e m r i a ---
7 #define bank0 bcf STATUS,RP0 ; Cria mnemonico para o banco 0 de memoria
8 #define bank1 bsf STATUS,RP0 ; Cria mnemonico para o banco 1 de memoria
9 ; --- Registradores de uso geral ---
10 #define temp1 H'20'
11 #define temp2 H'21'
12 ; --- Saidas ---
13 #define led PORTB,RB0 ; LED 1 no RB1
14 ; --- Vetor de RESET ---
15 org H'00' ; Origem no e n d e r e o 0000h de memoria
16 goto inicio ; Desvia do vetor de interrupcao
17

18 inicio
19 bank1 ; Seleciona Banco 1
20 movlw H'00' ; W = 0b00000000 (ou 0x00)
21 movwf TRISB ; Passa W para o registrador TRISB
22 bank0 ; Seleciona o banco 0 de memoria
23

24 loop
25 bsf PORTB,RB0 ; Liga o LED
26 call delay500ms
27 bcf PORTB,RB0 ; Desliga o LED
28 call delay500ms
29 goto loop
30

31 delay500ms
32 movlw D'200'
33 movwf temp1 ; Armazena o valor 200
34

35 delay_aux1
36 movlw D'250'
37 movwf temp2 ; Armazena o valor 250
38

39 delay_aux2
40 nop ; Gasta 1 ciclo de maquina
41 nop
42 nop
43 nop
44 nop
45 nop
46 nop
47 decfsz temp2 ; Decrementa temp2 e testa se e igual a zero
48 goto delay_aux2 ; Total de 2500 ciclos
49 decfsz temp1 ; Decrementa temp1 e testa se e igual a zero
50 goto delay_aux1 ; Ao final 500000 ciclos
51 return
52

53 end

Script 10: Código fonte do exemplo 2.

10 Roteiro 01, 2023


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

APÊNDICE C - MAPA DA MEMÓRIA DO PIC16F877A

Figura 23: Mapa da memória do PIC16F877A [3].

Roteiro 01, 2023 11


Campus José Ribeiro Filho - Porto Velho, 04 de Março de 2023

APÊNDICE D - INSTRUÇÕES DO PIC16F877A

Figura 24: Instruções para o PIC16F877A [3].

12 Roteiro 01, 2023

Você também pode gostar