24x24 led matrix

Post here to let others know of a project you're working on.

Moderators: Chuckt, Garth, bitfogav

User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

24x24 led matrix

Post by bitfogav » Fri Jul 23, 2010 2:49 am

Hi everyone!

Ive had this idea for awhile of making a 24x24 matrix from nine 8x8 Green and Red led matrix displays, I want it to make random patterns, make a game or even do scrolling letters and numbers, But I know I am limited to three colours using these 8x8 boards (green, red and orange) but that should be fine! :)

My main problem at the moment is that im not sure how I want to power up all the 8x8 displays? because I will have to use probably mulitplexing, and im not sure whether to use Transistor Mosfets to power the Columns or use Darlington chips ULN2803A, and whether or not I can power up a complete Column of 24 leds or if I will have to power up a single column of 8 leds on each 8x8 led matrix :?

My other problem at the moment is how I will control all the Rows or Leds, I could use cmos 74373's but I have also been thinking of using cmos 74595's, I guess Ill just have to do abit of breadboard experiments :) Unless anyone has got any ideas or can help!! :)


heres a board ive made up so far of all the 8x8 matrix displays
Image
Attachments
24x24led.jpg
24x24led.jpg (50.17 KiB) Viewed 18360 times

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by brad » Fri Jul 23, 2010 6:21 am

I have to say that I am very interested in where this project could be headed!

I have to head off to work now but will reply with some thoughts of how best to go about it this afternoon.

Actually, now that I think about it. I have built almost exactly the same thing for work!

It is a 24 x 24 LED matrix (one colour) that takes up a space on the wall about 2m x 2m I will post a video for you...

User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

Post by bitfogav » Fri Jul 23, 2010 8:45 pm

That will be cool Brad :)

And if you have any ideas of how I can go about it than that woul be very much appreciated.

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by brad » Fri Jul 23, 2010 9:14 pm

Okay I am back but don't have a video...

Anyway,

My design used six 74373's (three for the common anodes and three for the cathodes)

However, you want to use bi-colour displays so you would need nine 74373's.

With a 40 pin microcontroller you easily have enough pins to control it.

I.E. you would use say, PORTB for all inputs of all nine 74373's you would then need a further nine connections to use as the latch enable connections of the nine 74373's

Then you should be able to connect all of the 74373's output enable connections together and then to a single port pin.

