Escreva um programa em assembly para receber um byte em PORTD e escrevê-lo no PORTB e PORTC.
Passo 1
Beleza, então o enunciado pede: “Escreva um programa em Assembly que receba um byte em PORTD e escreva esse mesmo byte em PORTB e em PORTC.”
Conteúdo: programação em Assembly para microcontrolador PIC (vamos usar o PIC16F84A como exemplo).
O que precisamos saber:
Conteúdo: programação em Assembly para microcontrolador PIC (vamos usar o PIC16F84A como exemplo).
O que precisamos saber:
- Como configurar os registros TRISx para definir direção de portas (entrada/saída).
- Como ler de uma porta (PORTD) e como escrever em outras portas (PORTB e PORTC).
- Estrutura básica de um programa Assembly para PIC (bancos de registradores, looping infinito).
Passo 2
Antes de mais nada, a gente precisa dizer ao PIC quais pinos são entrada e quais são saída. Isso é feito configurando os registradores TRISx (um para cada PORTx):
- TRISD deve ser 1 em cada bit porque PORTD é entrada.
- TRISB e TRISC devem ser 0 em cada bit porque PORTB e PORTC são saídas.
Em Assembly PIC, para acessar esses TRISx a gente precisa mudar para o Bank 1 (banco de registradores 1) usando STATUS.RP0.
Passo 3
Vamos escrever o trecho que configura as portas:
bsf STATUS, RP0 ; vai para banco 1
movlw 0xFF ; carrega W com 1111 1111₂
movwf TRISD ; faz PORTD toda entrada
movlw 0x00 ; carrega W com 0000 0000₂
movwf TRISB ; faz PORTB toda saída
movwf TRISC ; faz PORTC toda saída
bcf STATUS, RP0 ; volta para banco 0
Passo 4
Agora que as portas estão configuradas, a gente precisa ler o byte que chegou em PORTD e escrever isso nas duas outras portas. Em PIC Assembly, para ler PORTD usamos
movf PORTD, W
. Aí o registrador W vai ter o valor que veio da porta. Para escrever, basta mandar W para PORTB (movwf PORTB
) e para PORTC (movwf PORTC
).Como a gente quer que isso aconteça sempre que chegar algo em PORTD, fazemos isso dentro de um loop infinito:
Loop:
movf PORTD, W ; W = valor de PORTD
movwf PORTB ; PORTB = W
movwf PORTC ; PORTC = W
goto Loop ; repete para sempre
Passo 5
Juntando tudo num programa completo (PIC16F84A como exemplo):
;================================================================
; Configurações iniciais e inclusão de definições
list p=16F84A
include <P16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC
;================================================================
org 0x0000 ; início do código
Start:
; Configura porta D como entrada e B, C como saída
bsf STATUS, RP0 ; banco 1
movlw 0xFF
movwf TRISD
movlw 0x00
movwf TRISB
movwf TRISC
bcf STATUS, RP0 ; banco 0
; Configura porta D como entrada e B, C como saída
bsf STATUS, RP0 ; banco 1
movlw 0xFF
movwf TRISD
movlw 0x00
movwf TRISB
movwf TRISC
bcf STATUS, RP0 ; banco 0
Loop:
movf PORTD, W ; lê byte de PORTD
movwf PORTB ; escreve em PORTB
movwf PORTC ; escreve em PORTC
goto Loop ; repete sempre
movf PORTD, W ; lê byte de PORTD
movwf PORTB ; escreve em PORTB
movwf PORTC ; escreve em PORTC
goto Loop ; repete sempre
end
Resposta
O programa acima configura PORTD como entrada e PORTB/PORTC como saída e copia, em loop, o byte lido de PORTD para PORTB e PORTC.