Sistemas Embarcados: Microcontroladores Prof. Protásio Laboratório de Microengenharia/DEE/CEAR/UFPB Sub-rotinas 8051 Sub-rotina ▪ É uma sequência de instruções com uma finalidade específica. ▪ O uso de sub-rotinas possibilita: ▪ Modularizar o programa ▪ Facilitar o reaproveitamento de programa ▪ Facilitar a manutenção de programa Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 3 Sub-rotina ▪ As sub-rotinas são utilizadas para evitar trechos repetitivos de rotinas dentro do programa principal Com sub-rotina : : Raiz Programa Principal Programa Principal Raiz Raiz Raiz : Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB : Raiz 4 Sub-rotina ▪ Sub-rotinas são armazenadas em uma faixa de endereço separada da faixa do programa principal 0000H : 0030H Programa Principal : Sub-rotinas FFFFH Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB : 5 Sub-rotina ▪ Instruções de chamada de sub-rotina ▪ ACALL <endereço inicial da sub-rotina de 11 bits> ▪ LCALL <endereço inicial da sub-rotina de 16 bits > ▪ Instrução de retorno de sub-rotina ▪ RET Programa Principal : ORG 100H : LCALL RAIZ : END RAIZ: Sub-rotina : RET Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 6 Sub-rotina X Sub-rotina de tratamento de interrupção (STI) ▪ Sub-rotina ▪ Sempre chamada por SW ▪ ACALL, LCALL e finalizada por RET ▪ Sub-rotina de tratamento de interrupção ▪ Chamada por uma interrupção ▪ Após a interrupção, opera de maneira similar ao tratamento de uma sub-rotina ▪ Interrompe o programa e chama a STI específica ▪ O endereço da STI depende do tipo da interrupção ▪ A STI finaliza com RETI Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 7 Sub-rotina ▪ Operação das instruções ACALL e LCALL Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 8 Sub-rotina ▪ Operação da instrução RET Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 9 Estrutura de um programa Assembly Início Definição das subrotinas Início do programa principal: Inicialização de variáveis e configurações de hardware Laço do programa principal : Jump incondicional para o início do laço Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 10 Estrutura de um programa Assembly ;Definição das sub-rotinas ADDR1: sub-rotina 1 : ret : ADDR2: sub-rotina N : ret ;Inicialização de variáveis e configurações de hardware INICIO: instrução 1 : instrução j ; Laço do programa principal LOOP: instrução 1 : instrução k call ADDR1 : call ADDRN : jmp LOOP END Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 11 Exemplo 1 ▪ Programa que calcula a quantidade de valores iguais a FFH na faixa de memória de 60H a 64H e salva o resultado na posição 65H. ORG 0000H LJMP INICIO ; Pula para INICIO ;Subrotina que calcula a quantidade de FFH ORG 070H SUB1: mov R0,#60H ; endereço inicial da faixa de memória (buffer) mov R1,#05H ; Quantidade de elementos do buffer mov 65H,#00 ; Zera a posição de memória 65H ADR2: clr C ; Zera carry (C) para não influenciar na subtração mov A,@R0 ; A elemento do buffer subb A,#0FFH ; A A – FFH jnz ADR1 ; Se A ≠ 0, pula para ADR1 inc 65H ; Se A = 0, incrementa o dado em 65H ADR1: inc R0 ; próxima posição do buffer djnz R1, ADR2 ; decrementa e pular para ADR2 se ≠ 0 ret ; retorna da sub-rotina ; Programa Principal ORG 100H INICIO: mov PSW,#00H ; Zera o PSW mov SP, #30H ; Define o Stack Point para 70H ACALL SUB1 ; Chama a subrotina SUB1 mov A, 65H ; Salva o resultado em A END Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 12 Exemplo 1 ▪ Programa que soma os valores da faixa de memória de 40H a 50H e salva o resultado na posição 51 e 52H. ORG 0000H LJMP INICIO ; Pula para INICIO ;Subrotina de soma de 16 bits ORG 050H SOMA: mov R0,#40H ; endereço inicial do buffer mov R1,#11H ; Quantidade de elementos do buffer a serem somados ( = 50H – 40H +1) mov A,#00 ; Zera A mov 52H,A ; Zera endereço 52H dos dados mais significativos do resultado ADR2: add A,@R0 ; A A + @R0 jnc ADR1 ; Se C ≠ 0 (não ocorreu Carry), pula para ADR1 inc 52H ; Se C = 0, incrementa o valor em 52H (parte mais significativa do resultado) ADR1: inc R0 ; próxima posição do buffer djnz R1, ADR2 ; decrementa e pular para ADR2 se ≠ 0 mov 51H,A ; salva a parte menos significativa do resultado ret ; retorna da sub-rotina ; Programa Principal ORG 100H INICIO: mov PSW,#00H ; Zera o PSW mov SP, #30H ; Define o Stack Point para 70H ACALL SOMA ; Chama a subrotina SOMA END Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 13 Exercícios ▪ Modifique os programas dos exercícios da última aula para que as operações de saída para LEDs ou Display sejam subrotinas Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB 14