since the 8x8 LED matrix displays are common anode you would need to use 24 NPN transistors to handle all the current (which would be upto 48 LED's on at any one time I.E. 24 red and 24 green on at the same time)

Here is an example of how you would connect the anodes to an NPN transistor:

Image

Now for this project I would certainly recommend using a higher level language than ASM. I only say this because I know how involved it was to program something like this in ASM. But basic however is quite straight forward and I am happy to help you with it.

Here is my ASM code for the 24x24 display I made last year. It displays a big message that says "WELCOME TO AVIONICS" it scrolls these huge fonts from bottom to top.

Code: Select all



#include <p18F4550.inc>
	
	CONFIG WDT=OFF					;	disable watchdog timer
	CONFIG MCLRE = OFF				;	MCLEAR Pin off
	CONFIG DEBUG = ON				;	Enable Debug Mode
	CONFIG LVP = OFF				;	Low-Voltage programming disabled (necessary for debugging)
	CONFIG FOSC = INTOSCIO_EC		;	Internal oscillator, port function on RA6 
	

	org h'00'						;	We want our program to start running from the start 00 hex


	movlw h'0F'
	movwf ADCON1


	cblock h'00'						;	We define our variables in here
		delay_1
		delay_2

		vram_1_left			
		vram_2_left		
		vram_3_left		
		vram_4_left			
		vram_5_left			
		vram_6_left
		vram_7_left
		vram_8_left
		vtemp_1_left
		vtemp_2_left
		vtemp_3_left
		vtemp_4_left
		vtemp_5_left
		vtemp_6_left
		vtemp_7_left

		vram_1_middle		
		vram_2_middle	
		vram_3_middle	
		vram_4_middle			
		vram_5_middle		
		vram_6_middle
		vram_7_middle
		vram_8_middle
		vtemp_1_middle
		vtemp_2_middle
		vtemp_3_middle
		vtemp_4_middle
		vtemp_5_middle
		vtemp_6_middle
		vtemp_7_middle

		vram_1_right		
		vram_2_right	
		vram_3_right		
		vram_4_right			
		vram_5_right			
		vram_6_right
		vram_7_right
		vram_8_right
		vtemp_1_right
		vtemp_2_right
		vtemp_3_right
		vtemp_4_right
		vtemp_5_right
		vtemp_6_right
		vtemp_7_right
	
		vram_9_left			
		vram_10_left		
		vram_11_left		
		vram_12_left			
		vram_13_left			
		vram_14_left
		vram_15_left
		vram_16_left
		vtemp_8_left
		vtemp_9_left
		vtemp_10_left
		vtemp_11_left
		vtemp_12_left
		vtemp_13_left
		vtemp_14_left
		vtemp_15_left
		vtemp_16_left	

		vram_9_middle		
		vram_10_middle		
		vram_11_middle		
		vram_12_middle			
		vram_13_middle			
		vram_14_middle
		vram_15_middle
		vram_16_middle
		vtemp_8_middle
		vtemp_9_middle
		vtemp_10_middle
		vtemp_11_middle
		vtemp_12_middle
		vtemp_13_middle
		vtemp_14_middle
		vtemp_15_middle
		vtemp_16_middle
	
		vram_9_right		
		vram_10_right		
		vram_11_right		
		vram_12_right			
		vram_13_right			
		vram_14_right
		vram_15_right
		vram_16_right
		vtemp_8_right
		vtemp_9_right
		vtemp_10_right
		vtemp_11_right
		vtemp_12_right
		vtemp_13_right
		vtemp_14_right
		vtemp_15_right
		vtemp_16_right

		vram_17_left			
		vram_18_left		
		vram_19_left		
		vram_20_left			
		vram_21_left			
		vram_22_left
		vram_23_left
		vram_24_left
		vtemp_17_left
		vtemp_18_left
		vtemp_19_left
		vtemp_20_left
		vtemp_21_left
		vtemp_22_left
		vtemp_23_left

		vram_17_middle			
		vram_18_middle		
		vram_19_middle		
		vram_20_middle			
		vram_21_middle			
		vram_22_middle
		vram_23_middle
		vram_24_middle
		vtemp_17_middle
		vtemp_18_middle
		vtemp_19_middle
		vtemp_20_middle
		vtemp_21_middle
		vtemp_22_middle
		vtemp_23_middle

		vram_17_right		
		vram_18_right	
		vram_19_right		
		vram_20_right			
		vram_21_right			
		vram_22_right
		vram_23_right
		vram_24_right
		vtemp_17_right
		vtemp_18_right
		vtemp_19_right
		vtemp_20_right
		vtemp_21_right
		vtemp_22_right
		vtemp_23_right

		graphics_data_save

		low_left_data
		low_middle_data
		low_right_data
		high_left_data
		high_middle_data
		high_right_data
		upper_left_data
		upper_middle_data
		upper_right_data	

		repeat_frame		;	used to determine how many times we will be repeating each 'frame'

		animation_counter_a
		animation_counter_b


		received_command
		which_animation
		what_anim_speed
		what_row_speed
		anim_speed_temp
		completion_bit_hold
	endc								;	and now we have finished defining variables



port_setup
	clrf BSR
	movlw b'10111111'
	;movlw b'00000000'
	movwf TRISA						;	make PORTA all outputs
	clrf TRISB						;	make PORTB all outputs
	movlw b'01000000'
	;movlw b'00000000'
	movwf TRISC						;	make PORTC all outputs (except pin 6)
	clrf TRISD						;	make PORTD all outputs
	clrf TRISE						;	make PORTE all outputs
	
	clrf LATA						;	make PORTA all outputs
	clrf LATB						;	make PORTB all outputs
	clrf LATC						;	make PORTC all outputs
	clrf LATD						;	make PORTD all outputs
	clrf LATE						;	make PORTE all outputs

zero_latches
	bsf LATC, 0						;	ensures all latches have zeros on startup
	bsf LATC, 1
	bsf LATC, 2

	bcf LATC, 0
	bcf LATC, 1
	bcf LATC, 2

	bsf LATE, 0						;	ensures all latches have zeros on startup
	bsf LATE, 1
	bsf LATE, 2

	bcf LATE, 0
	bcf LATE, 1
	bcf LATE, 2


setup
	clrf vram_1_left			
	clrf vram_2_left			
	clrf vram_3_left			
	clrf vram_4_left			
	clrf vram_5_left			
	clrf vram_6_left			
	clrf vram_7_left			
	clrf vram_8_left

	clrf vram_1_middle			
	clrf vram_2_middle			
	clrf vram_3_middle			
	clrf vram_4_middle			
	clrf vram_5_middle			
	clrf vram_6_middle			
	clrf vram_7_middle			
	clrf vram_8_middle

	clrf vram_1_right			
	clrf vram_2_right			
	clrf vram_3_right			
	clrf vram_4_right			
	clrf vram_5_right			
	clrf vram_6_right			
	clrf vram_7_right			
	clrf vram_8_right
	
	bsf LATC, 7					; turn off all LED's

	call animation_2
	call reset_animation_counter_a_b

	movlw b'00000010'
	movwf which_animation


	bcf PORTA, 6

	movlw d'13'
	movwf what_anim_speed

begin
	call check_remote		
	call display						;	call the display routine
	movf what_anim_speed, w
	xorlw d'00'
	btfsc STATUS, Z
	goto begin
	call fill_vram_left					;	call the fill video ram routine
	call fill_vram_middle				;	call the fill video ram routine
	call fill_vram_right				;	call the fill video ram routine
	goto begin


reset_animation_counter_a_b
		movlw d'02'
		movwf animation_counter_b
reset_animation_counter_a
		movlw d'105'	
		movwf animation_counter_a
	return



check_remote
		btfss PORTC, 6
	call anim_speed_command
		btfss PORTA, 4 ; check for command
	return
		btfsc PORTC, 6
		call check_row_speed_and_graphic
		btfss PORTC, 6
		call check_animation_and_animation_speed
		bsf PORTA, 6
	decfsz completion_bit_hold, f
		return
		bcf PORTA, 6
	return

check_row_speed_and_graphic
		btfsc PORTA, 5
	call graphic_command
		btfss PORTA, 6
	call row_speed_command
	return

check_animation_and_animation_speed
		btfsc PORTA, 5
	call anim_speed_command
		btfss PORTA, 6
	call animation_command
	return

graphic_command
	return

row_speed_command
	return

anim_speed_command
		btfss PORTA, 5
	return
	;	clrf what_anim_speed
		clrf received_command
		btfsc PORTA, 3
		bsf received_command, 2
		btfsc PORTA, 2
		bsf received_command, 1
		btfsc PORTA, 1
		bsf received_command, 0

		movf received_command, w
		xorlw d'00'
		btfsc STATUS, Z
	call set_anim_speed_0
		movf received_command, w
		xorlw d'01'
		btfsc STATUS, Z
	call set_anim_speed_1
		movf received_command, w
		xorlw d'02'
		btfsc STATUS, Z
	call set_anim_speed_2
		movf received_command, w
		xorlw d'03'
		btfsc STATUS, Z
	call set_anim_speed_3
		movf received_command, w
		xorlw d'04'
		btfsc STATUS, Z
	call set_anim_speed_4
		movf received_command, w
		xorlw d'05'
		btfsc STATUS, Z
	call set_anim_speed_5
		movf received_command, w
		xorlw d'06'
		btfsc STATUS, Z
	call set_anim_speed_6
		movf received_command, w
		xorlw d'07'
		btfsc STATUS, Z
	call set_anim_speed_7
	return

set_anim_speed_0
	movlw d'00'
	movwf what_anim_speed
	return
set_anim_speed_1
	movlw d'01'
	movwf what_anim_speed
	return
set_anim_speed_2
	movlw d'02'
	movwf what_anim_speed
	return
set_anim_speed_3
	movlw d'03'
	movwf what_anim_speed
	return
set_anim_speed_4
	movlw d'04'
	movwf what_anim_speed
	return
set_anim_speed_5
	movlw d'05'
	movwf what_anim_speed
	return
set_anim_speed_6
	movlw d'06'
	movwf what_anim_speed
	return
set_anim_speed_7
	movlw d'07'
	movwf what_anim_speed
	return

animation_command

	return


animation_1
		movlw low left_data_1
		movwf low_left_data
		movlw high left_data_1
		movwf high_left_data
		movlw upper left_data_1
		movwf upper_left_data

		movlw low middle_data_1
		movwf low_middle_data
		movlw high middle_data_1
		movwf high_middle_data
		movlw upper middle_data_1
		movwf upper_middle_data

		movlw low right_data_1
		movwf low_right_data
		movlw high right_data_1
		movwf high_right_data
		movlw upper right_data_1
		movwf upper_right_data
	return

animation_2
		movlw low left_data_2
		movwf low_left_data
		movlw high left_data_2
		movwf high_left_data
		movlw upper left_data_2
		movwf upper_left_data

		movlw low middle_data_2
		movwf low_middle_data
		movlw high middle_data_2
		movwf high_middle_data
		movlw upper middle_data_2
		movwf upper_middle_data

		movlw low right_data_2
		movwf low_right_data
		movlw high right_data_2
		movwf high_right_data
		movlw upper right_data_2
		movwf upper_right_data
	return


anim_speed_temp_1
	movlw d'50'
	movwf anim_speed_temp
	return
anim_speed_temp_2
	movlw d'40'
	movwf anim_speed_temp
	return
anim_speed_temp_3
	movlw d'25'
	movwf anim_speed_temp
	return
anim_speed_temp_4
	movlw d'12'
	movwf anim_speed_temp
	return
anim_speed_temp_5
	movlw d'07'
	movwf anim_speed_temp
	return
anim_speed_temp_6
	movlw d'05'
	movwf anim_speed_temp
	return
anim_speed_temp_7
	movlw d'03'
	movwf anim_speed_temp
	return


display
			movf what_anim_speed, w
			xorlw d'00'
			btfsc STATUS, Z
			call anim_speed_temp_0
			movf what_anim_speed, w
			xorlw d'01'
			btfsc STATUS, Z
			call anim_speed_temp_1
			movf what_anim_speed, w
			xorlw d'02'
			btfsc STATUS, Z
			call anim_speed_temp_2
			movf what_anim_speed, w
			xorlw d'03'
			btfsc STATUS, Z
			call anim_speed_temp_3
			movf what_anim_speed, w
			xorlw d'04'
			btfsc STATUS, Z
			call anim_speed_temp_4
			movf what_anim_speed, w
			xorlw d'05'
			btfsc STATUS, Z
			call anim_speed_temp_5
			movf what_anim_speed, w
			xorlw d'06'
			btfsc STATUS, Z
			call anim_speed_temp_6
			movf what_anim_speed, w
			xorlw d'07'
			btfsc STATUS, Z
			call anim_speed_temp_7

			movf anim_speed_temp, w
			movwf repeat_frame				;	so we grab that data from speed and copy it to our frame_rate


loop		
			call check_remote
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'10000000'				;	activate top row of cathodes
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2						;
			movf vram_1_left, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 2

				bsf LATE, 1						;
			movf vram_1_middle, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 1

				bsf LATE, 0						;
			movf vram_1_right, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'01000000'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_2_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1
			movf vram_2_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_2_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00100000'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_3_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_3_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_3_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00010000'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_4_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_4_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1

				bsf LATE, 0	
			movf vram_4_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00001000'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_5_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_5_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_5_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000100'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_6_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_6_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_6_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000010'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_7_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1
			movf vram_7_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_7_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000001'
			movwf LATD
			bsf LATC, 2
			bcf LATC, 2
					clrf LATD
					bsf LATC, 1
					bsf LATC, 0
					bcf LATC, 1
					bcf LATC, 0

				bsf LATE, 2	
			movf vram_8_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_8_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_8_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'10000000'				;	activate top row of cathodes
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2						;
			movf vram_9_left, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 2

				bsf LATE, 1						;
			movf vram_9_middle, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 1

				bsf LATE, 0						;
			movf vram_9_right, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'01000000'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_10_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1
			movf vram_10_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_10_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00100000'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_11_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_11_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_11_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00010000'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_12_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_12_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1

				bsf LATE, 0	
			movf vram_12_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00001000'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_13_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_13_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_13_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000100'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_14_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_14_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_14_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000010'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_15_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1
			movf vram_15_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_15_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000001'
			movwf LATD
			bsf LATC, 1
			bcf LATC, 1
					clrf LATD
					bsf LATC, 0
					bsf LATC, 2
					bcf LATC, 0
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_16_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_16_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_16_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'10000000'				;	activate top row of cathodes
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2						;
			movf vram_17_left, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 2

				bsf LATE, 1						;
			movf vram_17_middle, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 1

				bsf LATE, 0						;
			movf vram_17_right, w				;	Now we grab the first row of data from vram_1.
			movwf LATB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'01000000'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_18_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1
			movf vram_18_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_18_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00100000'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_19_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_19_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_19_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00010000'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_20_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_20_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1

				bsf LATE, 0	
			movf vram_20_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00001000'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_21_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_21_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_21_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000100'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_22_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_22_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_22_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000010'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_23_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1
			movf vram_23_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_23_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)rate
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			movlw b'00000001'
			movwf LATD
			bsf LATC, 0
			bcf LATC, 0
					clrf LATD
					bsf LATC, 1
					bsf LATC, 2
					bcf LATC, 1
					bcf LATC, 2

				bsf LATE, 2	
			movf vram_24_left, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 2


				bsf LATE, 1	
			movf vram_24_middle, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 1


				bsf LATE, 0	
			movf vram_24_right, w					;	Now we grab the first row of data from vram_1.
			movwf LATB						;	then we copy it to PORTB
				bcf LATE, 0
		bcf LATC, 7
			call delay						;	Call the delay (to hold that one row ON for a split second)
		bsf LATC, 7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


		decfsz repeat_frame							;	then decrease repeat_frame by one, 
		goto loop								;	if its not zero then draw it all again!
	return									


