MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 9 1 EXPERIÊNCIA 9 – USO DO DISPLAY Parte I – Fundamentos Teóricos a) Utilização de parâmetros e de valor de retorno de uma sub-rotina Freqüentemente, a forma de execução de uma sub-rotina depende de um ou mais valores definidos quando da sua ativação. Esses valores, chamados de parâmetros, são geralmente passados a ela através de registradores. Antes do desvio para a sub-rotina, o programa que a aciona atribui os valores dos parâmetros desejados a registradores previamente definidos. Depois de ativada, a sub-rotina utiliza os valores que lhe foram passados nos devidos registradores para executar sua função. Por outro lado, uma sub-rotina pode apresentar um ou mais valores de retorno, isto é, resultados para serem utilizados pelo programa, logo após o retorno da sub-rotina. Nesse caso, é a sub-rotina que atribui os valores de retorno a registradores para que, após o retorno, sejam utilizados pelo programa. Graças a essa estratégia, pode-se utilizar, num programa, sub-rotinas previamente existentes, ou escritas por outros programadores, desde que estejam convenientemente documentadas (com descrição dos registradores de parâmetros e dos registradores de valores de retorno). Utilizando-se de parâmetros e de valores de retorno, essas sub-rotinas tornam-se muito mais flexíveis e abrangentes, atendendo a um maior número de necessidades dos programadores. b) Sub-rotinas do programa monitor O programa monitor do “kit”, gravado em sua memória não volátil (EPROM), incorpora pouco mais de uma dezena de sub-rotinas que, dividas em 3 grupos – sub-rotinas para teclado, sub-rotinas para display e sub-rotinas de uso geral –, estão disponíveis a qualquer programa que seja carregado na memória do “kit”, para ser por ele executado. Basta que, nesse programa, cada sub-rotina seja ativada através da instrução LCALL (abordada na experiência anterior), desviando para seu respectivo endereço. Muitas delas possuem registradores de parâmetros, aos quais devem ser atribuídos os devidos valores, antes da sua ativação; e algumas apresentam um valor de retorno, que pode ser utilizado pelo programa, após a execução da sub-rotina. O “Manual de Experiências” do Módulo SDM 9431, em seu capítulo 5, faz uma descrição das sub-rotinas do “kit”, apresentando seus endereços, parâmetros e valores de retorno. c) Display do “kit” O display do “kit” é feito com cristal líquido (“LCD – liquid crystal display”), podendo apresentar caracteres alfabéticos e numéricos, além de outros caracteres especiais (símbolos gráficos, letras gregas e caracteres japoneses). Permite, ainda, que o próprio usuário crie seus caracteres, desde que numa matriz de 8 x 8 pontos para cada caracter. O display pode apresentar 2 linhas com 16 caracteres em cada linha. Esses 16 caracteres apresentados, e mais outros 24 caracteres (ocultos), são armazenados numa área de memória (“buffer”) interna ao dispositivo de controle do display, com capacidade, portanto, de 40 caracteres por linha (80 caracteres no total). Cada caracter é codificado num byte, de acordo com a tabela ASCII. A cada posição dessa memória interna do dispositivo de controle do display está associado um endereço: os endereços de 80h a A7h correspondem à primeira linha, e os endereços de C0h a E7h correspondem à segunda linha. O acesso ao display por um programa é feito através da escrita em 2 registradores existentes no dispositivo de controle do display: o registrador de dados e o registrador de comandos. No “kit”, esses registradores são acessados como se fossem posições da memória externa do 8051, nos endereços EC00h (registrador de comandos) e EC01h (registrador de dados). Quando um valor (um byte) é escrito no registrador de dados, esse valor (que deve ser o código ASCII de um caracter) é colocado numa das 80 posições do “buffer” interno do display – na que estiver sendo correntemente apontada por um cursor. Já a escrita de um byte no registrador de comandos permite que, de acordo com o valor escrito (o código de um comando), seja executada uma ação do tipo: iniciação do display, posicionamento do cursor, deslocamento dos caracteres correntemente armazenados, limpeza do display, definição do aspecto do cursor, etc. d) Sub-rotinas do programa monitor para utilização do display A seguir, são apresentadas as sub-rotinas do programa monitor que manipulam o display, e que estão disponíveis aos programas de usuários. CLR_DSP endereço parâmetro(s) valor(es) de retorno 10AAh nenhum nenhum funcionamento: Limpa o display, e coloca o cursor na primeira coluna da primeira linha. registrador(es) alterado(s) nenhum AC_DSP endereço parâmetro(s) valor(es) de retorno registrador(es) alterado(s) ACC 10E7h nenhum nenhum (valor a ser apresentado) funcionamento: Apresenta no display o valor do acumulador, em 2 caracteres hexadecimais, a partir da posição corrente do cursor, que é deslocado para a direita. DPT_DSP endereço parâmetro(s) valor(es) de retorno registrador(es) alterado(s) DPTR 1121h nenhum nenhum (valor a ser apresentado) funcionamento: Apresenta no display o valor do registrador DPTR, em 4 caracteres hexadecimais, a partir da posição corrente do cursor, que é deslocado para a direita. MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 9 2 DSP_DAT endereço parâmetro(s) ACC 10FFh valor(es) de retorno registrador(es) alterado(s) nenhum nenhum (código do caracter a ser apresentado) funcionamento: Apresenta no display o caracter cujo código ASCII é fornecido pelo acumulador, na posição corrente do cursor, que é deslocado para a direita. MENS endereço parâmetro(s) valor(es) de retorno registrador(es) alterado(s) DPTR 110Fh nenhum DPTR (endereço inicial da mensagem) funcionamento: Apresenta no display uma mensagem (seqüência de caracteres, codificados em ASCII), cujo endereço inicial é fornecido pelo registrador DPTR, a partir da posição corrente do cursor, que é deslocado para a direita. O comprimento da mensagem (número de caracteres) é o primeiro byte da mensagem (apontado pelo registrador DPTR). DSP_COM endereço parâmetro(s) valor(es) de retorno registrador(es) alterado(s) ACC 109Ah nenhum nenhum (código do comando) funcionamento: Executa o comando de display cujo código é o valor do acumulador (a codificação dos comandos para o display será apresentada no roteiro da próxima experiência). Parte II – Roteiro Experimental Nesta experiência, utilizaremos o display de cristal líquido. Da mesma forma que o programa da experiência anterior, o programa desta experiência utiliza uma chave (“dip switch”), que deve ser conectada ao pino P1.7. Só depois de fazer essa conexão, ligue o “kit”, e carregue, na memória RAM externa, o programa da Tabela 1, digitando seu código de máquina. Note que o programa possui 2 trechos: uma “parte principal”, que deve ser carregada a partir do endereço 5000h; e o trecho correspondente à sub-rotina TEMPO, que deve ser carregado a partir do endereço 5100h. passo endereço código de máquina 1 5000 75 81 2F 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 5003 5005 5008 500B 500D 5010 5012 5015 5016 5019 501A 501B 501D 5020 5100 5102 5104 5106 5107 5109 510B 510D 510F 5111 5113 5115 5117 78 12 30 74 12 74 12 E8 12 04 F8 74 12 80 C0 C0 C0 F8 79 7A DA D9 D8 D0 D0 D0 22 00 10 97 4E 10 3D 10 AA FD FF FF 10 E7 08 51 00 E3 00 01 02 FF FF FE FA F6 02 01 00 rótulo mnemônico e operandos MOV SP, #2Fh comentários inicia a base da pilha, logo acima da área bit endereçável inicia o valor da contagem com zero limpa o display se chave para baixo, trava coloca código ASCII de ??? no acumulador apresenta o caracter no display coloca código ASCII de ??? no acumulador apresenta o caracter no display coloca o valor da contagem no acumulador apresenta o valor do acumulador no display incrementa o valor da contagem guarda o valor da contagem atual parâmetro para TEMPO (=1s) espera um tempo volta para apresentar novo valor salva R0 na pilha salva R1 na pilha salva R2 na pilha inicia R0 (com o valor do parâmetro) inicia R1 (com 255) inicia R2 (com 255) fica no laço interno até zerar R2 fica no laço intermediário até zerar R1 fica no laço externo até zerar R0 restaura R2 da pilha restaura R1 da pilha restaura R0 da pilha MOV R0, #0 LCALL CLR_DSP JNB P1.7, TRAVA MOV A, #4Eh LCALL DSP_DAT MOV A, #3Dh LCALL DSP_DAT MOV A, R0 LCALL AC_DSP INC A MOV R0, A MOV A, #8 LCALL TEMPO SJMP REPETE TEMPO: PUSH 0 PUSH 1 PUSH 2 MOV R0, A VOLTA3: MOV R1, #255 VOLTA2: MOV R2, #255 VOLTA1: DJNZ R2, VOLTA1 DJNZ R1, VOLTA2 DJNZ R0, VOLTA3 POP 2 POP 1 POP 0 RET Tabela 1 – Programa que utiliza as sub-rotinas do display REPETE: TRAVA: MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 9 3 Posicione a chave conectada ao pino P1.7 para baixo, posição em que ela deve fornecer tensão baixa (0V), e, só então, execute o programa a partir do endereço 5000h, através da função EXEC do Monitor. 1) O registrador SP é iniciado com o valor 2Fh, o que significa que a primeira posição da memória interna que será utilizada pela pilha (a base da pilha) será a de endereço ______h. 2) Inicia o contador (registrador R0) com zero. 3) Aciona a sub-rotina do monitor CLR_DSP, cuja função é ... 4) Trava até que a chave seja posicionada para _____________. 5, 6) Carrega o __________________ com o valor ______h, que é o código ASCII do caracter ____, e que é passado como _________________ para o acionamento da sub-rotina ______________, cuja função é apresentar esse caracter no display, na posição corrente do ____________, que é deslocado para a ______________. 7, 8) Idem aos passos anteriores, mudando apenas o valor, que, neste caso, é ______h, que é o código ASCII do caracter ____. 9, 10) Move para o acumulador o valor corrente da contagem, armazenado no registrador _____. Esse valor é passado como _________________ para o acionamento da sub-rotina ______________, cuja função é ... 11) Incrementa o acumulador, atualizando o valor da contagem. 12) Armazena o valor atual da contagem no registrador R0. 13, 14) Carrega o __________________ com o valor ____, indicativo de uma temporização de cerca de 1s, a ser passado como parâmetro para o acionamento da ___________________ TEMPO. 15) Retorna ao início do laço, para apagar o display e reapresentar o novo valor da contagem. 16 a 28) Executa a sub-rotina TEMPO, adaptada da sub-rotina TEMPO1s da experiência anterior, a fim de poder realizar uma temporização variável, dependendo do valor de seu parâmetro, passado no _________________. EXPERIÊNCIA 9 – QUESTÕES ADICIONAIS 1) Altere e teste o programa desta experiência, para que ele apresente a contagem no display a cada 250ms aproximadamente. 2) Altere e teste o programa desta experiência, para que ele apresente a contagem no display de forma regressiva. 3) Altere e teste o programa desta experiência, para que ele apresente a contagem no display de 3 em 3. 4) Altere e teste o programa desta experiência, para que ele apresente a contagem no display em decimal. (dica: utilize a instrução de ajuste decimal DA A logo após o incremento do acumulador; lembre-se que a instrução DA A só funciona logo após a instrução ADD) bônus: 0,5 ponto caso seu teste funcione 5) Altere e teste o programa desta experiência, para que ele apresente a contagem no display em 16 bits (4 algarismos hexadecimais). (dica: use a rotina DPT-DSP do monitor) bônus: 0,5 ponto caso seu teste funcione 6) É melhor iniciar a carga da sub-rotina TEMPO a partir da posição 5100h da memória externa, em vez de carregar essa sub-rotina logo após o programa principal? Justifique. 7) desafio: Escreva um programa que apresenta ciclicamente, no display, em hexadecimal, os quadrados dos números de 0 a 15. A seqüência a ser apresentada deverá ser: 00010409101924314051647990A9C4E100... bônus: 1,0 ponto