Você está na página 1de 10

Memorex v. 3.

0 Janeiro 2015 Projetos com Micro

Jogo de Memria (Memorex v. 3.0)


Jos Wilson Lima Nerys
Universidade Federal de Gois
jwlnerys@gmail.com
Abstract

No presente projeto uma sequncia de Leds criada pelo microcontrolador, e deve ser repetida pelo
usurio. O objetivo que o usurio repita sem erros a sequncia criada. Essa sequncia tem 1 dgito a
mais a cada nova etapa, com limite mximo de 20 dgitos.1

I. Introduo
projeto apresenta trs nveis de dificuldade: fcil, mdio e difcil. No modo fcil tem-se uma
sequncia inalterada de nmeros variando de 1 a 20 dgitos. No nvel mdio a sequncia
anterior repetida e acrescida de 1 dgito, at o limite de 20 dgitos. No nvel difcil, cada nova
etapa constituda de uma nova sequncia aleatria, at o limite de 20 dgitos.

A Fig.1 mostra o circuito do projeto Memorex. Um driver CD4511 usado para os dois
displays de 7-segmentos, acionados usando multiplexao, e dois drivers ULN2803 so usados
para acionar os 11 Leds e para selecionar os displays de 7-segmentos. Fez-se a escolha de colocar
em nvel lgico alto cada um dos pinos ligados s chaves de escolha da sequncia, quando as
chaves so pressionadas. No entanto, as chaves de escolha do nvel do jogo, quando pressionadas,
levam o pino correspondente ao nvel lgico baixo.

II. Fluxograma e Programa em Assembly do 8051


O fluxograma do Memorex foi dividido em partes, para facilitar o entendemimento e por razes
de adequao ao tamanho da pgina. Inicialmente faz-se a definio de variveis e as configuraes dos temporizadores 0 e 1, usados, respectivamente, para gerar atraso para o display
de 7-segmentos e para a gerao aleatria de nmeros para os nveis mdio e difcil. Os dois
temporizadores operam com interrupo habilitada e o temporizador 0 opera no modo 1 com
prioridade alta, uma vez que o display deve ser atualizado perioridamente.
Nas definies tem-se ainda a atribuio dos valores iniciais das variveis. A seguir os Leds
de sada so rotacionados (ligados e desligados em sequncia) antes do programa entrar em um
lao de espera. No lao de espera os Leds que indicam os nveis disponveis ficam piscando,
aguardando a escolha do usurio. Uma vez feita a escolha do nvel do jogo, o programa desvia
para o programa escolhido, e mantm ligado o Led correspondente.
Com o intuito de reduzir as informaes no corpo do programa Memorex, foi feita a definio
de variveis fora da tabela principal. Essas variveis so:

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 sequncia 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.

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Figure 1: Circuito do Jogo de Memria

auxiliar equ 02h ; registrador R2 - usado para decrementar a quantidade da tabela, sem alterar R5.
ch_facil equ P3.0 ; chave seletora modo fcil; se ch_facil=0, o processamento desvia para jogo fcil.
ch_medio equ P3.1 ; chave seletora do modo mdio.
ch_dificil equ P3.2 ; chave seletora do modo difcil.
Ledfacil equ P3.3 ; Led que indica modo fcil ativado.
Ledmedio equ P3.4 ; Led que indica modo mdio ativado.

Leddificil equ P3.5 ; Led que indica modo difcil ativado.

O jogo fcil consiste na leitura de uma tabela pr-gravada e na comparao dessa tabela com
os valores digitados pelo usurio. Assim, no incio do jogo, o programa faz a leitura do primeiro
elemento da tabela e mostra nos Leds (esse primeiro valor 01h em todos os nveis). No passo
seguinte o programa faz a leitura da tecla digitada pelo usurio e, ainda dentro dessa subrotina,
faz a comparao do valor digitado com o valor lido da tabela. Caso os valores no sejam
iguais, A = B, o programa desvia para a rotina errou; nessa rotina, aps um perodo de Leds
piscando, o programa volta para o incio. Caso A = B, o registrador auxiliar comparado com
o registrador contador; caso eles sejam diferentes, significa que a sequncia ainda no acabou;
ento o programa volta para o incio da subrotina leitura_facil para ler o prximo valor digitado
pelo usurio. Caso os registradores auxiliar e contador sejam iguais, significa que aquela
sequncia j se encerrou e o nmero de acertos deve ser incrementado, antes do retorno para a
rotina principal do jogo fcil. 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 rotao ininterrupta dos Leds da porta P2.
No jogo mdio, ao contrrio do jogo fcil, a tabela a ser lida construda ao longo do jogo. No
incio do jogo o valor 01h colocado na tabela, no endereo 70h da RAM. Em seguida, o programa
chama a subrotina usada para mostrar o jogo nos Leds, buscando o jogo na memria RAM, a
partir do endereo 70h (Os prximos valores sero guardados nos endereos 71h, 72h, ... medida
que o usurio vai acertando as sequncias mostradas. A nova sequncia repete a sequncia
anterior, adicionando mais um dgito aleatrio). Aps esse procedimento, o programa chama a
2

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Figure 2: Memorex - Definies e Escolha

