LED DICE
with PIC


This
project uses an 8-pin microcontroller to produce a tumbling dice via red LEDs.

There are lots of DICE projects on the web and many of them are copies of our original LED Dice with slowdown.
The circuit and layout has been copied by many websites and it is pleasing to know that thousands of hobbyists have built our circuit and enjoyed its features.
We now show how the same effect can be produced with a microcontroller and a few resistors. The circuit is simpler, the board is smaller and the project costs less than the original design.
That's the advantage of the microcontroller.
This project is parts of a course where we show how to design around a microcontroller because this is the way of the future.
Once you collect the equipment necessary to burn the microcontroller, and set-up your computer with NotePad2, to write the programs you will have 2 separate areas in your work-room.
One area will consists of a soldering iron, components and experimenter boards, where you design and develop the project. The other area will consist of a computer with
NotePad2, where you write the program using mnemonics (short sentences) and compile it with MPASM to produce a .asm file as well as a .hex file.
The .hex file will then be used by WinPIC to burn the micro (program the micro).
Take the micro from the programming socket on PIC Programmer MkIV, insert it into the project and view the results. 
This is just like designing and producing your own chip.

Here are some of the Dice projects and kits on the web:


The Spikenzielabs project does not
have a "rolling effect."
The piezo under the board
is tapped to change the LEDs.
It is a $20.00 soldering project.
The .asm program is very messy 


This $13.00 LED Dice from lightinthebox.com
is already built and
does not teach any electronics.


Another LED Dice project but no
program provided



This project uses the same chip as our project but
the PICAXE 08M chip is already programmed with
routines and costs more than $5.00
You select the routines from a list to create a program
but you are not "PIC programming."


A Velleman kit. They are trying to
sell old technology!! Note the
"windowed" PIC chip!!!!!


This kits costs about $18.00 but the
microcontroller is unknown.


A LED Dice project constructed on Matrix Board.
Only the .hex file is provided.


This project uses ATTiny-13 micro.
The PC board should have current-limiting resistors.
The display does not have a "rolling Dice" effect.


Another ATTiny-13 micro LED Dice project
A nice layout showing how to add surface-mount components.


This is the front page from a Silicon Chip project
but the remainder of the article cannot be located.

None of the Dice projects on the web teach how to create a program and they are simply soldering exercises.
Ours is an EDUCATIONAL PROJECT.
We explain every instruction in the program so you can use them in the next project you are developing.

Here's an interesting comment from Doug Jackson, writing for Silicon Chip:

Let’s settle an argument before it starts. Die or Dice? Sure, the Oxford Dictionary would have us say one die, two dice. But every man and his dog uses the word "dice" for both singular and plural. So we’ll stick with dice.

Using a PIC allows us to significantly simplify our dice circuit. Previous designs have typically used at least two ICs, four or more transistors and many resistors and capacitors.

This project an ideal way for a beginner in micros to get a grasp of the fundamentals.

The 8-pin PIC micro we are using has 6 input-output lines and one line that is INPUT-ONLY.
We will use the input line for the switch and 4 of the other lines as OUTPUTS.
Each output line can deliver 25mA. This limitation is due to the FET transistors inside the the chip. Obviously they are microscopic and 25mA is a great achievement. Many of the other microcontrollers can only deliver 20mA per drive-line.

DRIVE CURRENT
Drive Current is the current delivered to each LED to make it illuminate.
There is a very wide range of LEDs on the market, from surface-mount, to 3mm to 5mm and they range from very poor quality to bright, high-bright and super bright.
Some LEDs require 20mA to produce good illumination while others produce a very good output with as little as 2 to 5mA.
On top of this, different colour LEDs have a different characteristic voltage-drop across them when illuminated and all these factors have to be taken into account when determining the value of the current-limiting resistor for each output.
One output has a single LED while the other outputs have two LEDs in series.
The value of dropper resistor for the single LED can range from   R for a red LED requiring 5mA, to R for an orange LED requiring 20mA.
We have selected 68R for the 2 LEDs in series to provide about 10mA and 82R for the single LED to provide about 20mA.
Look at the illumination; decide which value is most suitable and adjust the current accordingly.
Red LEDs drop about 1.7v when illuminated, orange LEDs about 2v, and green LEDs about 2.3v.
This value does not change if the LED is surface-mount or 5mm, but it does change slightly when the current is increased.  

