LEGO CHASER


Home


  Buy Lego Chaser kit

PIC Programmer MkV

Instruction Set for PIC12F629
PIC12F629 data
(pdf)
BlankF629.asm

PIC12F629.inc

See more projects using micros:
Pic A PIC Project

Notepad2.zip     Notepad2.exe 
Library of Sub-routines "Cut and Paste
"
Library of routines:   A-E   E-P    P-Z 

 

 

This project is constructed with surface-mount components and is small enough to be included in all types of models. It is about the size of a Lego block and that's why we have called it LEGO CHASER.
This circuit uses a PIC12F629 microcontroller chip. This 8-pin chip produces 7 different animations on a 10 LED display. The animations are selected by the position of a 100k pot and when the animation is showing, the pot can be adjusted to increase the speed of the animation.
"Position 10" on the pot cycles through the 7 animations.

A kit of components (matrix board for the chip plus a short strip of blank PC board for the LEDs), surface-mount resistors, capacitors, transistor, diode, switch, cells, battery holder, pot and 20 yellow LEDs with programmed PIC12F629 chip is available for $15.00 plus $5.00 postage. Click the link above and you will be sent an email with the costs. This is an ideal project you get you into surface-mount technology and you can add it to a model layout or build it into a Lego brick for a junior member.

Wiring the two ten-LED displays


The project has two 10-LED displays. One on the front and one on the back. You can use only one display if required.


Two of the 7 animations

Here are the files:
LegoChaser.asm
LegoChaser.hex

 

;****************************************************************
;Started 10-1-2010  	Lego Chaser 12F629.asm
;Two displays of 10 LEDs in a "LEGO BLOCK"
;100k pot serves two purposes.  Chip detects position of pot (1-10) 
;when switched on. Pot adjusts speed of scan for each routine 
;****************************************************************

	list	p=12F629
	radix	dec
	include	"p12f629.inc"
	
	errorlevel	-302	; Don't complain about BANK 1 
	errorlevel	-301

	__CONFIG    _MCLRE_OFF & _CP_OFF 
              & _WDT_OFF & _INTRC_OSC_NOCLKOUT  ;Internal osc.



;****************************************************************
; variables - names files and bit equates
;****************************************************************


		;Files for 12F629 start at 20h 
 
	
	; globals
loops	equ 	20h	;used in "Al-TO" and "All" subroutines
tempA	equ 	21h	;used in _XmS delay
tempB	equ 	22h	;used in Fire sub-routine
tempC	equ 	23h	;used in Fire sub-routine
tempD	equ 	24h	;used in Hole sub-routine
tempE	equ	25h	;used in Hole sub-routine
tempF	equ	26h	;used in Hole sub-routine
tempG	equ	27h		
tempH	equ	28h		
fetch	equ	29h	;used in Join sub-routine



fileA	equ	2Ah   	;used for Show3_8 and hole
fileB	equ	2Bh	;pot
fileC	equ	2Ch	;pot
fileD	equ	2Dh	

DelA	equ	2Eh	;used for delay sub-routines
DelB	equ	2Fh	;used for delay sub-routines
DelC	equ	3Ah	;used for delay sub-routines

temp	equ	3Bh	;used for Join sub-routine
temp1_5	equ	3Ch	;used for Join sub-routine
temp6_10 equ	3Dh	;used for Join sub-routine

filezz	equ	5Fh	;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 and T0CkI
pin4		equ	3	;GP3 input only
pin3		equ	4	;GP4 
pin2		equ	5	;GP5 


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



;****************************************************************
;Beginning of program
;****************************************************************

	
Start	org	0x00		;program starts at location 000
		
SetUp	bsf	status,rp0 	;Bank 1	
	movlw	b'10000110'  ;Turn off T0CKI, prescaler for TMR0=1:128
	movwf	option_reg    
	bcf	status,rp0	;bank 0  
	movlw   07h         ;Set up W to turn off Comparator ports
	movwf   CMCON       ;must be placed in bank 0 
	movlw	03fh
	movwf	temp1_5    ;to turn off LEDs 1,2,3,4,5 at start	
	movwf	temp6_10   ;to turn off LEDs 6,7,8,9,10 at start
	clrf 	GPIO       ;Clear GPIO of junk		
	goto 	Main


