Microprocessadores e Microcontroladores
Prof. José Wilson Lima Nerys
Programa Comentado
Faça no ABACUS um programa que leia do teclado e mostre no display de endereços uma temperatura
o
o
em graus Celsius ( C), em valores decimais de 3 dígitos, e faça a conversão para graus Fahrenheit ( F),
mostrando o resultado em decimal, também no display de endereços. Obs.: Converter o valor de entrada
para hexadecimal, fazer a conversão e, depois, converter o resultado para valores decimais. A equação
a ser utilizada, com valores em decimal, é:
9
32
5
1. Fluxogramas
1.1 – Fluxograma geral
1.2 - Fluxograma da Parte 1 - entrada de dados e conversão de decimal para
hexadecimal
Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás
Microprocessadores e Microcontroladores
Prof. José Wilson Lima Nerys
1.3 – Fluxograma para multiplicação por 9 e divisão por 5
1.4 – Fluxograma para conversão de hexadecimal para decimal
Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás
Microprocessadores e Microcontroladores
Prof. José Wilson Lima Nerys
2. Programa comentado
Label
INICIO:
PRINCIPAL:
ESPERA:
MULTIPLICA_10:
Mnemônicos
LXI SP, 2100H
MVI A,02H
OUT 20H
CALL LÊ_TECLA
MOV D,A
CALL MULTIPLICA_10
CALL MULTIPLICA_10
MOV C,A
CALL LÊ_TECLA
PUSH PSW
RLC
RLC
RLC
RLC
MOV E,A
POP PSW
CALL MULTIPLICA_10
ADD C
MOV B,A
CALL LÊ_TECLA
PUSH PSW
ORA E
MOV E,A
POP PSW
ADD B
Comentários
Define a pilha na posição 2100H
Configura a porta 21H (chaves) como porta de entrada e a porta
22H (Leds) como porta de saída
Lê o 1º dígito do número decimal. A 1º dígito
Guarda valor em D para mostrar depois em DE
Multiplica valor lido (A) por 10. A 10*A
Multiplica de novo por 10. A 10*10*A = 100*1º dígito
Guarda em C valor de 100*1º dígito
Lê o 2º dígito do número decimal. A 2º dígito
Guarda na pilha valor do 2º dígito
Rotaciona 4 vezes para a esquerda o valor do 2º dígito, preparando
para juntar o 2º dígito com o 3º, guardar os dois em E, para mostrar
depois em DE
Guarda em E valor rotacionado (x 16)
Recupera valor do 2º dígito original (sem rotação)
Multplica valor do 2º dígito por 10. A 10*2º dígito
Faz A 100*1º dígito + 10*2º dígito
Guarda em B o valor parcial 100*1º dígito + 10*2º dígito
Lê o 3º dígito do número decimal. A 3º dígito
Guarda na pilha valor do 3º dígito
Junta 3º dígito com o 2º dígito rotacionado, para mostrar
E = 2º dígito junto com o 3º dígito, para mostrar em DE
Recupera valor do 3º dígito original
A 100*1º dígito + 10*2º dígito + 3º dígito. Esse valor é a
temperatura em hexadecimal.
PUSH PSW
CALL MOSTRA_DE
POP PSW
Guarda na pilha o valor hexadecimal da temperatura
Mostra o valor da temperatura em decimal
Recupera da pilha o valor hexadecimal da temperatura
MOV E,A
MVI D,00H
CALL MULTIPLICA_9
CALL DIVIDE_5
LXI H,0020H
DAD D
XCHG
E Recebe valor da temperatura em hexadecimal
Faz D = 00H. A temperatura (hex) foi transferida para DE.
Chama subrotina para multiplicar a temperatura (DE) por 9
Chama subrotina para dividir a temperatura*9 (DE) por 5
Carrega HL com valor 0020H (valor 32 decimal)
Faz HL HL + DE. A temperatura (F – hex) está em HL
Faz a troca dos conteúdos de HL e DE. Temperatura em DE
IN 21H
CPI 01H
JNZ ESPERA
Lê conteúdo das chaves e transfere para A
Compara conteúdo de A (valor das chaves) com 01H
Se a chave 0 não estiver ligada aguarda em um loop
CALL HEX_DECIMAL
PUSH D
CALL MOSTRA_DE
POP D
HLT
Chama subrotina para converter de hexadecimal para decimal
Guarda conteúdo de DE na pilha
Mostra DE (temperatura final em decimal)
Recupera conteúdo de DE na pilha
Encerra programa
RLC
MOV B,A
RLC
Rotaciona conteúdo de A para a esquerda. A 2*A
Guarda em B resultado anterior: 2*A
Rotaciona A para a esquerda. A 2*2*A = 4*A
Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás
Microprocessadores e Microcontroladores
MULTIPLICA_9:
VOLTA:
DIVIDE_5:
VOLTA1:
QUOCIENTE:
CONTINUA:
SAI:
HEX_DECIMAL:
VERIFICA_D:
CONVERTE:
PRONTO:
Prof. José Wilson Lima Nerys
RLC
ADD B
RET
Rotaciona A para a esquerda. A 2*4*A = 8*A
Faz A = A+B. A = 8*A + 2*A = 10*A
Retorna da subrotina com A = 10 vezes seu valor original
LXI H,0000H
MVI C,09H
DAD D
DCR C
JNZ VOLTA
XCHG
RET
Faz HL = 0000H. Acumulador de adição com registrador duplo
Faz C = 09H. Fator de Multiplicação de DE
Faz HL = HL + DE 9
Decrementa C (originalmente 09H) até zerar
Enquanto C ≠ 0, continua adição de HL + DE
Faz a troca dos conteúdos de HL e DE.
Retorna com resultado em DE. A entrada também foi em DE.
LXI H,0000H
MOV A,E
SUI 05H
MOV E,A
JC CONTINUA
INX H
JMP VOLTA1
MOV A,D
CPI 00H
JZ SAI
DCR A
MOV D,A
JMP QUOCIENTE
XCHG
RET
Faz HL = 0000H. HL é o quociente da divisão. DE é o dividendo
Transfere para A conteúdo byte menos significativo do dividendo
Faz A = A – 5. A divisão é uma sequencia de subtrações
Atualiza valor de E
Se a subtração resultou em Carry, verifica situação de D
Incrementa o quociente a cada subtração de E e de D
Volta para verificar novamente o conteúdo de E
Transfere para A conteúdo do byte mais significativo do dividendo
Verifica se o conteúdo do byte mais significativo é zero
Se D = 0, encerra divisão.
Decrementa conteúdo de A, que contém byte mais significativo
Atualiza conteúdo de D (byte mais significativo do dividendo)
Pula para atualizar o quociente da divisão
Faz a troca dos conteúdos de HL e DE.
Retorna com resultado em DE. A entrada também foi em DE.
LXI H,0000H
MOV A,D
CPI 00H
JNZ CONVERTE
MOV A,E
CPI 00H
JZ PRONTO
Faz HL = 0000H. HL é o contador decimal.
Transfere para A byte mais significativo do resultado final
Verifica se D = 0. Se não for zero continua conversão.
Se D ≠ 0, continua conversão de hexadecimal para decimal
Se D = 0, transfere para A byte menos significativo do resultado
Verifica se E = 0. Se for zero a conversão acabou, caso contrário
continua na próxima linha o processo de conversão.
DCX D
MOV A,L
ADI 01H
DAA
MOV L,A
CPI 00H
JNZ VERIFICA_D
MOV A,H
ADI 01H
DAA
MOV H,A
JMP VERIFICA_D
XCHG
RET
Decrementa o registrador duplo DE, que contém temp. em hex.
Transfere para A o byte menos significativo o contador
Adiciona 1 ao contador. A A + 1
Faz a correção decimal do resultado anterior
Atualiza byte menos significativo do contador decimal
Compara com zero byte menos significativo do contador
Se L ≠ 0, volta a verificar registrador duplo DE
Se L = 0, transfere para A byte mais significativo do contador
Adiciona 1 ao byte mais significativo do contador.
Faz a correção decimal do byte mais significativo do contador
Atualiza byte mais significativo do contador decimal
Volta a verificar registrador duplo DE
Faz a troca dos conteúdos de HL e DE.
Retorna com resultado em DE. A entrada também foi em DE.
Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás
Download

Exemplo Temperatura - Escola de Engenharia Elétrica, Mecânica e