THE LED DICE PROJECT
This project is very simple because all the features are contained in the microcontroller in the form of a program.
Instead of a two chips and a lot of surrounding timing components, as in previous LED Dice projects, we have a single chip driving the 7 LEDs and
a few current limiting resistors.
You can approach this project in several different ways at different levels.
You can simply buy a kit and put it together.
Or you can buy the components from your local electronics store and burn the program into the micro using PIC Programmer MkIV project and the .hex file provided.
Or you can go further and change some of the instructions in the program to produce different "rolling effects." For this you will need the .asm file
All these levels are available because we have provided the full program listing plus hardware and software to get you into PIC Programming at the lowest cost.
The circuit is very simple. It just consists of a micro, 7 LEDs, resistors and a "roll" switch.


LED DICE circuit using a PIC12F629 Microcontroller

The only components that may have to be adjusted are the current-limiting resistors, to get the desired brightness. We have suggested values for super-bright red LEDs, but if you want to use other colours you may have to decease the values slightly. For white LEDs, the supply voltage will have to be increase to at least 4.5v. This modification is covered in the article on the web.
You can build this project as a soldering exercise or go further and investigate the program and change some of the instructions to produce different “rolling” effects.


The LED Dice project constructed on Matrix Board.


The underside of the board showing the "point-to-point" wiring.


The topside of the Matrix Board and the underside wiring

When the circuit is switched on, the tactile switch is pressed and the LEDs flash to represent the rolling of the dice.
The “rolling” gradually slows and a result appears on the LEDs. After 6 seconds the LEDs go out and the switch can be pressed again for another “roll.”

 

LED Dice 
PARTS LIST 

3  -  100R
1  -  220R
1  -  47k
7  -  3mm high-bright red LEDs
1  -  8 pin IC socket
1  -  PIC12F629 microcontroller with DICE
1  -  tactile switch
1  -  mini on-off slide switch
1  -  coin cell holder
1  -  3v lithium coin cell  CR2032
Fine tinned copper wire  - 30cm
Fine enamelled wire – 30cm
Fine solder – 30cm

1  -  Matrix Board  11 x 12 hole

Buy a kit 
(LED Dice)

 

Here are the files you will need to burn the program into the PIC12F629 micro:

Dice.asm
Dice.txt
Dice.hex
Dice_hex.txt
Dice.zip

	
;*************************************************************
;;LED Dice.asm         *


;7 LEDs  - slow down and stops on a random face of a dice -
	

	list	p=12F629
	radix	dec
	include	"p12f629.inc"
	
	errorlevel -302	; Dont complain about BANK 1 Registers 

	__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	
	; globals
	;20h		;this is the first available file


fileA	equ		26h
fileB	equ		27h	
fileC	equ		28h
fileD	equ		29h	
temp1	equ		2Ah
temp2	equ		2Bh
temp3	equ		2Ch

random	equ		30h


	;5Fh		;this is the last available file

status		equ	03h
option_reg	equ 	81h


	; bits on GPIO
				
pin7		equ	0	;GP0  
pin6	 	equ	1	;GP1
pin5		equ	2	;GP2 
pin4		equ	3	;GP3 input only
pin3		equ	4	;GP4 
pin2		equ	5	;GP5 


	;bits
				
rp0	equ	5	;bit 5 of the status register
		

Start	org	0x00	;program starts at location 000
	nop
	nop
	nop
	nop		;NOPs to get past reset vector address
	nop
	nop


SetUp	bsf	status, rp0 	;Bank 1	
	movlw   b'11001000' 	;GP3 input
 	movwf   TRISIO 
        bcf	status, rp0	;bank 0   
	movlw   07h     	;Set up W to turn off Comparator ports
        movwf   CMCON       	;must be placed in bank 0
        clrf 	GPIO       	;Clear GPIO of junk	
	clrf	random
	goto 	Main	
		
		
	
	;Delay  - slow-down
        ;This is where the random number is generated. The micro very
        ;quickly comes to Del_1 while the switch is still pressed and
        ;increases Random very quickly until the switch is released.  

Del_1	movlw 	01h
	movwf 	fileC
	movf	temp1,0
	movwf	fileB	
DelY	decfsz 	fileA,1		
	goto 	DelY
	btfsc	GPIO,3
	goto	_AA
	incf	random,1
	movlw	07
	subwf	random,0
	btfss	03,0	    ;test the Carry.  
	goto	_AA         ;Carry is SET if W is less than or equal
	clrf	random
	incf	random,1			