;*************************************
;* Tables 					*
;*************************************


Table1	addwf	02,1  ;Add W to the Program Counter to create a jump
			;No LEDs on bit 7 is 0 & file cannot be 0ffh
		    ;When bit7=1 delay for LEDs 1,2,3,4,5 is skipped
	retlw	b'01111111'	;outputs LEDs 5,6,7,8,9,10 OFF		
	retlw	b'00111110'	;LED1 on   bit 6=0 = LEDs 1,2,3,4,5,  
				;	 bit 6 = 1 = LEDs 6,7,8,9,10
	retlw	b'00111101'	;LED2 on				
	retlw	b'00111011'	;LED3 on				
	retlw	b'00101111'	;LED4 on				
	retlw	b'00011111'	;LED5 on				
	retlw	b'10111111'	;LED5 off
	retlw	b'01111110'	;LED6 on		
	retlw	b'01111101'	;LED7 on			
	retlw	b'01111011'	;LED8 on		
	retlw	b'01101111'	;LED9 on		
	retlw	b'01011111'	;LED10 on				
	retlw	b'00111110'	;LED1 on				
	retlw	b'00111101'	;LED2 on				
	retlw	b'00111011'	;LED3 on				
	retlw	b'00101111'	;LED4 on				
	retlw	b'00011111'	;LED5 on			
	retlw	b'10111111'	;LED5 off	
	retlw	b'01011110'	;LED6&10 on	
	retlw	b'01011101'	;LED7&10 on		
	retlw	b'01011011'	;LED8&10 on			
	retlw	b'01001111'	;LED9&10 on			
	retlw	b'00111110'	;LED1 on		
	retlw	b'00111101'	;LED2 on		
	retlw	b'00111011'	;LED3 on		
	retlw	b'00101111'	;LED4 on	
	retlw	b'00011111'	;LED5 on	
	retlw	b'10111111'	;LED5 off	
	retlw	b'01001110'	;LED6,9,10 on	
	retlw	b'01001101'	;LED7,9,10 on	
	retlw	b'01001011'	;LED8,9,10 on	
	retlw	b'00111110'	;LED1 on	
	retlw	b'00111101'	;LED2 on	
	retlw	b'00111011'	;LED3 on	
	retlw	b'00101111'	;LED4 on	
	retlw	b'00011111'	;LED5 on	
	retlw	b'10111111'	;LED5 off
	retlw	b'01001010'	;LED6,8,9,10 on	
	retlw	b'01001001'	;LED7,8,9,10 on			
	retlw	b'00111110'	;LED1 on			
	retlw	b'00111101'	;LED2 on			
	retlw	b'00111011'	;LED3 on			
	retlw	b'00101111'		;LED4 on			
	retlw	b'00011111'		;LED5 on			
	retlw	b'10111111'		;LED5 off		
	retlw	b'01001000'		;LED6,7,8,9,10 on	
	retlw	b'00111110'		;LED1 on			
	retlw	b'00111101'		;LED2 on		
	retlw	b'00111011'		;LED3 on		
	retlw	b'00101111'		;LED4 on		
	retlw	b'00011111'		;LED5 on		
	retlw	b'00011110'		;LED1,5 on	
	retlw	b'00011101'		;LED2,5 on	
	retlw	b'00011011'		;LED3,5 on	
	retlw	b'00001111'		;LED4,5 on	
	retlw	b'00001110'		;LED1,4,5 on	
	retlw	b'00001101'		;LED2,4,5 on	
	retlw	b'00001011'		;LED3,4,5 on	
	retlw	b'00001010'		;LED1,3,4,5 on	
	retlw	b'00001001'		;LED2,3,4,5 on	
	retlw	b'00001000'		;LED1,2,3,4,5 on
	retlw	b'11111111'
	retlw  	b'11111111'
		