fill_vram_left
		movf vram_1_left, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_1_left		;	storage location. (just before we overwrite vram_1)
		movf vram_2_left, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_2_left		;	storage location. (just before we overwrite vram_2)
		movf vram_3_left, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_3_left		;	storage location. (just before we overwrite vram_3)
		movf vram_4_left, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_4_left		;	storage location. (just before we overwrite vram_4)
		movf vram_5_left, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_5_left		;	storage location. (just before we overwrite vram_5)
		movf vram_6_left, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_6_left		;	storage location. (just before we overwrite vram_6)
		movf vram_7_left, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_7_left		;	storage location. (just before we overwrite vram_7)

		movf vram_8_left, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_8_left		;	storage location. (just before we overwrite vram_1)
		movf vram_9_left, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_9_left		;	storage location. (just before we overwrite vram_2)
		movf vram_10_left, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_10_left		;	storage location. (just before we overwrite vram_3)
		movf vram_11_left, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_11_left		;	storage location. (just before we overwrite vram_4)
		movf vram_12_left, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_12_left		;	storage location. (just before we overwrite vram_5)
		movf vram_13_left, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_13_left		;	storage location. (just before we overwrite vram_6)
		movf vram_14_left, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_14_left		;	storage location. (just before we overwrite vram_7)

		movf vram_15_left, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_15_left		;	storage location. (just before we overwrite vram_1)
		movf vram_16_left, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_16_left		;	storage location. (just before we overwrite vram_2)
		movf vram_17_left, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_17_left		;	storage location. (just before we overwrite vram_3)
		movf vram_18_left, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_18_left		;	storage location. (just before we overwrite vram_4)
		movf vram_19_left, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_19_left		;	storage location. (just before we overwrite vram_5)
		movf vram_20_left, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_20_left		;	storage location. (just before we overwrite vram_6)
		movf vram_21_left, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_21_left		;	storage location. (just before we overwrite vram_7)
		movf vram_22_left, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_22_left		;	storage location. (just before we overwrite vram_7)
		movf vram_23_left, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_23_left		;	storage location. (just before we overwrite vram_7)

	call graphics_data_left		;	Call track_data routine and return with a byte of data in the w register
		movf graphics_data_save, w

	movwf vram_1_left		;	then copy the new byte of data to the first vram location
	movf vtemp_1_left, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_2_left		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_2_left, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_3_left		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_3_left, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_4_left		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_4_left, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_5_left		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_5_left, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_6_left		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_6_left, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_7_left		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_7_left, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_8_left		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_8_left, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_9_left		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_9_left, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_10_left		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_10_left, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_11_left		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_11_left, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_12_left		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_12_left, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_13_left		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_13_left, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_14_left		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_14_left, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_15_left		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_15_left, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_16_left		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_16_left, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_17_left		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_17_left, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_18_left		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_18_left, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_19_left		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_19_left, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_20_left		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_20_left, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_21_left		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_21_left, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_22_left		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_22_left, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_23_left		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_23_left, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_24_left
	return					;	Now that we're all done here, go back to our main program.

