Let’s create a digital dice using 8051 microcontrollers in assembly language. This is very basic problem and will help you to learn very core concepts of 8051 microcontroller assembly language programming. By creating a digital dice using 8051 microcontroller you will get hands on experience on how to make use of most widely used instructions of 8051 assembly language. We will create this digital dice using 8051 microcontrollers with the same concept which is implemented in the 1 digit 7 segment based up counter in 8051 microcontrollers.
Dice Pattern LEDs Interfacing and Global Variables
To create a digital Dice we need to put the 5 LEDs to the 8051 microcontrollers in a dice manner. We will display the different dice patterns onto the LEDs later. So We are going to use the P1 of the 8051 microcontroller. We will use the pins of P1 and use the LEDs attached to the P1 to display the dice 🎲 pattern. In the code we will make a reference to the global variables like this
SEG_DISP P1 DIGIT1 30H SW1 BIT P3.0 TEMP_CNT 32HCode language: ARM Assembly (armasm)
The other global variables which we are using is one Switch called SW1 in above code interfaced at the pin P3.0 of the 8051 microcontroller. One DIGIT1 variable is used to store the random pattern which we will generate by incremental counter. One TEMP_CNT which is the label to the 32H memory location in the RAM in case if we need it later.
Saving Bytes in Code Memory in 8051 Assembly
We are creating dice patterns and saving it in code memory of the 8051 microcontrollers by using the DB instruction available in 8051 assembly language. We can use this instruction to let compiler know that the value would be stored as it is in the code memory. This is a similar approach made in 1 digit 7 segment up counter with 8051 microcontrollers. So, we can simply save the dice patterns from 1 to 6 in the code memory like following.
;================================================ SEG_CODES: DB 11111111B ;0 DB 11110111B ;1 DB 11011101B ;2 DB 11010101B ;3 DB 10011100B ;4 DB 10010100B ;5 DB 10001000B ;6 END
These are patterns used in such a manner that it would mimic the combination of LED’s attached in dice pattern.
Generating a Random Number in 8051 Assembly
There are lot of ways to implement random pattern, from simplest to most complex. We are going to implement the digital Dice Random Pattern with very simple incremental Counter. the Incremental Counter method would simply count from starting point to the max value we need to generate a random number. We stop it at random position and once the incremental counter is stopped, whatever value it would be at that time, that is our random value from min value to max value to be generated as a random number.
This method is one of the easiest to implement in 8051 assembly language and could serve the purpose of the random number generations. There are some limitations to it which could be overcome by extending the algorithm. But in our case where we only need to generate the random number from 1 to 6 in 8051 assembly language this is one of the most suited methods.
One thing we should keep in mind that we should make the counter so fast that it would count at max speed so when user release the button user cannot guess what number it would generate. If you make the counting slow down by some delay, user would be able to guess the number it would stop at. This will make it work as a digital Dice with a good game play.
;================================================ UPCNT1: MOV A,#7 INC DIGIT1 CJNE A,DIGIT1,UPCNT1_EXIT MOV DIGIT1,#1 UPCNT1_EXIT: RETCode language: PHP (php)
Adding a Touch of Game Play
We can add a touch of game play by letting user think he can generate the number of whatever he can. This is similar to rolling the dice. When user rolls the dice he shake it well. So we can add a similar effect by letting user think that he can generate the desired number. We are mimicing this by letting the counter keep counting until the user presses the button. So if the user keep pressing the counter will keep counting. Once the user release the button 🔳, it will stop the counter and displays the output to the LED port.
MOV DIGIT1,#0 ;NUMBER TO BE DISPLAYED ACALL DISPLAY MAIN: JNB SW1,ACTION1 ACALL DELAY1 INC TEMP_CNT ACALL UPCNT1 SJMP MAIN ACTION1: MOV R0,#TEMP_CNT A1L1: MOV P1,#255 MOV R7,#255 A1L2: DJNZ R7,A1L2 ACALL UPCNT1 ACALL DISPLAY ACALL DELAY DJNZ R0,A1L1 JNB SW1,ACTION1 SJMP MAIN ;================================================Code language: ARM Assembly (armasm)
Complete Digital Dice 8051 Assembly Code
Here is the complete code in 8051 assembly language to roll a digital dice 🎲
;================================================ ; ; DIGITAL DISE PROGRAME ; ; ;================================================ SEG_DISP EQU P1 DIGIT1 EQU 30H SW1 BIT P3.0 TEMP_CNT EQU 32H ;================================================ MOV DIGIT1, ACALL DISPLAY MAIN: JNB SW1,ACTION1 ACALL DELAY1 INC TEMP_CNT ACALL UPCNT1 SJMP MAIN ACTION1: MOV R0, A1L1: MOV P1, MOV R7, A1L2: DJNZ R7,A1L2 ACALL UPCNT1 ACALL DISPLAY ACALL DELAY DJNZ R0,A1L1 JNB SW1,ACTION1 SJMP MAIN ;================================================ DISPLAY: MOV DPTR, MOV A,DIGIT1 MOVC A,@A+DPTR MOV SEG_DISP,A RET ;================================================ UPCNT1: MOV A, INC DIGIT1 CJNE A,DIGIT1,UPCNT1_EXIT MOV DIGIT1, UPCNT1_EXIT: RET ;================================================ DELAY1: MOV R7, DJNZ R7,$ RET DELAY: MOV R5, MOV R6, MOV R7, DLOOP: DJNZ R5,$ DJNZ R6,DLOOP DJNZ R7,DLOOP RET ;================================================ SEG_CODES: DB 11111111B ;0 DB 11110111B ;1 DB 11011101B ;2 DB 11010101B ;3 DB 10011100B ;4 DB 10010100B ;5 DB 10001000B ;6 ENDCode language: AVR Assembler (avrasm)