_AA	decfsz 	fileB,1		
	goto 	DelY
	decfsz 	fileC,1
	goto 	DelY
	retlw 	00
		
	;This is the final display-delay before going blank
		
Del_10	movlw 	12h
	movwf 	fileC		
DelZ	decfsz 	fileA,1		
	goto 	DelZ	
	decfsz 	fileB,1		
	goto 	DelZ
	decfsz 	fileC,1
	goto 	DelZ
		
		
	;This is where the program blanks the display and makes the
        ;inputs/outputs into inputs to reduce the 
        ;current during SLEEP	

blank	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'	;Set GP 1,2 4 5 input
	movwf	TRISIO	   	;	
	movf	GPIO,0
	movlw	b'00001000' 	;must clear the GPIF flag!!
	movwf	INTCON
	bsf	IOC,3
	sleep
	nop
	bcf	status, rp0	;bank 0  
	goto	SetUp
		
			
				
cycle	movlw 	0Ch
	movwf	temp3
	movlw	20h
	movwf	temp2
cycle1	call 	face1
	incf	temp2,1
	incf	temp2,1
	incf	temp2,1
	movf	temp2,0
	movwf	temp1
	call 	Del_1
		
	call 	face2
	incf	temp2,1
	incf	temp2,1
	incf	temp2,1
	movf	temp2,0
	movwf	temp1
	call 	Del_1
		
	call 	face3
	incf	temp2,1
	incf	temp2,1
	incf	temp2,1
	movf	temp2,0
	movwf	temp1
	call 	Del_1
		
	call 	face4
	incf	temp2,1
	incf	temp2,1
	incf	temp2,1
	movf	temp2,0
	movwf	temp1		
	call 	Del_1
		
	call 	face5
	incf	temp2,1
	incf	temp2,1
	incf	temp2,1
	movf	temp2,0
	movwf	temp1
	call 	Del_1
		
	call 	face6
	incf	temp2,1
	incf	temp2,1
	incf	temp2,1
	movf	temp2,0
	movwf	temp1
	call 	Del_1
	decfsz	temp3,1		
	goto 	cycle1		
	retlw	00 
	
		
end1	call 	face1
	movf	temp2,0
	movwf	temp1
	call 	Del_1	
	retlw	00
		
end2	call 	face2
	movf	temp2,0
	movwf	temp1
	call 	Del_1	
	retlw	00		
		
		
end3	call 	face3
	movf	temp2,0
	movwf	temp1
	call 	Del_1	
	retlw	00	
				
end4	call 	face4
	movf	temp2,0
	movwf	temp1
	call 	Del_1	
	retlw	00	
		
		
end5	call 	face5
	movf	temp2,0
	movwf	temp1
	call 	Del_1	
	retlw	00			
		
			
		
face1	movlw	b'00010000'		; 
	movwf	GPIO
	retlw 	00				
		
		
face2	movlw	b'00000100'		;
	movwf	GPIO
	retlw 	00	
		
		
face3	movlw	b'00010100'		; 
	movwf	GPIO
	retlw 	00			

		
		
face4	movlw	b'00000110'		;  
	movwf	GPIO
	retlw 	00	
		
		
face5	movlw	b'00010110'		;
	movwf	GPIO
	retlw 	00	
		

face6	movlw	b'00100110'		; 
	movwf	GPIO
	retlw 	00	
				
				
						
finish1	call	end1
	goto	Del_10		
		
finish2	call	end1
	call	end2
	goto	Del_10			
			
finish3	call	end1
	call	end2
	call	end3
	goto	Del_10	
		
finish4	call	end1
	call	end2
	call	end3
	call	end4
	goto	Del_10			
			
finish5	call	end1
	call	end2
	call	end3
	call	end4
	call	end5
	goto	Del_10					
		
			
       ;This is where the Random number is decremented to produce the
       ;final value on the display 
			
Main	btfsc	GPIO,3
	goto	Main
	call	cycle
Main1	decfsz	random,1
	goto	Main2
	goto	finish1
Main2	decfsz	random,1	
	goto	Main3
	goto	finish2
Main3	decfsz	random,1	
	goto	Main4
	goto	finish3
Main4	decfsz	random,1	
	goto	Main5
	goto	finish4
Main5	decfsz	random,1			
	goto	Del_10
	goto	finish5			
		

	;oscillator calibration


		call 	03FFh
		movwf	OSCCAL	
		

	end


ooo00000ooooooxx
 

12-8-2013