fill_vram_middle
		movf vram_1_middle, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_1_middle		;	storage location. (just before we overwrite vram_1)
		movf vram_2_middle, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_2_middle		;	storage location. (just before we overwrite vram_2)
		movf vram_3_middle, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_3_middle		;	storage location. (just before we overwrite vram_3)
		movf vram_4_middle, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_4_middle		;	storage location. (just before we overwrite vram_4)
		movf vram_5_middle, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_5_middle		;	storage location. (just before we overwrite vram_5)
		movf vram_6_middle, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_6_middle		;	storage location. (just before we overwrite vram_6)
		movf vram_7_middle, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_7_middle		;	storage location. (just before we overwrite vram_7)

		movf vram_8_middle, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_8_middle		;	storage location. (just before we overwrite vram_1)
		movf vram_9_middle, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_9_middle		;	storage location. (just before we overwrite vram_2)
		movf vram_10_middle, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_10_middle		;	storage location. (just before we overwrite vram_3)
		movf vram_11_middle, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_11_middle		;	storage location. (just before we overwrite vram_4)
		movf vram_12_middle, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_12_middle		;	storage location. (just before we overwrite vram_5)
		movf vram_13_middle, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_13_middle		;	storage location. (just before we overwrite vram_6)
		movf vram_14_middle, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_14_middle		;	storage location. (just before we overwrite vram_7)

		movf vram_15_middle, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_15_middle		;	storage location. (just before we overwrite vram_1)
		movf vram_16_middle, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_16_middle		;	storage location. (just before we overwrite vram_2)
		movf vram_17_middle, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_17_middle		;	storage location. (just before we overwrite vram_3)
		movf vram_18_middle, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_18_middle		;	storage location. (just before we overwrite vram_4)
		movf vram_19_middle, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_19_middle		;	storage location. (just before we overwrite vram_5)
		movf vram_20_middle, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_20_middle	;	storage location. (just before we overwrite vram_6)
		movf vram_21_middle, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_21_middle		;	storage location. (just before we overwrite vram_7)
		movf vram_22_middle, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_22_middle		;	storage location. (just before we overwrite vram_7)
		movf vram_23_middle, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_23_middle		;	storage location. (just before we overwrite vram_7)

	call graphics_data_middle		;	Call track_data routine and return with a byte of data in the w register
		movf graphics_data_save, w

	movwf vram_1_middle		;	then copy the new byte of data to the first vram location
	movf vtemp_1_middle, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_2_middle		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_2_middle, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_3_middle		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_3_middle, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_4_middle		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_4_middle, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_5_middle		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_5_middle, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_6_middle		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_6_middle, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_7_middle		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_7_middle, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_8_middle		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_8_middle, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_9_middle		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_9_middle, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_10_middle		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_10_middle, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_11_middle		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_11_middle, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_12_middle		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_12_middle, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_13_middle		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_13_middle, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_14_middle		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_14_middle, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_15_middle		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_15_middle, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_16_middle		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_16_middle, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_17_middle		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_17_middle, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_18_middle		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_18_middle, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_19_middle		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_19_middle, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_20_middle		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_20_middle, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_21_middle		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_21_middle, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_22_middle		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_22_middle, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_23_middle		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_23_middle, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_24_middle
	return					;	Now that we're all done here, go back to our main program.

