Escreva um programa em assembly para ler um byte em PORTB, somar 5 ao valor e enviá-lo para PORTD.
Passo 1
Então, o enunciado pede um programinha em Assembly (vamos usar como exemplo um PIC16F877A) que:
- leia um byte de PORTB;
- some 5 a esse valor;
- escreva o resultado em PORTD.
Conteúdo da matéria:
- Configuração de portas digitais em PIC (registradores TRISx e PORTx)
- Banco de registradores e instruções de seleção de banco (STATUS.RP0)
- Instruções de movimentação e soma em Assembly (MOVF, MOVLW, MOVWF, ADDLW)
Para resolver, precisamos saber como configurar entrada/saída nos TRISx, como ler PORTB para o registrador W, somar um literal e mandar no PORTD.
Passo 2
Configurar direções das portas (TRISx) e selecionar banco
- Em PIC, cada porta tem um TRISx que define direção: bit em 1 = entrada, 0 = saída.
- TRISB deve ser 0xFF (tudo entrada) e TRISD = 0x00 (tudo saída).
- Esses registradores ficam no banco 1, então a gente muda para lá, configura e volta pro banco 0.
Explicando cada instrução:
- BSF STATUS, RP0 → sobe para banco 1
- CLRF TRISD → zera TRISD, logo PORTD é saída
- MOVLW b’11111111’
- MOVWF TRISB → coloca 0xFF em TRISB, logo PORTB é entrada
- BCF STATUS, RP0 → volta pro banco 0 (onde ficam PORTx)
Passo 3
Fazer o loop que lê de PORTB, soma 5 e escreve em PORTD
- MOVF PORTB, W → copia PORTB para o registrador W
- ADDLW 5 → faz W ← W + 5 (literal)
Teoria: ao usar ADDLW k, você está realizando a operação aritmética
W ← W + k
ou, em notação matemática, se o valor lido é, fazemos
- MOVWF PORTD → manda o resultado de W para PORTD
- GOTO loop → repete pra sempre
Resposta
Segue o programa completo em Assembly para PIC16F877A (MPLAB):
list p=16F877A
#include <P16F877A.INC>
__config _XT_OSC & _WDT_OFF & _PWRTE_ON
org 0x00
start:
; 1) Configura portas
bsf STATUS, RP0 ; banco 1
clrf TRISD ; PORTD como saída (0x00)
movlw b'11111111'
movwf TRISB ; PORTB como entrada (0xFF)
bcf STATUS, RP0 ; volta para banco 0
loop:
movf PORTB, W ; W ← PORTB
addlw 5 ; W ← W + 5
movwf PORTD ; PORTD ← W
goto loop ; repete eternamente
end