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:
  1. leia um byte de PORTB;
  2. some 5 a esse valor;
  3. 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
  1. Em PIC, cada porta tem um TRISx que define direção: bit em 1 = entrada, 0 = saída.
  2. TRISB deve ser 0xFF (tudo entrada) e TRISD = 0x00 (tudo saída).
  3. 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
  1. MOVF PORTB, W → copia PORTB para o registrador W
  2. 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 é x, fazemos
    y = x + 5
  3. MOVWF PORTD → manda o resultado de W para PORTD
  4. 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

Exercícios relacionados