Table2	addwf	02,1	;Add W to the Program Counter to create a jump
	retlw  	b'00001000'	;all LEDs on  bit 6=0 = LEDs 1,2,3,4,5,
	retlw  	b'01001000'	;bit 6 = 1 = LEDs 6,7,8,9,10		
	retlw	b'00001001'	;LED1 off			
	retlw	b'00001010'	;LED2 off			
	retlw	b'00001100'	;LED3 off			
	retlw	b'00011000'	;LED4 off			
	retlw	b'00101000'	;LED5 off			
	retlw	b'00001000'	;all on
	retlw  	b'01001001'	;LED6 off		
	retlw  	b'01001010'	;LED7 off		
	retlw  	b'01001100'	;LED8 off		
	retlw  	b'01011000'	;LED9 off		
	retlw  	b'01101000'	;LED10 off		
	retlw  	b'01011000'	;LED9 off		
	retlw  	b'01001100'	;LED8 off		
	retlw  	b'01001010'	;LED7 off			
	retlw  	b'01001001'	;LED6 off		
	retlw	b'00101000'	;LED 5 off
	retlw  	b'01001000'	;all on			
	retlw	b'00011000'	;LED 4 off		
	retlw	b'00001100'	;LED 3 off		
	retlw	b'00001010'	;LED2 off			
	retlw	b'11111111'
	retlw  	b'11111111'
	 			
		
		
		
;*************************************
;* Delays 					*
;*************************************

	
	;Delay 1-10mS

_5mS	movf 	fileB,w	   ;get value of pot to create delay-value
	movwf 	DelB	
	nop
	decfsz 	DelA,1		  
	goto 	$-2	
	decfsz 	DelB,1		  	
	goto 	$-4
	retlw 	00
		
	
		;Delay 0.05 sec (50mS)

_XmS	movf	tempA,0	;value from pot position
	movwf	DelB	;value for DelB from pot position
	decfsz	DelA,1
	goto	$-1
	decfsz	DelB,1	
	goto	$-3
	retlw	00		
		
	
	;Delay 0.15 sec (150mS)

_150mS	decfsz	DelA,1
	goto	$-1
	decfsz	DelB,1	
	goto	$-3
	retlw	00
		
	;Delay 0.2 sec (200mS)

_200mS	nop	
	decfsz	DelA,1
	goto	$-2
	decfsz	DelB,1	
	goto	$-4
	retlw	00
	
		
		
;************************************
;* Sub routines			*
;************************************
	
	;All the routines 1-10
	;Routine10 displays all routines 1-9 three times then repeats
	
