5x7 Display Experiments Page10

EXPERIMENT-26   LED Dice
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