fill_vram_right
		movf vram_1_right, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_1_right		;	storage location. (just before we overwrite vram_1)
		movf vram_2_right, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_2_right		;	storage location. (just before we overwrite vram_2)
		movf vram_3_right, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_3_right		;	storage location. (just before we overwrite vram_3)
		movf vram_4_right, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_4_right		;	storage location. (just before we overwrite vram_4)
		movf vram_5_right, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_5_right		;	storage location. (just before we overwrite vram_5)
		movf vram_6_right, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_6_right		;	storage location. (just before we overwrite vram_6)
		movf vram_7_right, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_7_right		;	storage location. (just before we overwrite vram_7)

		movf vram_8_right, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_8_right		;	storage location. (just before we overwrite vram_1)
		movf vram_9_right, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_9_right		;	storage location. (just before we overwrite vram_2)
		movf vram_10_right, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_10_right	;	storage location. (just before we overwrite vram_3)
		movf vram_11_right, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_11_right		;	storage location. (just before we overwrite vram_4)
		movf vram_12_right, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_12_right		;	storage location. (just before we overwrite vram_5)
		movf vram_13_right, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_13_right		;	storage location. (just before we overwrite vram_6)
		movf vram_14_right, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_14_right	;	storage location. (just before we overwrite vram_7)

		movf vram_15_right, 0		;	Copy vram_1 into vtemp_1 to use as a backup
		movwf vtemp_15_right	;	storage location. (just before we overwrite vram_1)
		movf vram_16_right, 0		;	Copy vram_1 into vtemp_2 to use as a backup
		movwf vtemp_16_right		;	storage location. (just before we overwrite vram_2)
		movf vram_17_right, 0		;	Copy vram_1 into vtemp_3 to use as a backup
		movwf vtemp_17_right	;	storage location. (just before we overwrite vram_3)
		movf vram_18_right, 0		;	Copy vram_1 into vtemp_4 to use as a backup
		movwf vtemp_18_right		;	storage location. (just before we overwrite vram_4)
		movf vram_19_right, 0		;	Copy vram_1 into vtemp_5 to use as a backup
		movwf vtemp_19_right	;	storage location. (just before we overwrite vram_5)
		movf vram_20_right, 0		;	Copy vram_1 into vtemp_6 to use as a backup
		movwf vtemp_20_right		;	storage location. (just before we overwrite vram_6)
		movf vram_21_right, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_21_right	;	storage location. (just before we overwrite vram_7)
		movf vram_22_right, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_22_right	;	storage location. (just before we overwrite vram_7)
		movf vram_23_right, 0		;	Copy vram_7 into vtemp_7 to use as a backup
		movwf vtemp_23_right		;	storage location. (just before we overwrite vram_7)

	call graphics_data_right		;	Call track_data routine and return with a byte of data in the w register
		movf graphics_data_save, w

	movwf vram_1_right		;	then copy the new byte of data to the first vram location
	movf vtemp_1_right, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_2_right		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_2_right, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_3_right		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_3_right, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_4_right		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_4_right, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_5_right		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_5_right, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_6_right		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_6_right, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_7_right		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_7_right, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_8_right		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_8_right, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_9_right		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_9_right, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_10_right		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_10_right, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_11_right		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_11_right, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_12_right		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_12_right, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_13_right		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_13_right, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_14_right		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_14_right, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_15_right		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_15_right, 0		;	copy what was in vram_1 into vram_2 (remember how we made
	movwf vram_16_right		;	a backup of vram_1 and called it vtemp_1.)
	movf vtemp_16_right, 0		;	copy what was in vram_2 into vram_3 (remember how we made
	movwf vram_17_right		;	a backup of vram_2 and called it vtemp_2.)
	movf vtemp_17_right, 0		;	copy what was in vram_3 into vram_4 (remember how we made
	movwf vram_18_right		;	a backup of vram_3 and called it vtemp_3.)
	movf vtemp_18_right, 0		;	copy what was in vram_4 into vram_5 (remember how we made
	movwf vram_19_right		;	a backup of vram_4 and called it vtemp_4.)
	movf vtemp_19_right, 0		;	copy what was in vram_5 into vram_6 (remember how we made
	movwf vram_20_right		;	a backup of vram_5 and called it vtemp_5.)
	movf vtemp_20_right, 0		;	copy what was in vram_6 into vram_7 (remember how we made
	movwf vram_21_right		;	a backup of vram_6 and called it vtemp_6.)
	movf vtemp_21_right, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_22_right		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_22_right, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_23_right		;	a backup of vram_7 and called it vtemp_7.)
	movf vtemp_23_right, 0		;	copy what was in vram_7 into vram_8 (remember how we made
	movwf vram_24_right
	return					;	Now that we're all done here, go back to our main program.


delay
	call delay_a
	return


delay_a								;	here is a nice and simple delay routine
		movlw d'05'
		movwf delay_1
delay_loop_a							;	We come back to this label when we have not yet reached zero.
	call check_remote
		decfsz delay_1, f				;	decrement whatever is in delay_1 by 1 and store the answer back in delay_1
	goto delay_loop_a				;	if the answer is not zero, then go back to the delay_loop label. but if the
	return							;	is zero, then we have completed our delay and now we can return to our main program!

long_delay								;	here is a nice and simple delay routine
		movlw d'255'
		movwf delay_1
		movwf delay_2
delay_loop_long							;	We come back to this label when we have not yet reached zero.
		decfsz delay_1, f				;	decrement whatever is in delay_1 by 1 and store the answer back in delay_1
	goto delay_loop_long				;	if the answer is not zero, then go back to the delay_loop label. but if the
		decfsz delay_2, f				;	decrement whatever is in delay_1 by 1 and store the answer back in delay_1
	goto delay_loop_long				;	if the answer is not zero, then go back to the delay_loop label. but if the
	return							;	is zero, then we have completed our delay and now we can return to our main program!

						;	is zero, then we have completed our delay and now we can return to our main program!



graphics_data_left		
	call left_read
	call copy_data_to_w
	call left_write
	return

left_read
		movf low_left_data, w		
		movwf TBLPTRL				
		movf high_left_data, w				
		movwf TBLPTRH				
		movf upper_left_data, w	
		movwf TBLPTRU
	return

left_write
		movf TBLPTRL, w
		movwf low_left_data
		movf TBLPTRH, w
		movwf high_left_data
		movf TBLPTRU, w
		movwf upper_left_data
	return


graphics_data_middle
	call middle_read
	call copy_data_to_w
	call middle_write
	return

middle_read
		movf low_middle_data, w		
		movwf TBLPTRL				
		movf high_middle_data, w				
		movwf TBLPTRH				
		movf upper_middle_data, w	
		movwf TBLPTRU
	return

middle_write
		movf TBLPTRL, w
		movwf low_middle_data
		movf TBLPTRH, w
		movwf high_middle_data
		movf TBLPTRU, w
		movwf upper_middle_data
	return


graphics_data_right
	call right_read
	call copy_data_to_w
	call right_write

		decfsz animation_counter_a, f
	return
	call reset_animation_counter_a
		decfsz animation_counter_b, f
	return
	btfsc which_animation, 0
	call animation_1
	btfsc which_animation, 1
	call animation_2
	call reset_animation_counter_a_b
	return

right_read
		movf low_right_data, w		
		movwf TBLPTRL				
		movf high_right_data, w				
		movwf TBLPTRH				
		movf upper_right_data, w	
		movwf TBLPTRU
	return

right_write
		movf TBLPTRL, w
		movwf low_right_data
		movf TBLPTRH, w
		movwf high_right_data
		movf TBLPTRU, w
		movwf upper_right_data
	return


copy_data_to_w
		tblrd*+
		movf TABLAT, w
		movwf graphics_data_save
	return

left_data_1
	db h'18', h'3C'
	db h'3C', h'7C'
	db h'7E', h'7E'
	db h'7E', h'7F'
	db h'3F', h'3F'
	db h'0F', h'03'
	db h'00', h'00'
	db h'1F', h'3F'
	db h'7F', h'7F'
	db h'7F', h'7F'
	db h'7F', h'7F'
	db h'7F', h'3F'
	db h'3F', h'0F'
	db h'00', h'00'
	db h'7C', h'7C'
	db h'7C', h'7C'
	db h'7C', h'7C'
	db h'7C', h'7C'
	db h'7C', h'7C'
	db h'7F', h'7F'
	db h'00', h'00'
	db h'1F', h'3F'
	db h'7F', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7F', h'3F'
	db h'3F', h'0F'
	db h'00', h'00'
	db h'0F', h'3F'
	db h'3F', h'7F'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7F'
	db h'3F', h'1F'
	db h'00', h'00'
	db h'03', h'0F'
	db h'3F', h'3F'
	db h'7F', h'7E'
	db h'7E', h'7E'
	db h'7C', h'3C'
	db h'3C', h'18'
	db h'00', h'00'
	db h'0F', h'3F'
	db h'3F', h'7F'
	db h'7F', h'7F'
	db h'7F', h'7F'
	db h'7F', h'7F'
	db h'3F', h'1F'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'1F', h'7F'
	db h'7F', h'1F'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'1F', h'3F'
	db h'7F', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7F', h'3F'
	db h'3F', h'0F'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'03', h'07'
	db h'0F', h'1F'
	db h'3F', h'3F'
	db h'7F', h'7F'
	db h'7F', h'7E'
	db h'7E', h'18'
	db h'00', h'00'
	db h'10', h'7C'
	db h'7C', h'7C'
	db h'7E', h'3E'
	db h'1F', h'1F'
	db h'0F', h'07'
	db h'07', h'03'
	db h'00', h'00'
	db h'3F', h'7F'
	db h'3F', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'1F', h'7F'
	db h'7F', h'1F'
	db h'00', h'00'
	db h'0F', h'3F'
	db h'3F', h'7F'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7F'
	db h'3F', h'1F'
	db h'00', h'00'
	db h'7E', h'7F'
	db h'7F', h'7F'
	db h'7F', h'7F'
	db h'7C', h'7C'
	db h'7C', h'7C'
	db h'7C', h'38'
	db h'00', h'00'
	db h'1F', h'7F'
	db h'7F', h'1F'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'3F'
	db h'7F', h'3F'
	db h'00', h'00'
	db h'1F', h'3F'
	db h'7F', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7F', h'3F'
	db h'3F', h'0F'
	db h'00', h'00'
	db h'0F', h'3F'
	db h'7F', h'78'
	db h'78', h'7F'
	db h'3F', h'0F'
	db h'00', h'70'
	db h'7F', h'3F'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'


middle_data_1
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'3C'
	db h'7E', h'FF'
	db h'FF', h'FF'
	db h'FF', h'E7'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'80', h'00'
	db h'FF', h'FF'
	db h'FF', h'80'
	db h'00', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'80', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'81'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'E7', h'FF'
	db h'FF', h'FF'
	db h'FF', h'7E'
	db h'3C', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'00'
	db h'80', h'FF'
	db h'FF', h'FF'
	db h'00', h'80'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'FF'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7E', h'3C'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'81', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'C3', h'81'
	db h'00', h'FF'
	db h'FF', h'FF'
	db h'FF', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'81'
	db h'81', h'C3'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'FF'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'FF', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'81'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'00', h'80'
	db h'E0', h'F8'
	db h'FE', h'FF'
	db h'FF', h'3F'
	db h'0F', h'03'
	db h'00', h'00'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'FF'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'FF', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'80', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'FF', h'00'
	db h'00', h'FF'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'FF', h'FF'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'


right_data_1
	db h'18', h'3C'
	db h'3C', h'3E'
	db h'7E', h'7E'
	db h'7E', h'FE'
	db h'FC', h'FC'
	db h'F0', h'C0'
	db h'00', h'00'
	db h'FE', h'FC'
	db h'00', h'00'
	db h'E0', h'F0'
	db h'F0', h'00'
	db h'00', h'F8'
	db h'FE', h'FE'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'FE', h'FE'
	db h'00', h'00'
	db h'FE', h'FC'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'F8'
	db h'FE', h'FE'
	db h'00', h'00'
	db h'F0', h'FC'
	db h'FC', h'FE'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'7E', h'FE'
	db h'FC', h'F8'
	db h'00', h'00'
	db h'C0', h'F0'
	db h'FC', h'FC'
	db h'FE', h'7E'
	db h'7E', h'7E'
	db h'3E', h'3C'
	db h'3C', h'18'
	db h'00', h'00'
	db h'FE', h'FE'
	db h'F8', h'00'
	db h'00', h'F0'
	db h'F0', h'E0'
	db h'00', h'00'
	db h'FC', h'FE'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'F8', h'FE'
	db h'FE', h'F8'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'F8', h'FC'
	db h'FE', h'7E'
	db h'7E', h'7E'
	db h'7E', h'7E'
	db h'FE', h'FC'
	db h'FC', h'F0'
	db h'00', h'00'
	db h'00', h'00'
	db h'00', h'00'
	db h'C0', h'E0'
	db h'F0', h'F8'
Sorry I couldnt post all the code because this forum software cuts it off!
Attachments
common_anodes.PNG
common_anodes.PNG (7.22 KiB) Viewed 18352 times

User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

Post by bitfogav » Sat Jul 24, 2010 5:07 am

Thanks Brad, that has giving me some ideas for a starting point, I know how many 74373's I might need and transistors now, Thank you :)

I was going use either a 40pin 16F877A or 18F4550 for this project.

Do you think using 24x 2N2222 transistors would be enough to power the 8x8 displays? (upto 48 LED's on at any one time I.E. 24 red and 24 green on at the same time)?.

I have also got swordfish downloaded and installed so will have to learn some pic basic then for this project. :)

User avatar
sdudley
Moderator
Moderator
Posts: 337
Joined: Sun Mar 28, 2010 1:33 pm
Location: Florida, U.S.A.
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by sdudley » Sun Jul 25, 2010 1:57 am

Hey Brad,

After looking at the lines of code to do that, I think I am starting to understand why you made the move to BASIC! :wink:

Stacy
Any time you deviate from sequential consistency, you increase the complexity of the problem by orders of magnitude.

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by brad » Mon Jul 26, 2010 6:17 am

sdudley wrote:Hey Brad,

After looking at the lines of code to do that, I think I am starting to understand why you made the move to BASIC! :wink:

Stacy
Yes indeed sir!

I am actually working on a piece of code to control bitfogavs 24 x 24 matrix and i'm programming in BASIC! Once I get at least a little bit done I will post here.

User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

Post by bitfogav » Wed Jul 28, 2010 8:00 am

brad wrote:
sdudley wrote:Hey Brad,

After looking at the lines of code to do that, I think I am starting to understand why you made the move to BASIC! :wink:

Stacy
Yes indeed sir!

I am actually working on a piece of code to control bitfogavs 24 x 24 matrix and i'm programming in BASIC! Once I get at least a little bit done I will post here.
Thanks for that Brad :)