All	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA

	movlw	03
	movwf	loops		
	call	Show1		;ScanLRL routine
	call	Show2
	call	Show3
	call	Show4
	call	Show5
	call	Show6
	call	Show7
	call	Show8
	call	Show9
	call	Show10
	call	Show9
	call	Show8
	call	Show7
	call	Show6
	call	Show5
	call	Show4
	call	Show3
	call	Show2
	decfsz	loops,1
	goto	$-19
	
		
	
	call 	Pot		;fileB will hold a value 1-10
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
		
	movlw	03
	movwf	loops		
	call	Show1_2		;Scan2 routine
	call	Show2_3
	call	Show3_4
	call	Show4_5
	call	Show6_7
	call	Show7_8
	call	Show8_9
	call	Show9_10
	call	Show8_9
	call	Show7_8
	call	Show6_7
	call	Show4_5
	call	Show3_4
	call	Show2_3
	decfsz	loops,1
	goto	$-15
		
	movlw	03
	movwf	loops		
	call	Show1_10	;Bump routine
	call	Show2_9
	call	Show3_8		
	call	Show4_7		
	call	Show5_6	
	call	Show5_6	
	call	Show5_6			
	call	Show4_7
	call	Show3_8					
	call	Show2_9
	decfsz	loops,1
	goto	$-11
		
			
	movlw	03
	movwf	loops		
	call	Show1_10	;Cross-over routine
	call	Show2_9
	call	Show3_8		
	call	Show4_7		
	call	Show5_6			
	call	Show4_7
	call	Show3_8					
	call	Show2_9
	decfsz	loops,1
	goto	$-9
		
	call 	Pot		;fileB will hold a value 1-10
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
		
	movlw	05		;Fire routine
	movwf	tempC
	movlw	05
	movwf	tempB
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111000'	;Set GP0,1,2 as output 
	movwf	TRISIO	   		
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0,1,2 low   
	movwf	GPIO		;turn on LEDs1,2,3
	call	_XmS		
		
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'		;Set GP0,1,2 as input 
	movwf	TRISIO	   	;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0,1,2 low   
	movwf	GPIO		;turn off LEDs1,2,3
	call	_XmS
	decfsz	tempB,1
	goto	$-15		
		
	movlw	05
	movwf	tempB
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11001011'	;Set GP2,4,5 as output 
	movwf	TRISIO	   	 ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00110100'	;make GP2,4,5 high   
	movwf	GPIO		;turn on LEDs8,9,10
	call	_XmS		
		
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'	;Set GP0,1,2 as input 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0,1,2 low   
	movwf	GPIO		;turn off LEDs8,9,10
	call	_XmS
	decfsz	tempB,1
	goto	$-15
	decfsz	tempC,1
	goto	$-37		
		
	movlw	05
	movwf	tempB
	call	Show1
	call	Show2
	call	Show3
	call	Show4
	call	Show5
	call	Show6
	call	Show7
	call	Show8
	call	Show9
	call	Show10
	call	Show9
	call	Show8
	call	Show7
	call	Show6
	call	Show5
	call	Show4
	call	Show3
	call	Show2
	decfsz	tempB,1
	goto	$-19
		
	call 	Pot		;fileB will hold a value 1-10
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
		
	movlw	03		;Hole routine
	movwf	loops
	call	Hole
	decfsz	loops,1
	goto	$-2
		
		
	movlw	03		;Join routine
	movwf	loops
	call	Join
	decfsz	loops,1
	goto	$-2
		
				
	goto	All	
	
		
	;At Turn-On, project will detect pot position 
           ;and flash LED 1-10 three times
		
		
At_TO	movlw	03
	movwf	loops	
	call	Pot		;fileB will hold a value 1-10
	call	PotValue     ;PotValue will display LED 1-10 for 50mS
	call	_150mS
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'	;Set all GPIO as input 
	movwf	TRISIO	   	;turn off all LEDs	
	bcf	status, rp0	;bank 0  	
	call	_150mS
	decfsz	loops,1
	goto	$-9
	retlw	00
			
	;LEDs bump in middle
		
Bump	call	Show1_10	
	call	Show2_9
	call	Show3_8		
	call	Show4_7		
	call	Show5_6	
	call	Show5_6	
	call	Show5_6				
	call	Show4_7
	call	Show3_8					
	call	Show2_9
	goto	Routine3	
		
		
		
	;Fire  3 left, 3 right, scan back/forth
		
Fire	movlw	05
	movwf	tempC
	movlw	05
	movwf	tempB
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111000'	;Set GP0,1,2 as output 
	movwf	TRISIO	   	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0,1,2 low   
	movwf	GPIO		;turn on LEDs1,2,3
	call	_XmS		
		
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'	;Set GP0,1,2 as input 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0,1,2 low   
	movwf	GPIO		;turn off LEDs1,2,3
	call	_XmS
	decfsz	tempB,1
	goto	$-15		
		
	movlw	05
	movwf	tempB
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11001011'	;Set GP2,4,5 as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00110100'	;make GP2,4,5 high   
	movwf	GPIO		;turn on LEDs8,9,10
	call	_XmS		
		
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'	;Set GP0,1,2 as input 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0,1,2 low   
	movwf	GPIO		;turn off LEDs8,9,10
	call	_XmS
	decfsz	tempB,1
	goto	$-15
	decfsz	tempC,1
	goto	$-37		
		
	movlw	05
	movwf	tempB
	call	Show1
	call	Show2
	call	Show3
	call	Show4
	call	Show5
	call	Show6
	call	Show7
	call	Show8
	call	Show9
	call	Show10
	call	Show9
	call	Show8
	call	Show7
	call	Show6
	call	Show5
	call	Show4
	call	Show3
	call	Show2
	decfsz	tempB,1
	goto	$-19
	retlw	00


		
	;Get Routine
		
