Using RAM in 8051s
(Build your own Simon game)
All 8051s have Random Access Memory (RAM) which
is used to hold data while the program is running. Almost every program
you write uses some type of memory. The 2051 has 128 bytes of RAM. Each
byte is given an address starting at 0 and going to 127. In the previous
examples we have used Registers R0 - R7. Each register is a byte of memory
located in the RAM. These 8 registers are easier to access and use than
the majority of the RAM space. R0 - R7 use the memory locations (addresses)
0 - 7. In this example we will use locations 32 to 127 to store the sequence
of colors that must be repeated in the game. This means the sequence could
be as long as 96 before we run out of memory. That should be plenty. I
usually blow it when the sequence gets to about 15.
The Game
The object of the game is to repeat a sequence
of colors that the game gives you. If you get it right, one random color
is added to the sequence and you have to repeat it. If you get it wrong
you have to start over with a new sequence.
One important part of the program is generating
a random color to be the next color in the sequence. This is done by having
a counter (we will use register R3) that is always counting and then when
a button is pushed the next color in the sequence is determined by the
number in R3.
The program starts by waiting for the player to
hit the button for the red LED. Then the first color in the sequence (as
determined by the value in R3) is stored in memory location 32 (20 Hex)
and the LED for that color is flashed. Then the program calls the USERS_TURN
routine and compares the user input to the value in memory to see if the
user pressed the right button. R3 keeps counting while the program waits
for the user to press a button. If the user presses the right button then
the program uses the value in R3 to get the next color in the sequence
and stores that in memory and shows the user the current sequence of colors.
This continues until the user screws up and the program starts back over
at one color in the sequence.
Memory Access
RAM can be accessed using either direct or indirect
addressing. In the previous tutorials we have used direct addressing with
the R0 - R7 registers. For example, "MOV A, R0" reads the value from the
R0 memory location and stores it in the A location. That is easy to see.
Indirect addressing is a little more complicated. With it you use either
R0 or R1 to hold the address that you want to access. Then you use the
command "MOV A, @R0". This tells the processor that you want to get the
data from the memory location specified by R0. Got that? It sounds complicated
but once you master it, it is really useful.
For example, suppose you want to read from memory
location 50H using indirect addressing. You can use:
MOV R0, #50H
(moves the number 50H into R0)
MOV A, @R0
(reads the value from memory address 50H and stores it in A)
It seems silly for reading one byte from memory
but suppose you want to read all the data in memory. You can do it with
direct addressing but you need 128 seperate MOV commands (one for
each memory location). (Like "MOV A, 30H"). With indirect addressing you
can read all of memory with a simple loop.
MOV R0, #00H
LOOP:
MOV A, @R0
INC R0
AJMP LOOP
Each time through the loop the value in R0 is
incremented by 1 and the MOV instruction transfers the value from the next
memory location into A.
The Hardware
Start by building the circuit as shown in the
basic 2051 setup (Making
an LED Blink - 2051).
At this point you should be familiar with LEDs
and switches. The hardware for this project is simple. Connect a blue LED
from 5 volts to P1.2 (pin 14) on the 2051.
Connect a red LED from 5 volts to P1.3 (pin 15)
on the 2051.
Connect a green LED from 5 volts to P1.4 (pin
16) on the 2051.
Connect a yellow LED from 5 volts to P1.5 (pin
17) on the 2051.
Connect a button for the blue LED from ground
to P3.2 (pin 6) on the 2051.
Connect a button for the red LED from ground
to P3.3 (pin 7) on the 2051.
Connect a button for the green LED from ground
to P3.4 (pin 8) on the 2051.
Connect a button for the yellow LED from ground
to P3.5 (pin 9) on the 2051.
The program is repeat.asm. It is included on the
software CD with the Microcontroller
Beginner Kit. Compile the program using TASM
and load the hex file into the 2051. Put the 2051 into the circuit and
connect the power. For a nice assembly language editor, use AY
Pad.
For an interesting variation, try replacing the
LEDs with a speaker. Use a different sound (like the ones from the sound
tutorial) for each button.
All the parts required for this project (except
blue LED) are included in the Microcontroller
Beginner Kit. (Use another red LED in place of the blue LED.)
Back
To Tutorials Menu
Previous
- Building a Digital Clock
Other
- Using the 8051 EEPROM (non volatile memory)
Other
- Using a Light Sensor
Catalog
-- Support -- Privacy
Policy -- About Us
This page last updated on December
2, 2004.
|