Memorial Descritivo do Jogo de Memória (Memorex)
Transcrição
Memorial Descritivo do Jogo de Memória (Memorex)
Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Jogo de Memória (Memorex v. 3.0) José Wilson Lima Nerys Universidade Federal de Goiás [email protected] Abstract No presente projeto uma sequência de Leds é criada pelo microcontrolador, e deve ser repetida pelo usuário. O objetivo é que o usuário repita sem erros a sequência criada. Essa sequência tem 1 dígito a mais a cada nova etapa, com limite máximo de 20 dígitos.1 I. Introdução projeto apresenta três níveis de dificuldade: fácil, médio e difícil. No modo fácil tem-se uma sequência inalterada de números variando de 1 a 20 dígitos. No nível médio a sequência anterior é repetida e acrescida de 1 dígito, até o limite de 20 dígitos. No nível difícil, cada nova etapa é constituída de uma nova sequência aleatória, até o limite de 20 dígitos. O A Fig.1 mostra o circuito do projeto Memorex. Um driver CD4511 é usado para os dois displays de 7-segmentos, acionados usando multiplexação, e dois drivers ULN2803 são usados para acionar os 11 Leds e para selecionar os displays de 7-segmentos. Fez-se a escolha de colocar em nível lógico alto cada um dos pinos ligados às chaves de escolha da sequência, quando as chaves são pressionadas. No entanto, as chaves de escolha do nível do jogo, quando pressionadas, levam o pino correspondente ao nível lógico baixo. II. Fluxograma e Programa em Assembly do 8051 O fluxograma do Memorex foi dividido em partes, para facilitar o entendemimento e por razões de adequação ao tamanho da página. Inicialmente faz-se a definição de variáveis e as configurações dos temporizadores 0 e 1, usados, respectivamente, para gerar atraso para o display de 7-segmentos e para a geração aleatória de números para os níveis médio e difícil. Os dois temporizadores operam com interrupção habilitada e o temporizador 0 opera no modo 1 com prioridade alta, uma vez que o display deve ser atualizado perioridamente. Nas definições tem-se ainda a atribuição dos valores iniciais das variáveis. A seguir os Leds de saída são rotacionados (ligados e desligados em sequência) antes do programa entrar em um laço de espera. No laço de espera os Leds que indicam os níveis disponíveis ficam piscando, aguardando a escolha do usuário. Uma vez feita a escolha do nível do jogo, o programa desvia para o programa escolhido, e mantém ligado o Led correspondente. Com o intuito de reduzir as informações no corpo do programa Memorex, foi feita a definição de variáveis fora da tabela principal. Essas variáveis são: • • • • unidade bit 00h ; flag usada para alternar entre os displays de dezenas e de unidades. acertos equ 08h ; registrador que guarda a quantidade de acertos. sequencia equ 09h ; registrador que guarda a sequência gerada pelo microcontrolador. contador equ 05h ; registrador R5 - guarda a contagem da quantidade de valores da tabela. 1 Esse projeto foi, originalmente, criado de forma separada, por autores diferentes. Eles foram montados juntos e acrescentou-se o display para mostrar a quantidade de acertos. 1 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Figure 1: Circuito do Jogo de Memória • • • • • • auxiliar equ 02h ; registrador R2 - usado para decrementar a quantidade da tabela, sem alterar R5. ch_facil equ P3.0 ; chave seletora modo fácil; se ch_facil=0, o processamento desvia para jogo fácil. ch_medio equ P3.1 ; chave seletora do modo médio. ch_dificil equ P3.2 ; chave seletora do modo difícil. Ledfacil equ P3.3 ; Led que indica modo fácil ativado. Ledmedio equ P3.4 ; Led que indica modo médio ativado. • Leddificil equ P3.5 ; Led que indica modo difícil ativado. O jogo fácil consiste na leitura de uma tabela pré-gravada e na comparação dessa tabela com os valores digitados pelo usuário. Assim, no início do jogo, o programa faz a leitura do primeiro elemento da tabela e mostra nos Leds (esse primeiro valor é 01h em todos os níveis). No passo seguinte o programa faz a leitura da tecla digitada pelo usuário e, ainda dentro dessa subrotina, faz a comparação do valor digitado com o valor lido da tabela. Caso os valores não sejam iguais, A ̸= B, o programa desvia para a rotina “errou”; nessa rotina, após um período de Leds piscando, o programa volta para o início. Caso A = B, o registrador “auxiliar” é comparado com o registrador “contador”; caso eles sejam diferentes, significa que a sequência ainda não acabou; então o programa volta para o início da subrotina “leitura_facil” para ler o próximo valor digitado pelo usuário. Caso os registradores “auxiliar” e “contador” sejam iguais, significa que aquela sequência já se encerrou e o número de acertos deve ser incrementado, antes do retorno para a rotina principal do jogo fácil. Ao retornar da subrotina “leitura_facil” o registrador “contador” é comparado com 21 decimal; caso contador = 21, desvia para a rotina “completou”, onde o efeito previsto é a rotação ininterrupta dos Leds da porta P2. No jogo médio, ao contrário do jogo fácil, a tabela a ser lida é construída ao longo do jogo. No início do jogo o valor 01h é colocado na tabela, no endereço 70h da RAM. Em seguida, o programa chama a subrotina usada para mostrar o jogo nos Leds, buscando o jogo na memória RAM, a partir do endereço 70h (Os próximos valores serão guardados nos endereços 71h, 72h, ... à medida que o usuário vai acertando as sequências mostradas. A nova sequência repete a sequência anterior, adicionando mais um dígito aleatório). Após esse procedimento, o programa chama a 2 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Figure 2: Memorex - Definições e Escolha subrotina “leitura_medio”, onde o usuário digita a sequência mostrada, que é comparada com a sequência da tabela. No início dessa subrotina o Timer 1 é disparado, iniciando o processo de geração aleatória do próximo dígito da sequência. Ao final dessa subrotina o Timer 1 é parado. A continuação do programa é similar ao jogo fácil. A tabela do jogo difícil também é gerada ao longo do jogo, mas segue uma dinâmica um pouco diferente daquela do jogo médio. Primeiro, cada nova etapa no jogo difícil tem uma nova sequência, com um dígito a mais; segundo, no jogo médio o valor 01h (primeiro valor de todos os jogos) é sempre colocado no endereço 70h e os demais valores são colocados nos endereços subsequentes; no jogo difícil o valor 01h também é o primeiro valor mostrado, mas esse valor será sempre o último valor alocado na tabela. O processo de criação da tabela no jogo difícil segue a seguinte lógica: na primeira sequência, de apenas um dígito, o valor 01h é colocado no endereço 71h (70h + contador). Quando o usuário acerta esse dígito, um número aleatório (gerado usando o Timer 1) é alocado nesse endereço (71h) e o valor 01h é colocado no endereço 72h. Na próxima sequência, de 3 dígitos, o primeiro número aleatório gerado é gravado no endereço 72h; o segundo, no endereço 71h e o número 01h, no endereço 73h. Assim, após cada novo acerto, um novo número aleatório é gerado e armazenado na posição do número do último acerto (o armazenamento de novos números aleatórios no jogo difícil ocorre depois da comparação “A = B?”, na subrotina “leitura_dificil”). Terminada a sequência atual, o último valor armazenado é 01h, na posição correspondente ao novo valor do “contador” adicionado de 70h. Dessa forma, a criação da tabela começa no maior endereço atual e termina com o valor 01h, no novo maior valor de endereço (contador + 1). A leitura da tabela é feita de forma decrescente,a partir do endereço 70h + contador. 3 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Table 1: Programa Memorex - Definições e Escolha do Jogo Rótulo Mnemônico org 00H ljmp inicio Rótulo org 0Bh ljmp display org 1Bh ljmp aleatorio inicio: org 30h mov sp, #2Fh mov tmod,#01h mov ie,#8Ah mov ip,#02h mov th0,#0D8h mov tl0,#0EFh testaleds: Mnemônico mov acertos,#00h mov sequencia,#01h clr unidade mov dptr,#tabela_facil mov P2, #00h mov P1, #00h clr Ledfacil clr Ledmedio clr Leddificil mov a,#01H mov P2,A rl a lcall atrasoreduzido cjne a,#01H,testaleds mov P2,#00H setb tr0 Rótulo escolha: Mnemônico cpl Ledfacil cpl Ledmedio cpl Leddificil jnb ch_facil,jogo_facil jnb ch_medio,segundo jnb ch_dificil,terceiro lcall atrasoreduzido sjmp escolha segundo: terceiro: ljmp jogo_medio ljmp jogo_dificil Figure 3: Memorex - Jogo Fácil Finalizando o programa do projeto Memorex, tem-se a rotina que é executada quando o usuário erra a sequência e a rotina executada quando o usuário completa o jogo, ou seja, acerta todas as sequências até a última, que contém 20 dígitos. A subrotina display é chamada a cada 10 ms, ao final de cada contagem do temporizador 0. Essa subrotina mostra o dígito de unidade e de dezena no display de 7-segmentos, indicando o número de acertos do jogador. A subrotina aleatório é chamada a cada final de contagem do temporizador 1; ela rotaciona para a direita o valor presente no registrador “sequencia”, gerando um novo dígito a ser usado nos níveis médio ou difícil. 4 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Figure 4: Memorex - Jogo Fácil: escolha do usuário Table 2: Programa Memorex - Jogo Fácil Rótulo jogo_facil: Mnemônico setb Ledfacil clr Ledmedio clr Leddificil mov contador,#01 lcall atraso Rótulo leitura_facil: volta_facil: espera_facil: segue_facil: processo_facil: mostra_facil: continua: tabela_facil: mov P2,#00 lcall atraso lcall mostra_facil lcall leitura_facil cjne R5,#21,processo_facil ljmp completou mov a,#00 push acc movc a,@a+dptr mov P2,a lcall atraso pop acc inc a cjne a,05h,continua ret pressionado_facil: compara_facil: errado_facil: certo_facil: Mnemônico mov auxiliar,#00 mov P2,#00h mov a,P1 cjne a,#00h,segue_facil sjmp espera_facil mov b,a mov P2,a mov a,P1 cjne a,#00h,pressionado_facil lcall atraso mov P2,#00h mov a,auxiliar movc a,@a+dptr cjne a,b,errado_facil sjmp certo_facil ljmp errou inc auxiliar mov a,auxiliar cjne a,05h,volta_facil mov a,acertos add a,#01 da a mov acertos,a inc contador ret db 01h, 40h, 20h, 80h, 10h, 02h, 08h, 04h, 80h, 01h db 40h, 02h, 20h, 10h, 80h, 08h, 20h, 04h, 40h, 10h 5 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Figure 5: Memorex - Jogo Médio Figure 6: Memorex - Jogo Médio: Escolha do usuário 6 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Table 3: Programa Memorex - Jogo Médio Rótulo jogo_medio: processo_medio: Mnemônico setb Ledmedio clr Ledfacil clr Leddificil mov contador, #01h mov auxiliar, #00h mov sequencia,#01h lcall tabela_medio lcall mostra_medio lcall leitura_medio cjne R5,#21,processo_medio ljmp completou Rótulo leitura_medio: volta_medio: espera_medio: segue_medio: pressionado_medio: tabela_medio: mostra_medio: mostra2_medio: mov a, auxiliar add a,#70h mov r0,a mov @r0,sequencia ret compara_medio: mov auxiliar,#00h mov P2,#00h lcall atraso mov a,auxiliar add a,#70h mov r0,a mov a,@r0 mov P2,a lcall atraso inc auxiliar mov a,auxiliar cjne a,05h,mostra2_medio ret errou_medio: Mnemônico mov auxiliar,#00h setb tr1 mov P2,#00h mov a,P1 cjne a, #00h,segue_medio sjmp espera_medio mov b,a mov P2,a mov a,P1 cjne a,#00h,pressionado_medio lcall atraso mov P2,#00h mov a,auxiliar add a,#70h mov r0,a mov a,@r0 cjne a,b,errou_medio inc auxiliar mov a,auxiliar cjne a,05h,volta_medio mov a,acertos add a,#01 da a mov acertos,a inc contador clr tr1 ret ljmp errou Figure 7: Memorex - Jogo Difícil 7 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Figure 8: Memorex - Jogo Difícil: Escolha do usuário Table 4: Programa Memorex - Jogo Dificil Rótulo jogo_dificil: processo_dificil: tabela_dificil: mostra_dificil: mostra2: Mnemônico clr Ledmedio clr Ledfacil setb Leddificil mov contador, #01h lcall tabela_dificil lcall mostra_dificil lcall leitura_dificil cjne R5,#21,processo_dificil ljmp completou mov a, contador add a,#70h mov r0,a mov @r0,#01h ret mov auxiliar,contador mov P2,#00h lcall atraso mov a,auxiliar add a,#70h mov r0,a mov a,@r0 mov P2,a lcall atraso djnz auxiliar,mostra2 ret Rótulo leitura_dificil: volta: espera: segue: pressionado: compara: Mnemônico mov auxiliar,contador setb tr1 mov P2,#00h mov a,P1 cjne a, #00h,segue sjmp espera mov b,a mov P2,a mov a,P1 cjne a,#00h,pressionado lcall atraso mov P2,#00h mov a,auxiliar add a,#70h mov r0,a mov a,@r0 cjne a,b,errou clr tr1 mov a,auxiliar add a,#70h mov r0,a mov @r0,sequencia djnz auxiliar, volta mov a,acertos add a,#01 da a mov acertos,a inc contador ret 8 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro Figure 9: Memorex - Atrasos de tempo Table 5: Programa Memorex - Atrasos de Tempo Rótulo atraso: repete: rep: Mnemônico mov r1,#40 mov r6,#100 mov r4,#100 djnz r4,$ djnz r6,rep djnz r1,repete ret Rótulo atrasoreduzido: repete1: rep1: Mnemônico mov r1,#10 mov r6,#100 mov r4,#100 djnz r4,$ djnz r6,rep1 djnz r1,repete1 ret Rótulo atrasocurto: repete2: rep2: Mnemônico mov r1,#2 mov r6,#50 mov r4,#50 djnz r4,$ djnz r6,rep2 djnz r1,repete2 ret Figure 10: Memorex - Efeito para Erro e para Jogo Completo Table 6: Programa Memorex - Erros, Acertos e Tabela Aleatória Rótulo errou: Mnemônico clr tr1 mov a,#0FFh MOV R7,#30 errou1: mov P2,a lcall atrasoreduzido subb a,#0Fh djnz r7,errou1 ljmp inicio completou: rotaciona: mov a,#01h mov P2,a lcall atrasoreduzido rl a sjmp rotaciona Rótulo display: Mnemônico push acc clr tr0 mov th0,#0D8h mov tl0,#0EFh mov a,acertos jb unidade,dezena anl a,#0Fh orl a,#10h mov P0,a setb unidade pop acc setb tr0 reti Rótulo dezena: aleatorio: Mnemônico swap a anl a,#0Fh orl a,#20h mov P0,a clr unidade pop acc setb tr0 reti clr tr1 push acc mov a,sequencia rr a mov sequencia,a pop acc setb tr1 reti end 9 Memorex v. 3.0 • Janeiro 2015 • Projetos com Micro III. Montagem do Memorex A montagem apresentada na Fig.11 é alimentada com quatro baterias de 1,5 V cada. Para reduzir a tensão de alimentação para aproximadamente 5 V foi utilizado um diodo 1N4001. Figure 11: Montagem do Jogo de Memória 10
Documentos relacionados
Prova 2 2014(Sem 2) Resposta esperada
A parte 1 é executada quando o pino P1.7 encontra-se em nível lógico baixo. Como DPTR = 6000H, então o componente ativado é o conjunto de Leds. Assim, os Leds são rotacionados para a esquerda e, em...
Leia mais