GetRoutine		
	decfsz	fileB,1
	goto	$+2
	goto	Routine1
	decfsz	fileB,1
	goto	$+2
	goto	Routine2
	decfsz	fileB,1
	goto	$+2
	goto	Routine3
	decfsz	fileB,1
	goto	$+2
	goto	Routine4
	decfsz	fileB,1
	goto	$+2
	goto	Routine5
	decfsz	fileB,1
	goto	$+2
	goto	Routine6
	decfsz	fileB,1
	goto	$+2
	goto	Routine7
	decfsz	fileB,1
	goto	$+2
	goto	Routine8
	decfsz	fileB,1
	goto	$+2
	goto	Routine9
	decfsz	fileB,1
	goto	$+2
	goto	Routine10
	retlw	00		;no value to be shown
		
		
	;Hole    All LEDs are illuminated and a hole runs RLR
		

		
Hole	clrf	fetch	;used to fetch down the table
	movlw	05h	;a
	movwf	fileA	;5 loops for multiplexing	
	movf	fetch,w		;_b
	call	Table2	;bit6=0=LEDs 1,2,3,4,5
	movwf	temp	;is bit 6=0?
	btfsc	temp,6
	goto	$+2
	movwf	temp1_5	;temp storage 
	movf	temp1_5,w	;reclaim previous value
	bsf	status, rp0 	;Bank 1	
	movwf	TRISIO	 	;Set GPIO's as in/out
	bcf	status, rp0	;bank 0  
	clrf	GPIO		;turn on LEDs 1,2,3,4,5
	btfsc	temp,7		;when bit7=1  delay is skipped
	goto	$+.17
	call	_5mS					;
	movf	fetch,w	
	call	Table2
	movwf	temp		;is bit 6=1?
	btfss	temp,6
	goto	$+2
	movwf	temp6_10	;temp storage 
	movf	temp6_10,w		;reclaim previous value		
	bsf	status, rp0 	;Bank 1	
	movwf	TRISIO	 	;Set GPIO's as in/out
	bcf	status, rp0	;bank 0 		
	movlw	0ffh
	movwf	GPIO		;turn on LEDs 6,7,8,9,10
	call	_5mS				
	decfsz	fileA,1
	goto	$-.28		;_b				
	incf	fetch,1
	movf	temp,0
	xorlw	0ffh
	btfsc	status,z
	retlw	00
	goto	$-.36		;_a
		
			
			
	;Join   LEDS run across screen and join at right hand side
		
		
Join	clrf	fetch	;used to fetch down the table
	movlw	05h	;_a
	movwf	fileA	;5 loops for multiplexing	
	movf	fetch,w	;_b
	call	Table1		;bit6=0=LEDs 1,2,3,4,5
	movwf	temp		;is bit 6=0?
	btfsc	temp,6
	goto	$+2
	movwf	temp1_5		;temp storage 
	movf	temp1_5,w	;reclaim previous value
	bsf	status, rp0 	;Bank 1	
	movwf	TRISIO	 	;Set GPIO's as in/out
	bcf	status, rp0	;bank 0  
	clrf	GPIO		;turn on LEDs 1,2,3,4,5
	btfsc	temp,7		;when bit7=1  delay is skipped
	goto	$+.17
	call	_5mS		
	movf	fetch,w	
	call	Table1
	movwf	temp		;is bit 6=1?
	btfss	temp,6
	goto	$+2
	movwf	temp6_10	;temp storage 
	movf	temp6_10,w	;reclaim previous value		
	bsf	status, rp0 	;Bank 1	
	movwf	TRISIO	 	;Set GPIO's as in/out
	bcf	status, rp0	;bank 0 		
	movlw	0ffh
	movwf	GPIO		;turn on LEDs 6,7,8,9,10
	call	_5mS				
	decfsz	fileA,1
	goto	$-.28		;_b				
	incf	fetch,1
	movf	temp,0
	xorlw	0ffh
	btfsc	status,z
	retlw	00
	goto	$-.36		;_a
		
		
		
	;Detects position of 100k pot - produces a result 1-10 
	;for routines or speed of scanning 
		
		
