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

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