aula 2- assembly-exercícios
Post on 21-Jan-2016
21 Views
Preview:
TRANSCRIPT
Programação – Luis Aransegui– Aula 2 – Parte II - MPLAB Página 1/4
Programas exemplo assembly
Como executar o programa
Tarefa prática Programe a estação Proteus ou kit PIC com os seguintes programas em assembly, identificando qual o efeito de cada programa abaixo relacionado.
;-------------------------------
; Programa 1 :
; AUTOR : LUIS ARANSEGUI
; FEVEREIRO DE 2010
; Programação Assembly
; ========================== cabecalho padrao
LIST p=16F877
#include "P16F877.INC" ;inclui biblioteca do PIC a ser usado
inicio bcf STATUS, RP0 ;desliga bit STATUS,RP0.
bcf STATUS, RP1 ;desliga bit STATUS,RP1. escolhe bank0.
clrf PORTA ;zera todo o PORTA (A0, A1, A2, ...)
bsf STATUS, RP0 ;liga bit STATUS,RP0. escolhe bank1
movlw 0x06 ;carrega 06H (00000110) no acumulador
movwf ADCON1 ;move do acum.p/ADCON1 (desl.analogicas)
movlw 0xff ;carrega FFH (11111111) no acumulador
movwf TRISA ;move acum.p/TRISA (PORTA como entrada)
movlw 0x00 ;zera todo o acumulador (move zeros)
movwf TRISD ;mov acum.p/PORTD, todo PORTD como saída
bcf TRISB,3 ;desliga TRISB,3 (define B3 como saída)
bcf STATUS, RP0 ;desliga bit STATUS,RP0 (volta bank0)
; =========================== parte principal
comeco btfss PORTA,1 ;testa A1. Se ligado, pula prox linha
goto DESLIG ;desvia para rótulo “DESLIG”
bsf PORTB,3 ;liga B3 (buzzer)
goto comeco ;desvia para rótulo “comeco”
DESLIG bcf PORTB,3 ;desliga B3 (buzzer)
goto comeco ;desvia para rotulo “comeco”
END ;END
1) Copie e cole este programa (entre as barras horizontais) no MPLAB.
2) Salve-o com o nome PROG1.asm em uma pasta que você tenha acesso.
3) Gere o arquivo HEX (clicando em Project->QuickBuild)
4) Transfira o programa, e veja o resultado. Este programa usa os pinos A1 e B3..
5) Tente mudar este programa, de forma que ele funcione com a chave A2 e com a saída
(led) D0.
Programação – Luis Aransegui– Aula 2 – Parte II - MPLAB Página 2/4
; Programa 2 :
; AUTOR : Luis Aransegui
; Março DE 2010
; Programação Assembly
LIST p=16F877
#include "P16F877.INC" ;inclui biblioteca do PIC a ser usado
VAR1 equ 0x20 ;define posição de memória 20H
VAR2 equ 0x21 ;define posição de memória 21H
VAR3 equ 0x22 ;define posição de memória 22H
CONT equ 0x23 ;define posição de memória 23H
org 0
goto inicio ;desvia execução para rótulo INICIO
inicio bcf STATUS, RP0 ;desliga bit STATUS,RP0.
bcf STATUS, RP1 ;desliga bit STATUS,RP1. escolhe bank0.
clrf PORTA ;zera todo o PORTA (A0, A1, A2, ...)
bsf STATUS, RP0 ;liga bit STATUS,RP0. escolhe bank1
movlw 0x06 ;carrega 06H (00000110) no acumulador
movwf ADCON1 ;move do acum.p/ADCON1 (desl.analogicas)
movlw 0xff ;carrega FFH (11111111) no acumulador
movwf TRISA ;move acum.p/TRISA (PORTA como entrada)
movlw 0x00 ;zera todo o acumulador (move zeros)
movwf TRISD ;mov acum.p/PORTD, todo PORTD como saída
bcf STATUS, RP0 ;desliga bit STATUS,RP0 (volta bank0)
comeco movlw 0x01 ;rotulo comeco.Carrega acum. c/ 00000001
movwf PORTD ;move do acum. para PORTD
movlw 0x07 ;move 07H para o acum.
movwf CONT ;move do acum. para CONT
volta1 call tempo ;chama rotina de tempo
rlf PORTD,f ;rotaciona PORTD esquerda
decfsz CONT,f ;decrem.CONT e pula prox. Linha se zerar
goto volta1 ;desvia para rótulo “volta1”
movlw 0x07 ;carrega acum. Com 07H
movwf CONT ;move do acum. para CONT
volta2 call tempo ;chama rotina de tempo
rrf PORTD,f ;rotaciona PORTD para direita
decfsz CONT,f ;decrem.CONT e pula prox. linha se zerar
goto volta2 ;desvia para rótulo “volta2”
goto começo ;desvia para “começo”
tempo movlw 0x03 ;rotina de tempo. W <- 3
movwf VAR1 ;VAR1 <- W
temp1 movlw 0x3F ;W <- 3Fh (63 em decimal)
movwf VAR2 ;VAR2 <- W
temp2 movlw 0Xff ;W <- FFH (255 em decimal)
movwf VAR3 ;VAR3 <- W
decfsz VAR3,F ;decrementa VAR3 pula prox.linha se zerar
goto $-1 ;volta uma linha
decfsz VAR2,F ;decrementa VAR2 pula prox.linha se zerar
goto temp2 ;volta para “temp2”
decfsz VAR1,F ;decrementa VAR1 pula prox.linha se zerar
goto temp1 ;volta para “temp1”
return ;retorna da subrotina p/ onde foi chamada
END ;diretiva de fim do programa
;-------------------------------
Programação – Luis Aransegui– Aula 2 – Parte II - MPLAB Página 3/4
; Programa 3 :
; AUTOR : Luis Aransegui
; FEVEREIro DE 2010
; Programação Assembly
LIST p=16F877 ; pic usado
#include "P16F877.INC" ; inclui a biblioteca do MCu utilizado
VAR1 equ 0x20 ;define posição de memória 20H
VAR2 equ 0x21 ;define posição de memória 21H
VAR3 equ 0x22 ;define posição de memória 22H
org 0 ;define endereço de origem na ROM
goto inicio ;desvia execução para rótulo INICIO
;; =========================== rotina de tempo
tempo movlw 0x03 ;rotina de tempo. W <- 3
movwf VAR1 ;VAR1 <- W
temp1 movlw 0x3F ;W <- 3Fh (63 em decimal)
movwf VAR2 ;VAR2 <- W
temp2 movlw 0xFF ;W <- FFH (255 em decimal)
movwf VAR3 ;VAR3 <- W
decfsz VAR3,F ;decrementa VAR3 pula prox.linha se zerar
goto $-1 ;volta uma linha
decfsz VAR2,F ;decrementa VAR2 pula prox.linha se zerar
goto temp2 ;volta para “temp2”
decfsz VAR1,F ;decrementa VAR1 pula prox.linha se zerar
goto temp1 ;volta para “temp1”
return ;retorna da subrotina p/ onde foi chamada
;;============================ rotina de inicialização (prepara a estação)
inicio bcf STATUS, RP0 ;desliga bit STATUS,RP0.
bcf STATUS, RP1 ;desliga bit STATUS,RP1. escolhe bank0.
clrf PORTA ;zera todo o PORTA (A0, A1, A2, ...)
bsf STATUS, RP0 ;liga bit STATUS,RP0. escolhe bank1
movlw 0x06 ;carrega 06H (00000110) no acumulador
movwf ADCON1 ;move do acum.p/ADCON1 (desl.analogicas)
movlw 0xff ;carrega FFH (11111111) no acumulador
movwf TRISA ;move acum.p/TRISA (PORTA como entrada)
movlw 0x00 ;zera todo o acumulador (move zeros)
movwf TRISD ;mov acum.p/PORTD, todo PORTD como saída
bcf TRISB,3 ;desliga TRISB,3 definindo B3 como saída
bcf STATUS, RP0 ;desliga bit STATUS,RP0 (volta bank0)
;; ==================================== parte ciclica
comeco bsf PORTB,3 ;________________________________________
movlw 0xff ;________________________________________
movwf PORTD ;________________________________________
call tempo ;________________________________________
bcf PORTB,3 ;________________________________________
movlw 0x3f ;________________________________________
movwf PORTD ;________________________________________
call tempo ;________________________________________
movlw 0x0f ;________________________________________
movwf PORTD ;________________________________________
call tempo ;________________________________________
movlw 0x03 ;________________________________________
movwf PORTD ;________________________________________
call tempo ;________________________________________
goto comeco ;________________________________________
END ;________________________________________
;-------------------------------
Programação – Luis Aransegui– Aula 2 – Parte II - MPLAB Página 4/4
Associe os comentários corretamente com as lacunas do programa anterior. Alguns comentários serão repetidos várias vezes.
1) Chama rotina de tempo 2) Carrega acumulador com 00000011 3) Carrega acumulador com 00001111 4) Carrega acumulador com 00111111 5) Carrega acumulador com 11111111 6) Move acumulador para PORTD 7) Desvia para rótulo “comeco” 8) Diretiva de FIM DE PROGRAMA 9) Ativa pino B3 (buzzer) 10) Desativa pino B3 (buzzer)
2) Crie um sequencial de LEDs que siga o seguinte padrão de saída no PORTD
top related