User avatar
sdudley
Moderator
Moderator
Posts: 337
Joined: Sun Mar 28, 2010 1:33 pm
Location: Florida, U.S.A.
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by sdudley » Wed Jul 28, 2010 11:49 am

Yea, thanks for that Brad.

Just remember when you are done I have few projects I need you to code up for me!

Thanks buddy. :D

Stacy
Any time you deviate from sequential consistency, you increase the complexity of the problem by orders of magnitude.

User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

Post by bitfogav » Thu Jul 29, 2010 6:56 am

Brad is this correct for a 24x24 led display in basic?

Code: Select all

Const graphic_data(24) As LongWord = (%101110011100001110011101, %101000000000000000000101, %101000010000000010000101, %100001010000000010100001, %100000010000000010000001, %101000000000000000000101, %101000000000000000000101, %101000000001100000000101, %101000001000000100000101, %100000001000000100000001, %100000001100100100000001, %100000001001100100000001, %101000001100100100000101, %101000001010100100000101, %100000001000000100000001, %100000001000000100000001, %101000001000000100000101, %101000000000000000000101, %101000000000000000000101, %101011100000000001110101, %100000100000000001000001, %100010100000000001010001, %101110011100001110011101, %100000000000000000000001)  
                    
Const anodes(24) As Longword = (%000000000000000000000001,%000000000000000000000010,%000000000000000000000100,%000000000000000000001000,%000000000000000000010000,%000000000000000000100000,%000000000000000001000000,%000000000000000010000000,%000000000000000100000000,%
000000000000001000000000,%000000000000010000000000,%
000000000000100000000000,%000000000001000000000000,%
000000000010000000000000,%000000000100000000000000,%
000000001000000000000000,%000000010000000000000000,%
000000100000000000000000,%000001000000000000000000,%
000010000000000000000000,%000100000000000000000000,%
000100000000000000000000,%010000000000000000000000,%
10000000000000000000000) 

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by brad » Fri Jul 30, 2010 6:17 am