subrotina leitura_medio, onde o usurio digita a sequncia mostrada, que comparada com
a sequncia da tabela. No incio dessa subrotina o Timer 1 disparado, iniciando o processo de
gerao aleatria do prximo dgito da sequncia. Ao final dessa subrotina o Timer 1 parado.
A continuao do programa similar ao jogo fcil.
A tabela do jogo difcil tambm gerada ao longo do jogo, mas segue uma dinmica um
pouco diferente daquela do jogo mdio. Primeiro, cada nova etapa no jogo difcil tem uma nova
sequncia, com um dgito a mais; segundo, no jogo mdio o valor 01h (primeiro valor de todos
os jogos) sempre colocado no endereo 70h e os demais valores so colocados nos endereos
subsequentes; no jogo difcil o valor 01h tambm o primeiro valor mostrado, mas esse valor
ser sempre o ltimo valor alocado na tabela.
O processo de criao da tabela no jogo difcil segue a seguinte lgica: na primeira sequncia,
de apenas um dgito, o valor 01h colocado no endereo 71h (70h + contador). Quando o
usurio acerta esse dgito, um nmero aleatrio (gerado usando o Timer 1) alocado nesse
endereo (71h) e o valor 01h colocado no endereo 72h. Na prxima sequncia, de 3 dgitos, o
primeiro nmero aleatrio gerado gravado no endereo 72h; o segundo, no endereo 71h e o
nmero 01h, no endereo 73h. Assim, aps cada novo acerto, um novo nmero aleatrio gerado
e armazenado na posio do nmero do ltimo acerto (o armazenamento de novos nmeros
aleatrios no jogo difcil ocorre depois da comparao A = B?, na subrotina leitura_dificil).
Terminada a sequncia atual, o ltimo valor armazenado 01h, na posio correspondente ao
novo valor do contador adicionado de 70h. Dessa forma, a criao da tabela comea no maior
endereo atual e termina com o valor 01h, no novo maior valor de endereo (contador + 1). A
leitura da tabela feita de forma decrescente,a partir do endereo 70h + contador.
3

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Table 1: Programa Memorex - Definies e Escolha do Jogo


Rtulo

Mnemnico
org 00H
ljmp inicio

Rtulo

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:

Mnemnico
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

Rtulo
escolha:

Mnemnico
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 Fcil

Finalizando o programa do projeto Memorex, tem-se a rotina que executada quando o


usurio erra a sequncia e a rotina executada quando o usurio completa o jogo, ou seja, acerta
todas as sequncias at a ltima, que contm 20 dgitos. A subrotina display chamada a cada
10 ms, ao final de cada contagem do temporizador 0. Essa subrotina mostra o dgito de unidade
e de dezena no display de 7-segmentos, indicando o nmero de acertos do jogador. A subrotina
aleatrio chamada a cada final de contagem do temporizador 1; ela rotaciona para a direita o
valor presente no registrador sequencia, gerando um novo dgito a ser usado nos nveis mdio
ou difcil.

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Figure 4: Memorex - Jogo Fcil: escolha do usurio

Table 2: Programa Memorex - Jogo Fcil


Rtulo
jogo_facil:

Mnemnico
setb Ledfacil
clr Ledmedio
clr Leddificil
mov contador,#01
lcall atraso

Rtulo
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:

Mnemnico
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

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Figure 5: Memorex - Jogo Mdio

Figure 6: Memorex - Jogo Mdio: Escolha do usurio

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Table 3: Programa Memorex - Jogo Mdio


Rtulo
jogo_medio:

processo_medio:

Mnemnico
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

Rtulo
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:

Mnemnico
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 Difcil

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Figure 8: Memorex - Jogo Difcil: Escolha do usurio

Table 4: Programa Memorex - Jogo Dificil


Rtulo
jogo_dificil:

processo_dificil:

tabela_dificil:

mostra_dificil:
mostra2:

Mnemnico
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

Rtulo
leitura_dificil:
volta:
espera:
segue:

pressionado:

compara:

Mnemnico
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

Memorex v. 3.0 Janeiro 2015 Projetos com Micro

Figure 9: Memorex - Atrasos de tempo

Table 5: Programa Memorex - Atrasos de Tempo


Rtulo
atraso:
repete:
rep:

Mnemnico
mov r1,#40
mov r6,#100
mov r4,#100
djnz r4,$
djnz r6,rep
djnz r1,repete
ret

Rtulo
atrasoreduzido:
repete1:
rep1:

Mnemnico
mov r1,#10
mov r6,#100
mov r4,#100
djnz r4,$
djnz r6,rep1
djnz r1,repete1
ret

Rtulo
atrasocurto:
repete2:
rep2:

Mnemnico
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 Aleatria


Rtulo
errou:

Mnemnico
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

Rtulo
display:

Mnemnico
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

Rtulo
dezena:

aleatorio:

Mnemnico
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

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 tenso de alimentao para aproximadamente 5 V foi utilizado um diodo 1N4001.

Figure 11: Montagem do Jogo de Memria

10