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