sdudley wrote:Yea, thanks for that Brad.

Just remember when you are done I have few projects I need you to code up for me!

Thanks buddy. :D

Stacy
Oh don't be like that :) I have a vested interest in this project because I have made exactly the same thing at work and saw this as a way to improve on that project.

Can't we just be friends again :cry:

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by brad » Fri Jul 30, 2010 6:27 am

bitfogav wrote:Brad is this correct for a 24x24 led display in basic?

Code: Select all

Const graphic_data(24) As LongWord = (%101110011100001110011101, 
%101000000000000000000101, 
%101000010000000010000101, 
%100001010000000010100001, 
%100000010000000010000001, 
%101000000000000000000101, 
%101000000000000000000101, 
%101000000001100000000101, 
%101000001000000100000101, 
%100000001000000100000001, 
%100000001100100100000001, 
%100000001001100100000001, 
%101000001100100100000101, 
%101000001010100100000101, 
%100000001000000100000001, 
%100000001000000100000001, 
%101000001000000100000101, 
%101000000000000000000101, 
%101000000000000000000101, 
%101011100000000001110101, 
%100000100000000001000001, 
%100010100000000001010001, 
%101110011100001110011101, 
%100000000000000000000001)  
                    
Const anodes(24) As Longword = 
(%000000000000000000000001,
%000000000000000000000010,
%000000000000000000000100,
%000000000000000000001000,
%000000000000000000010000,
%000000000000000000100000,
%000000000000000001000000,
%000000000000000010000000,
%000000000000000100000000,
%000000000000001000000000,
%000000000000010000000000,
%000000000000100000000000,
%000000000001000000000000,
%000000000010000000000000,
%000000000100000000000000,
%000000001000000000000000,
%000000010000000000000000,
%000000100000000000000000,
%000001000000000000000000,
%000010000000000000000000,
%000100000000000000000000,
%001000000000000000000000,
%010000000000000000000000,
%100000000000000000000000) 
That code would work however it would not be very efficient due to the requirement to have 24 longwords (which is 24 x 32 bits = 768 bits or 96 bytes) Just to activate one column of LED's at a time.