Pot	clrf	fileB		;create value for 1-5 routines
	incf	fileB,1		;to enable 1 on display 
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11101111'	;Set GP4 as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00010000'	;make GP4 high 
	movwf	GPIO		;to discharge 100n 
			
		
	movlw	38h		;short delay 
	movwf	DelA
	nop
	decfsz 	DelA,1		  
	goto 	$-2	
		
	movlw	b'00000000'	;make GP4 low
	movwf	GPIO			;
		
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111111'	;Set GP3,4 as input 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  
						
	btfsc	GPIO,3		;see if 100n has charged
	goto	$+3
	incf	fileB,1		;incr loops
	goto	$-.14
		
	retlw	00		;fileB will hold a value 1-10
		
		
	
	
	;Show pot value on display,  1-10
	
PotValue decfsz	fileB,1
	goto	$+2
	goto	show1
	decfsz	fileB,1
	goto	$+2
	goto	show2
	decfsz	fileB,1
	goto	$+2
	goto	show3
	decfsz	fileB,1
	goto	$+2
	goto	show4
	decfsz	fileB,1
	goto	$+2
	goto	show5
	decfsz	fileB,1
	goto	$+2
	goto	show6
	decfsz	fileB,1
	goto	$+2
	goto	show7
	decfsz	fileB,1
	goto	$+2
	goto	show8
	decfsz	fileB,1
	goto	$+2
	goto	show9
	decfsz	fileB,1
	goto	$+2
	goto	show10
	retlw	00		;no value to be shown
		
		
		
		
	;Scan back/forth
		
		
ScanLRL	call	Show1
	call	Show2
	call	Show3
	call	Show4
	call	Show5
	call	Show6
	call	Show7
	call	Show8
	call	Show9
	call	Show10
	call	Show9
	call	Show8
	call	Show7
	call	Show6
	call	Show5
	call	Show4
	call	Show3
	call	Show2
	goto	Routine1 	
		
		
	;Scan back/forth  2 LEDs
			
		
Scan2	call	Show1_2
	call	Show2_3
	call	Show3_4
	call	Show4_5		
	call	Show6_7
	call	Show7_8
	call	Show8_9
	call	Show9_10
	call	Show8_9
	call	Show7_8
	call	Show6_7		
	call	Show4_5
	call	Show3_4
	call	Show2_3
	goto	Routine2

		
Show1	movlw	b'11111110'	;Set GP0 as output		 
	goto	GPIOlow
		
		
Show2	movlw	b'11111101'	;Set GP1 as output   	  
	goto	GPIOlow
		
		
Show3	movlw	b'11111011'	;Set GP2 as output 	
	goto	GPIOlow
		
Show4	movlw	b'11101111'	;Set GP4 as output 
	goto	GPIOlow	

			
Show5  	movlw	b'11011111'	;Set GP5 as output 
	goto	GPIOlow	


Show6	movlw	b'11111110'	;Set GP0 as output 
	goto	GPIOhi
		
Show7	movlw	b'11111101'	;Set GP1 as output 
	goto	GPIOhi
		
Show8	movlw	b'11111011'	;Set GP2 as output 
	goto	GPIOhi
		
Show9	movlw	b'11101111'	;Set GP4 as output 
	goto	GPIOhi
		
Show10	movlw	b'11011111'	;Set GP5 as output 
	goto	GPIOhi		
		
GPIOlow	tris	gpio	   	    ;		
	movlw	b'00000000'	
	movwf	GPIO			;
	goto	_XmS		


		
GPIOhi	tris	gpio	 	
	movlw	b'11111111'	
	movwf	GPIO			;
	goto	_XmS		
				
		
		
