Há varias linguagens que podem ser utilizadas para programar os microcontroladores PIC. mas estou conhecendo o Assembly, dizem ser muito dificil mas, até agora não encontrei nenhuma dificuldade. Primeiro lembro que a idéia não é ensinar programação, os conceito básicos de lógica de progamação já devem ser conhecidos, claro que não precisa ser o bam bam bam afinal os mais experientes provavelmente irão fazer comentários corrigindo-me em algumas situações pois definitivamente eu não sou programador sou Técnico em Edificações e Eletrotécnico.
Dando andamento irei partir direto para programação linha a linha e explicando o que é e para que serve tudo que for necessário para o aprendizado. Para me acompanhar abra o bloco de notas e salve um arquivo como led16f628a.asm, não esqueça de na caixa tipo de arquivo escolher a opção "todos os arquivos".
Primeiras linhas.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; led16f628a
; VERSÃO: 1.0 DATA: 29/12/2041
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DESCRIÇÃO DO ARQUIVO
;-----------------------------------------------------------------
; O LED ACENDERA AO PRESSIONAR O BOTÃO 1
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ARQUIVOS DE DEFINIÇÕES
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628A
__CONFIG _WDT_OFF & _INTRC_OSC_CLKOUT & _MCLRE_ON & _LVP_OFF & _BOREN_OFF & _PWRTE_OFF & _DATA_CP_OFF & _CP_OFF
__CONFIG _WDT_OFF & _INTRC_OSC_CLKOUT & _MCLRE_ON & _LVP_OFF & _BOREN_OFF & _PWRTE_OFF & _DATA_CP_OFF & _CP_OFF
;***************************************************
Todos esses asteriscos não são obrigatórios os mesmos servem apenas para facilitar a leitura do programa separando as varias partes dos mesmo, se você não gostar deles pode usar qualquer outro caractere ou mesmo não usar mas, isso pode deixar seu programa incompreensível
Note que no início de cada linha que possui os asteriscos há um " ; " o mesmo serve para iniciar um comentário, ou seja após o " ; " tudo que é escrito não faz parte do programa e não será lido pelo compilador assim, você pode observar que também usei o " ; " para fazer meus comentários tipo, coloquei no inicio do programa o nome do arquivo , versão, data e descrição do arquivo.
Note ARQUIVOS E DEFINIÇÕES é nesta parte do programa que começamos a programar veja que o que vem depois não está após " ; ". então para que serve esta área do programa?
é neste local que inserimos os includes. arquivos que serão também lidos pelo compilador, neste caso estamos incluindo o arquivo P16F628A.INC, é obrigatoria a inclusão deste arquivo em todos os programas feito para o microcontrolador Pic 16F628A. (se o microcontrolador fosse o PIC16f84 o nome do arquivo a ser incluído seria P16f84.INC e assim sucessivamente) Porque? Este é o aquivo de definições o qual define nome para diversas parte da memória na realidade ele cria as constante em que vamos trabalhar. Por exemplo, já falei que o "Porta" na realidade é o nome que damos a um espaço físico especifico ocupado na memória, poderiamos chamar este espaço por qualquer nome com exemplo Grupoa, ladoa, e etc... mas para evitar que isto vire bagunça a microchip fez esses arquivos onde ela informa para o compilador como será chamadas partes especificas da memória. Como exemplo o "Porta" se refere a memória 05h. imagine se todas as vezes que você fosse usar o "Porta" tivesse que ao invés de escrever "Porta" escrever 05h, ou pra o registrador STATUS que vamos ver mais a frente teríamos que escrever 03h. Para evitar essa confusão de números e evitar que cada programador chame esses registradores pelo nome que quiser temos o arquivo de definições P16F628A.INC que dar nomes padronizados para estes espaços na memória.
Já os códigos logo abaixo são algumas configurações que fazemos no momento da gravação do programa no PIC. Não temos como alterá-las durante a execução do programa. entre essas configurações está a _INTRC_OSC_CLKOUT que informa para o PIC que ele irá trabalhar com o oscilador interno. falaremos destas configurações na hora de gravar o PIC.
Já os códigos logo abaixo são algumas configurações que fazemos no momento da gravação do programa no PIC. Não temos como alterá-las durante a execução do programa. entre essas configurações está a _INTRC_OSC_CLKOUT que informa para o PIC que ele irá trabalhar com o oscilador interno. falaremos destas configurações na hora de gravar o PIC.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; PAGINAÇÃO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
A próxima parte do programa é definir como será realizada a PAGINAÇÃO DE MEMÓRIA, aqui aprenderemos como a memória está separada e a fazer a nossa primeira constante.
Poderia ficar falando um monte de coisas sobre memória mas o que precisamos realmente saber agora e que a memória é dividida em 4 partes chamadas de Bank 0 ,Bank 1 e assim sucessivamente , e para trabalharmos em cada uma dessas parte devemos entrar de uma em uma conforme a necessidade. No exemplo acima estamos criando 2 constantes uma para entrar no que Bank 0 e outra para entrar no Bank 1.
Veja (#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA) o texto entre parenteses está fazendo o seguinte
#DEFINE - sintaxe responsável por dar nome a constante neste caso Bank0 o restante é o conteúdo que vai estar dentro desta constante que neste caso é BCF STATUS,RP0 - isto faz o seguinte:
BCF limpa, Zera no registrador " Status " o bit RP0, e quando você faz isso você entra no Bank0. para entender melhor vou falar dos registradores.
Registradores
Registradores são espaços físicos definidos na memória do microcontrolador que armazenam dados de configuração e outros necessário ao funcionamento do processador. por exemplo:
Porta - registrador que armazena o estado dos pinos do microcontrolador. como já disse antes se o registrador Porta estiver com todos os seus bits em nivel alto (11111111) quer dizer que todos os pinos do Porta estão com tensão encima deles seja ela entrando ou saindo.
Trisa - é este o registrador que armazena o valor que vai definir se o pinos do Porta serão entradas ou saídas se Trisa estiver com todos os seus bits em nivel alto (11111111)quer dizer que todas os pinos do Porta só podem receber tensão de entrada. Ou seja assim não posso mandar o microcontrolador enviar tensão por um dos pinos sem antes alterar a configuração em Trisa para que este pino seja configurado com entrada.
Status - O registrador status é responsável por diversas configurações como podemos ver no datasheet do microcontrolador Pic 16F628A
Note na figura acima que o registrador Status possui 8 bits, cada bit possui um nome, o bit de numero 0 por exemplo chama-se " C " o bit 2 " DC " o bit 3 " Z " e assim sucessivamente o bit de nosso interesse agora é o 5 chamado de " RP0" note a baixo que há uma descrição para o que esse bit faz, mas ele está em conjunto com o Bit 6 " RP1" na minha tradução tosca alí diz . "Bit registrador de seleção de bank" ou seja este bit é que registra qual parte da memória eu quero usar, no nosso caso iremos trabalhar apenas com o Bank0 e Bank1, assim basta alterar o bit 5 (RP0) que na descrição nos mostra que se bit 5 (RP0 ) estiver em 0 estaremos trabalhando no Bank0, se bit 5 (RP0 ) estiver em 1 estaremos trabalhando no Bank1.
Voltando onde estavamos o BCF limpa Zera o bit RP0 no Registrador STATUS e quando você faz isso você entra no Bank0.
Em seguida é feito a mesma coisa (#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMÓRIA) você cria a constante BANK1 só que ao invés de limpar com o BCF você usa BSF que seta 1 no registrador STATUS no Bit RP0. que faz com que o processador coloque sua atenção no bank1
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; VARIÁVEIS
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA
CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO
variavel_1 ; esta variavel é apena exemplo não serve para nada no programa que vamos criar.
variavel-2 ; esta variavel é apenas exemplo não serve para nada no programa que vamos criar.
ENDC ;FIM DO BLOCO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Acima fica o local para criação de todas variáveis que queira usar no programa.
CBLOCK 0x20 - é o endereço inicial da memória, o interessante é que todas variáveis ai colocada automaticamente receberão um endereço na memória nos poupando o trabalho de fazer isto manualmente. assim a primeira variável vai estar na memória 0x20 a 2º vai para 0x21 e assim sucessivamente.
ENDC- éo fim do bloco de memória, é obrigatório o uso do mesmo quando terminar de gerar as váriáveis.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ENTRADAS
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDADO TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO1 PORTA,2 ;DEFINE PORTA,2 COMO BOTAO1
; 0 -> PRESSIONADO
; 1 -> LIBERADO
;*************************************************************
Acima estamos definindo quais serão e como chamaremos as entradas.
#DEFINE - como já vimos é a sintaxe para dar nome a uma constante
BOTAO1 - é o nome que a constante recebeu
PORTA,2- é a constante propriamente dita
Ou seja o programa passa a conhecer Porta,2(RA2) como BOTAO1 assim fica mais facil para conciliar os pinos as suas funções.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; SAÍDAS
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDADO TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE LED PORTA,5 ;DEFINE PORTB 5 COMO LED
;0 LED. ACESSO
;1 LED. APAGADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Acima estamos definindo quais serão e como chamaremos as saídas
#DEFINE - como já vimos é a sintaxe para dar nome a uma constante
LED - é o nome que a constante recebeu
PORTB,5- é a constante propriamente dita
Ou seja o programa passa a conhecer Portb,5 como LED assim fica mais facil para conciliar os pinos as suas funções.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; VETOR DE RESET
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
VETOR DE RESET - É o endereço inicial ou seja quando resetamos o microcontrolador é para lá que ele vai
ORG - Sintaxe que informa ao microcontrolador qual endereço da memória é o vetor de reset
0X00 - este é o endereço físico da memória o qual o microcontrolador irá lê quando for resetado
Goto - Sintaxe que na minha tradução humilde que dizer "VAI PARA"
INICIO - constante que armazena um endereço de memória onde se dá o inicio do programa.
Na realidade o processo é assim:
Ocorreu um reset, o microcontrolador pula para a memória 0X00 lê a próxima linha de código que manda ele pular para um lugar na memória chamado INICIO.
O legal é que criamos este nome agora, INICIO não existia antes de mandar o processador ir para lá isto ajuda muito quando precisamos pular processos. você vai entender melhor durante as proximas programações.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ; DESLIGA O COMPARADOR
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000000'
MOVWF TRISA ;DEFINE TODO PORTA COMO ENTRADA
MOVLW B'11111111'
MOVWF TRISB ;DEFINE TODO PORTB COMO SAÍDA
MOVLW B'00000000'
MOVWF OPTION_REG ; CONFIGURA REGISTRADOR OPTIO_REG
MOVLW B'00000000'
MOVWF INTCON ;CONFIGURA REGISTRADOR INTCON
BANK0 ;RETORNA PARA O BANCO 0
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Será para cá que o processador voltará sua atenção quando encontrar a sintaxe GOTO INICIO. Primeiramente iremos fazer as configurações dos registradores irei citando um a um e explicando a sintaxe MOVLW e MOVWF.
1º acho que vocês perceberam o uso da constante BANK0 que havíamos criando anteriormente, como já foi dito ela será usada toda vez que precisarmos acessar alguma memória que esteja no Bank0.
Por exemplo neste caso estamos acessando o Bank0 para configurar o Registrador CMCON pois, o mesmo encontrá-se no Bank0.
Notem com funciona a configuração deste registrador pois, isto se repetirá para configuração de todos os registradores.
BANK0 - acesso o Bank0
MOVLW B'00000111' - Uso a sintax MOV(lê-se move)L(lê-se Literal para)W (lê-se Work) B (Lê-se Binario)('00000111') é o valor binário que será movido para o registrador Work.
Work é um registrador onde armazenamos os valores de um memória antes de fazer qualquer operação com eles. É como se tivéssemos a obrigação de sempre esquentar no microonda a comida que sai da geladeira para depois comer ou fazer outra coisa.
Assim o que fizemos foi mover o literal binário 00000111 para o registrador Work
Agora você já tem o valo '000000111' gravado em work agora vamos transferi-lo para o registrador que queremos configurar neste caso CMCON
MOVWF CMCON - Uso novamente a sintax MOV(lê-se move)W (lê-se Work)F(Lê-se para o registrador)CMCON.
Assim o que fizemos foi mover o literal binário 000000111 que estava em work para o registrador CMCON. Veja o datasheet do microcontrolador na pagina 62 para ver o que essa configuração vai fazer.
Note que setamos os bits 0, 1 e 2 responsáveis pelo modo de funcionamento do comparador. E da forma com que setamos nós desligamos os comparadores configurando os pinos ligados ao comparador para trabalhar como entradas ou saídas digitais.
Agora fica simples entender o restante.
BANK1 - Acessei o Bank1
Lembre-se que mais acima configuramos Botao1 como Porta,2(RA2) agora vamos configurar o registrador Trisa que é responsável por armazenar o valor que vai informar o microcontrolador qual pino do Porta é entrada ou saída. Temos que entender que neste caso o pino vai receber tensão ou seja será entrada.
como não usarei os outros pinos então configurarei todos os pinos com entrada.
MOVLW B'11111111' - Movi o literal binário 11111111 para work
MOVWF TRISA - Movi o literal binário 11111111 que estava em Work para o registrador Trisa
O que fizemos foi configurar os pinos do Porta como entrada.
Lembre-se que mais acima configuramos LED como Portb,5(RB5) agora vamos configura o registrador Trisb que é responsável por armazenar o valor que vai informar o microcontrolador qual pino do Portb é entrada ou saída. Entenda novamente que vai sair energia do pino RB5 para alimentar o LED assim ele será configurado como Saída
MOVLW B'00000000'
MOVWF TRISB
O que fizemos foi configurar todos os pinos do Portb como saída.
Os outros 2 registradores por enquanto dispensam comentários , mas notem que após a configuração dos registradores voltamos para o Bank0
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ROTINA PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CORPO
BTFSC BOTAO1
GOTO L_LED
GOTO D_LED
L_LED
BSF LED
GOTO CORPO
D_LED
BCF LED
GOTO CORPO
END
;***************************************************************
Em fim finalizamos o nosso programa, descreverei passo a passo o funcionamento.
Lembra que eu falei em outro post que programar para pic na realidade é ter controle sobre os pinos, então até agora nos estávamos configurando o microcontrolador . Agora nós vamos começar a dizer para o microcontrolador o que ele deve fazer com a informação recebida nos pinos configurados como entrada e quando ele deve colocar os pinos configurados com saída em nível alto (1) para marcar este trecho do programa eu estou o chamando de CORPO.
CORPO - Nome escolhido a cargo do programador para definir um bloco de instrução.
BTFSC BOTAO1 -
BTFSC é mais ou menos como um IF em outras linguagens de programação só que bem limitado.quando escrevemos "BTFSC" é como se dizermos "testa(T) o bit(B) do registrador(F) e pula(S) 1 linha se o bit for zero(C)" neste caso o registrador é o BOTAO1 que lembrando o que foi dito a cima BOTAO1 foi o nome dado ao bit 2 (RA2) do registrador PORTA. então o que estamos testando é se o bit 2 do PORTA está setado em 0 ou 1, mais ainda, estamos testando se o botão 1 está apertado ou não.
Quando dizemos pula uma linha é exatamente isso, o processador ao executar o programa vai pular uma linha de instrução. você entenderá melhor quando estivermos simulando o programa.
GOTO L_LED - lembra do GOTO falado acima olha ele aí novamente o que ele está dizendo é "VAI PARA a posição de memória chamada L_LED". L_LED tal como CORPO é mais um nome dado a um bloco de instrução.
GOTO D_LED - isto quer dizer "VAI PARA a posição de memória chamada D_LED". D_LED é o nome dado a outro bloco de instrução.
L_LED - Instrução que ligará o led, é para cá que o processador vem quando testa o BOTAO1 e o mesmo é 1.
BSF LED - Toda vez que queremos que um bit de qualquer registrador torne-se 1 usamos a instrução BSF(set(S) o bit(B) do registrador(F)) neste caso o registrador é LED nome este que foi dado mais acima ao bit 5 do registrador PORTB. assim o que estamos fazendo aqui é colocando o bit 5 do Portb em nível alto e isto faz com que tenha tensão no Pino Ra5 ligando assim o Led.
GOTO CORPO - Isto quer dizer VAI PARA (GOTO) a posição de memória chamada CORPO ou seja voltamos para inicio do grupo de instrução que havíamos chamado de CORPO, Porque? Simples para criar um looping, pois temos que ficar testando o BOTAO1(Ra2) todo o tempo para saber se o botão1 está apertado ou solto, enquanto o botão1 estiver apertado o led continuará acesso mas se o botão1 for solto o BOTAO1(Ra2) passa a ficar com nível baixo(0) então quando ocorre o teste (BTFSC BOTAO1) o processador pula a linha e não lê a próxima informação que mandava ligar o led mas lê o seguinte:
GOTO D_LED - Isto quer dizer VAI PARA (GOTO) a posição de memória chamada D_LED
BCF LED - Toda vez que queremos que um bit de qualquer registrador torne-se 0 usamos a instrução BCF zere(C) o bit(B) do registrador(F)) neste caso o registrador é LED Lembre que LED foi o nome que demos ao bit 5 do PORTB. assim quando zeramos o mesmo o colocamos em nível baixo (sem tensão) assim o Led é desligado.
GOTO CORPO - Isto quer dizer VAI PARA (GOTO) a posição de memória chamada CORPO e volta para o looping de teste do BOTAO1.
END - fim do programa , sintaxe obrigatória sempre usada no fim do programa.
No próximo Post tentarei postar um vídeo mostrando o que aprendi sobre programar e emular usando o MPLAB e também o Pic Simulador Ide.
Segue abaixo o código do programa de forma continua para um copiar e colar, mas lembro que é fundamental para quem está aprendendo a digitar seus programas pois só assim se acostumará com os nomes dos registradores e sintaxes.
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; led16f628a
; VERSÃO: 1.0 DATA: 29/12/2041
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DESCRIÇÃO DO ARQUIVO
;-----------------------------------------------------------------
; O LED ACENDERA AO PRESSIONAR O BOTÃO 1
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ARQUIVOS DE DEFINIÇÕES
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628A
;***************************************************
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; PAGINAÇÃO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; VARIÁVEIS
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
; PELO SISTEMA
CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE
;USUÁRIO
variavel_1 ; esta variavel não serve para nada no programa que vamos criar.
variavel_2 ; esta variavel não serve para nada no programa que vamos criar.
ENDC ;FIM DO BLOCO DE MEMÓRIA
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ENTRADAS
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
; RECOMENDADO TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE BOTAO1 PORTA,2 ;DEFINE PORTA,2 COMO BOTAO1
; 0 -> PRESSIONADO
; 1 -> LIBERADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
SAÍDAS
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
; RECOMENDADO TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
#DEFINE LED PORTB,5 ;DEFINE PORTB,5 COMO LED
;0 LED. ACESSO
;1 LED. APAGADO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; VETOR DE RESET
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
GOTO INICIO
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANK0 ;ALTERA PARA O BANCO 0
MOVLW B'00000111'
MOVWF CMCON ; DESLIGA O COMPARADOR
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000100'
MOVWF TRISA ;DEFINE RA2 ENTRADA E DEMAIS
;COMO SAÍDAS
MOVLW B'00000000'
MOVWF TRISB ;DEFINE TODO O RB5 COMO SAÍDA
MOVLW B'10000100'
MOVWF OPTION_REG ; CONFIGURA REGISTRADOR OPTIO_REG
MOVLW B'00000000'
MOVWF INTCON ;CONFIGURA REGISTRADOR INTCON
BANK0 ;RETORNA PARA O BANCO 0
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ROTINA PRINCIPAL
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CORPO ; crio grupo de instrução chamada CORPO
BTFSC BOTAO1 ; Testo se botão1 está ou não apertado
GOTO L_LED ; se botão1 apertado pulo para L_LED
GOTO D_LED ;Se botão1 não apertado pulo para D_LED
L_LED ; grupo de instrução para ligar o led
BSF LED ; Mando ligar o LED
GOTO CORPO ; volto para o CORPO
D_LED ; grupo de instrução para desligar o led
BCF LED ; Mando desligar o LED
GOTO CORPO ; volto para o CORPO
END ; finalizo o programa
Nenhum comentário:
Postar um comentário