I'm guessing you were going to have some sort of for next loop to draw each column e.g.

Code: Select all

for x = 0 to 23
     PORTB = anodes(x)
     - Then all your other code would be here to call the required graphics -
next
I am certain you could see in the above code that we just keep incrementing x which means we grab a different longword from the array anodes.

what we could do instead is have just one variable called anodes, start with the right most bit as a one and then everytime we call the variable, we just shift it to the left one space.

e.g.

Code: Select all

for x = 0 to 23
     PORTB = anodes << (x)
     - Then all your other code would be here to call the required graphics -
next
so all we do is call the one variable, but keep shifting that 1 to the left each time - what do you think?

User avatar
sdudley
Moderator
Moderator
Posts: 337
Joined: Sun Mar 28, 2010 1:33 pm
Location: Florida, U.S.A.
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by sdudley » Fri Jul 30, 2010 12:49 pm

brad wrote:Oh don't be like that :) I have a vested interest in this project because I have made exactly the same thing at work and saw this as a way to improve on that project.

Can't we just be friends again :cry:
I have a vested interest in my projects too. Unfortunately I just don't have the smarts to make them work. :lol:

Stacy

PS> Gavin, sorry to highjack your thread! :twisted:
Any time you deviate from sequential consistency, you increase the complexity of the problem by orders of magnitude.

User avatar
bitfogav
Moderator
Moderator
Posts: 915
Joined: Sun Mar 28, 2010 9:03 pm
Location: United Kingdom
Contact:

Post by bitfogav » Fri Jul 30, 2010 5:38 pm

sdudley wrote:
brad wrote:Oh don't be like that :) I have a vested interest in this project because I have made exactly the same thing at work and saw this as a way to improve on that project.

Can't we just be friends again :cry:
I have a vested interest in my projects too. Unfortunately I just don't have the smarts to make them work. :lol:

Stacy

PS> Gavin, sorry to highjack your thread! :twisted:
Thats fine Stacy :) when you both have kissed and made up (hehe) maybe we all can make code together (hehe) :D

User avatar
sdudley
Moderator
Moderator
Posts: 337
Joined: Sun Mar 28, 2010 1:33 pm
Location: Florida, U.S.A.
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Post by sdudley » Fri Jul 30, 2010 9:41 pm

bitfogav wrote:Thats fine Stacy :) when you both have kissed and made up (hehe) maybe we all can make code together (hehe) :D
Sounds good to me. Why don't you and Brad go ahead and get started on coding my project...

I'll get back with you when you guys are almost done. :D
Any time you deviate from sequential consistency, you increase the complexity of the problem by orders of magnitude.

Post Reply
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1266: count(): Parameter must be an array or an object that implements Countable

Who is online

Users browsing this forum: No registered users and 11 guests