Show1_2	movlw	b'11111100'	;Set GP0,1 as output 
	goto	GPIOlow		
		
		
Show2_3	movlw	b'11111001'	;Set GP1,2 as output 
	goto	GPIOlow
		
Show3_4	movlw	b'11101011'	;Set GP2,4 as output 
	goto	GPIOlow		
		
						
Show4_5	movlw	b'11001111'	;Set GP4,5 as output 
	goto	GPIOlow		
	
Show5_6	bsf	status, rp0 	;Bank 1			
       	movlw	b'11011110'	;Set GP0,5 as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000001'	;make GP5 low GP0 HIGH  
	movwf	GPIO		;turn on LED5&6
	goto	_XmS		
	
			
Show6_7	movlw	b'11111100'	;Set GP0,1 as output 
	goto	GPIOhi
				
								
Show7_8	movlw	b'11111001'	;Set GP1,2 as output 
	goto	GPIOhi		
									
		
Show8_9	movlw	b'11101011'	;Set GP2,4 as output 
	goto	GPIOhi		
									
		

Show9_10 movlw	b'11001111'	;Set GP4,5 as output 
	goto	GPIOhi		
									
		
		;subroutines for Cross-over


Show1_10 bsf	status, rp0 	;Bank 1			
       	movlw	b'11011110'	;Set GP0,5 as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00100000'	;make GP0 low  GP5 high 
	movwf	GPIO		;turn on LED1&10
	goto	_XmS		
		
		
Show2_9	bsf	status, rp0 	;Bank 1			
       	movlw	b'11101101'	;Set GP1,4 as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00010000'	;make GP1 low GP4 high  
	movwf	GPIO		;turn on LED2&9
	goto	_XmS		
		
		
Show3_8	movlw	05h
	movwf	fileA
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111011'	;Set GP2, as output
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000000'	;make GP0 low   
	movwf	GPIO		;turn on LED3
	call	_5mS
	bsf	status, rp0 	;Bank 1			
       	movlw	b'11111011'	;Set GP2, as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000100'	;make GP0 high   
	movwf	GPIO		;turn on LED8
	call	_5mS
	decfsz	fileA,1
	goto	$-.15
	retlw	00		
		
						
Show4_7	bsf	status, rp0 	;Bank 1			
       	movlw	b'11101101'	;Set GP4,1 as output 
	movwf	TRISIO	   	    ;	
	bcf	status, rp0	;bank 0  		
	movlw	b'00000010'	;make GP0 low   
	movwf	GPIO		;turn on LED4&7
	goto	_XmS		
		
		

			
	;Cross-over    LEDs cross-over in the middle
		
Xover	call	Show1_10	
	call	Show2_9
	call	Show3_8		
	call	Show4_7		
	call	Show5_6			
	call	Show4_7
	call	Show3_8					
	call	Show2_9
	goto	Routine4
					
			

;*************************************
;* Main 							*
;*************************************
		
	
Main	call	At_TO  	   ;at Turn-On LED 1-10 will flash 3 times
	call 	Pot		;fileB will hold a value 1-10
	goto	getRoutine	;returns with Routine 1-10
		
Routine1 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	goto 	ScanLRL

Routine2 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	goto 	Scan2			
		
Routine3 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	goto 	Bump		
		
		
Routine4 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	goto 	Xover
		
Routine5 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	call 	Fire
	goto	$-1

				
Routine6 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	call 	Hole
	goto	$-1

Routine7 
	call	Pot		;get value of pot in fileB 1-10	
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA	
	call	Join
	goto	Routine7
		
Routine8 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	call 	Hole
	goto	$-1

		
Routine9 
	call	Pot		;get value of pot in fileB 1-10		
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	call 	Hole
	goto	$-1
		
		
Routine10
	call	Pot		;get value of pot in fileB 1-10	
	swapf	fileB,0		;swap nibbles = x8 and put in w
	movwf	tempA
	goto 	All

	;oscillator calibration

	call 	03ffh
	movwf	OSCCAL			

	end

 11/5/2010