Page9
This experiment is very similar to some of the LED Dice programs you have seen in other magazines - only it’s BETTER!
Instead of using a single LED to indicate the numbers on the face of a dice (actually a single Dice is called a Die!), we have used a group of LEDs. It’s difficult to get a good pattern for the spots on a 5x7 matrix but we have done a reasonable job. Your challenge is to improve the layout or produce a special display.
Once the pattern for the numbers has been worked out on paper (as shown in the diagram below), the values can be put into a table or set of sub-routines. Five values are needed for each of the six numbers as the display shows the complete face of the dice.
The next thing is to decide on the random number generator. We have already explained the two ways of generating random numbers; via a computer program or via a table. On a previous page we generated random numbers via a computer program for a tumbling dice and found the program was heavily biased towards two of the numbers. We then had to “weight” or modify the program to create an even distribution.
By producing a table, you can adjust any value to suit a particular outcome and not have to worry about the “accuracy of statistics” to come to your rescue thousands of tosses down the track!
So, where do you start? I simply looked at the previous experiments and in Expt 18, found exactly what I needed. It shows how to scan 5 cells of an animation. So, I copied the 100 lines of code and got a very good start. From the diagram below, the value for each file was placed in each sub-routine and a sixth sub-routine included in the program. The Main program was changed to allow the six Face sub-routines to be called and the project was run and tested to see the result on the display.
The instruction for Button A was then added to Main6 and a sub-routine (called XX) was added that CALLed table1. The result from the table is a number from 1 to 7. This is where a clever feature comes in. If the table value is “1”, the result after decrementing is zero and this indicates the end of table. The “table pointer” (also called a Jump Value) is zeroed (file 1C) so that the program starts at the top of the table again. This gives us 6 remaining values and by decrementing the result from the table the program can be sent to Face 1, 2, 3,4 5, or 6.
Each of the Face sub-routines loads 5 files with values that will illuminate the required LEDs on the display and the micro is sent to the Scan routine to provide one pass of the display. To scan the display for 1/10th of a second, for example, requires a number of loops of the Scan routine and this is achieved in the Main routine. The “on time” for each number can be adjusted by the value loaded into file 0C. We have progressively increased this time to give the effect of the dice slowing down.
The main routine displays 5 brief numbers on the display then settles in a loop with the sixth value. Pressing button A will take the micro out of the loop.
The Jump Value for the table is incremented in the Main routine.
The number of values in the table is not divisible by 6 so that the program will go through the table a number of times before the same sequence is repeated.
Experiment-26 for “5x7 Display” Project
;PIC16F84 and only F84 chip
;LED Dice
Start ORG 0x00 BSF 03,5 ;Go to page1 for setting-up the ports MOVLW 04h ;Put 04 into W MOVWF 05h ; to make RA2 input for button A MOVLW 00h ;Put 00 into W MOVWF 06h ;and make port 6 (port B) all output BCF 03,5 ;Go to page0 for programming MOVWF 1Ch GOTO Main Table1 ADDWF 02h,1 ;Add W to Program Counter RETLW 03h RETLW 07h RETLW 06h RETLW 04h RETLW 02h RETLW 06h RETLW 07h RETLW 03h RETLW 05h RETLW 02h RETLW 02h RETLW 03h RETLW 05h RETLW 04h RETLW 02h RETLW 07h RETLW 06h RETLW 07h RETLW 04h RETLW 03h RETLW 02h RETLW 05h RETLW 07h RETLW 06h RETLW 03h RETLW 02h RETLW 02h RETLW 03h RETLW 04h RETLW 05h RETLW 04h RETLW 03h RETLW 07h RETLW 04h RETLW 06h RETLW 07h RETLW 02h RETLW 03h RETLW 04h RETLW 05h RETLW 01h Face1 MOVLW 00h ;place the 5 values into the 5 MOVWF 11h ; files to produce the first face MOVLW 08h MOVWF 12h MOVLW 1Ch MOVWF 13h MOVLW 08h MOVWF 14h MOVLW 00h MOVWF 15h GOTO Scan Face2 MOVLW 03h ;place the 5 values into the 5 MOVWF 11h ; files to produce the second face MOVLW 03h MOVWF 12h MOVLW 00h MOVWF 13h MOVLW 60h MOVWF 14h MOVLW 60h MOVWF 15h GOTO Scan Face3 MOVLW 03h ;place the 5 values into the 5 MOVWF 11h ; files to produce the third face MOVLW 0Bh MOVWF 12h MOVLW 1Ch MOVWF 13h MOVLW 68h MOVWF 14h MOVLW 60h MOVWF 15h GOTO Scan Face4 MOVLW 63h ;place the 5 values into the 5 MOVWF 11h ; files to produce the fourth face MOVLW 63h MOVWF 12h MOVLW 00h MOVWF 13h MOVLW 63h MOVWF 14h MOVLW 63h MOVWF 15h GOTO Scan Face5 MOVLW 63h ;place the 5 values into the 5 MOVWF 11h ; files to produce the fifth face MOVLW 6Bh MOVWF 12h MOVLW 1Ch MOVWF 13h MOVLW 6Bh MOVWF 14h MOVLW 63h MOVWF 15h GOTO Scan Face6 MOVLW 6Bh ;place the 5 values into the 5 MOVWF 11h ; files to produce the sixth face MOVLW 6Bh MOVWF 12h MOVLW 00h MOVWF 13h MOVLW 6Bh MOVWF 14h MOVLW 6Bh MOVWF 15h GOTO Scan Scan BSF 05,1 ;Reset 4017 NOP BCF 05,1 MOVF 11h,0 ;Move file 11 into W MOVWF 06h CALL DelD MOVF 12h,0 ;Move file 12 into W MOVWF 06h CALL DelD MOVF 13h,0 ;Move file 13 into W MOVWF 06h CALL DelD MOVF 14h,0 ;Move file 14 into W MOVWF 06h CALL DelD MOVF 15h,0 ;Move file 15 into W MOVWF 06h CALL DelD RETURN DelD DECFSZ 1Bh,1 GOTO DelD MOVLW 00h ;Zero port B to prevent mirroring MOVWF 06 Clk BSF 05,0 ;Clock the 4017 NOP BCF 05,0 RETURN XX MOVF 1Ch,0 ;Move 1C to W CALL Table1 MOVWF 1Dh ;Move W to 1D for decrementing DECFSZ 1Dh,1 GOTO XX1 MOVLW 00 ;Detects end of table MOVWF 1Ch ;Zero 1C to start at top of table GOTO XX XX1 DECFSZ 1Dh,1 GOTO XX2 GOTO Face1 XX2 DECFSZ 1Dh,1 GOTO XX3 GOTO Face2 XX3 DECFSZ 1Dh,1 GOTO XX4 GOTO Face3 XX4 DECFSZ 1Dh,1 GOTO XX5 GOTO Face4 XX5 DECFSZ 1Dh,1 GOTO Face6 GOTO Face5 Main MOVLW 30h ;Each 10h represents 100mS MOVWF 0Ch Main1 CALL XX DECFSZ 0Ch GOTO Main1 INCF 1C MOVLW 40h ;Each 10h represents 100mS MOVWF 0Ch Main2 CALL XX ;Display Face for 400mS DECFSZ 0Ch GOTO Main2 INCF 1C MOVLW 50h ;Each 10h represents 100mS MOVWF 0Ch Main3 CALL XX ;Display Face for 500mS DECFSZ 0Ch GOTO Main3 INCF 1C MOVLW 60h ;Each 10h represents 100mS MOVWF 0Ch Main4 CALL XX ;Display Face for 600mS DECFSZ 0Ch GOTO Main4 INCF 1C MOVLW 70h ;Each 10h represents 100mS MOVWF 0Ch Main5 CALL XX ;Display Face for 700mS DECFSZ 0Ch GOTO Main5 INCF 1C Main6 CALL XX ;Display until button A pressed BTFSS 05,2 ;Test for button A GOTO Main6 GOTO Main END
The DICE
The block of numbers below is the HEX file for Experiment-26. Copy and paste it into a text program such as TEXTPAD or NOTEPAD and call it: Expt-26.hex
:100000008316043085000030860083129C00A628E9 :1000100082070334073406340434023406340734C8 :100020000334053402340234033405340434023416 :1000300007340634073404340334023405340734F7 :1000400006340334023402340334043405340434F3 :1000500003340734043406340734023403340434DC :100060000534013400309100083092001C309300B8 :10007000083094000030950074280330910003305C :100080009200003093006030940060309500742836 :10009000033091000B3092001C30930068309400C4 :1000A0006030950074286330910063309200003016 :1000B000930063309400633095007428633091009E :1000C0006B3092001C3093006B30940063309500CD :1000D00074286B3091006B309200003093006B30CD :1000E00094006B3095007428851400008510110869 :1000F0008600872012088600872013088600872044 :1001000014088600872015088600872008009B0BAE :1001100087280030860005140000051008001C0820 :1001200008209D009D0B972800309C008F289D0B78 :100130009A2832289D0B9D283D289D0BA0284828F1 :100140009D0BA32853289D0B69285E2830308C0016 :100150008F208C0BA8289C0A40308C008F208C0BA1 :10016000AE289C0A50308C008F208C0BB4289C0A3F :1001700060308C008F208C0BBA289C0A70308C0069 :100180008F208C0BC0289C0A8F20051DC428A62810 :00000001FF
Go to the next page of experiments: 5x7 EXPERIMENTS: Page-11
Quick Links
Legal Stuff
Social Media