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:
  • 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
Loop:
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.

Exercícios relacionados