( LED Panel on Arduino Uno ) ( Chen-Hanson Ting, 5/15/2011 ) ( Sink: PC: 5, 4, 3, 2, 1, 0 ) ( PB: 3, 2 ) ( Drive: PB: 1, 0 ) ( PD: 7, 6, 5, 4, 3, 2 ) ( load LEDpanel_1, LEDpanel_2, ASCII, and STRING files ) DECIMAL VARIABLE RND ( seed ) variable ticks variable scans : (RANDOM) ( -- n, a random number within 0 to 65536 ) RND @ 31421 * ( RND*31421 ) 6927 + ( RND*31421+6926, mod 65536) DUP RND ! ( refresh he seed ) ; : RANDOM ( n1 -- n2, a random number within 0 to n1 ) (RANDOM) UM* ( n1*random to a double product) SWAP DROP ( discard lower part ) ; ( in fact divide by 65536 ) hex : init-ports f 24 c! 3f 27 c! fc 2a c! \ output ports ; : ms ( n -- ) for aft 100 for next then next ; : delay ticks @ ms ?key abort" done" ; : lshift ( n n -- ) for aft 2* then next ; : rshift ( n n -- ) for aft 2/ then next ; : drive ( n -- ) ff00 xor dup 2* 2* 2b c! \ PD outputs 6 rshift dup f and 25 c! \ PB outputs 4 rshift 3f and 28 c! \ PC outputs delay ; : cube 3 for ffff drive 0 drive next ; : z-plane ff0 drive f0f drive f0f0 drive f00f drive f0f0 drive f0f drive ; : x-plane 11ff drive 22ff drive 44ff drive 88ff drive 44ff drive 22ff drive ; : y-plane ff11 drive ff22 drive ff44 drive ff88 drive ff44 drive ff22 drive ; : z-bars 1111 drive 1122 drive 1144 drive 1188 drive 2288 drive 2244 drive 2222 drive 2211 drive 4411 drive 4422 drive 4444 drive 4488 drive 8888 drive 8844 drive 8822 drive 8811 drive 4411 drive 4422 drive 4444 drive 4488 drive 2288 drive 2244 drive 2222 drive 2211 drive ; : x-bars 01f0 drive 010f drive 10f0 drive 100f drive 200f drive 20f0 drive 020f drive 02f0 drive 04f0 drive 040f drive 40f0 drive 400f drive 800f drive 80f0 drive 080f drive 08f0 drive 04f0 drive 040f drive 40f0 drive 400f drive 200f drive 20f0 drive 020f drive 02f0 drive ; : y-bars 0f10 drive 0f01 drive f010 drive f001 drive f002 drive f020 drive 0f02 drive 0f20 drive 0f40 drive 0f04 drive f040 drive f004 drive f008 drive f080 drive 0f08 drive 0f80 drive 0f40 drive 0f04 drive f040 drive f004 drive f002 drive f020 drive 0f02 drive 0f20 drive ; : sequence1 1 7 for 100 7 for 2dup + drive delay 2* next drop 2* next drop ; : sequence2 100 7 for 1 7 for 2dup + drive delay 2* next drop 2* next drop ; : demo1 ( ticks -- ) ticks ! init-ports begin sequence1 again ; : demo2 ( ticks -- ) ticks ! init-ports begin sequence2 again ; : select ( -- n ) 8 random 1 swap for aft 2* then next 8 random 100 swap for aft 2* then next or ; : demo init-ports ?key begin 3 scans ! 400 ticks ! cube 3 for x-plane next 3 for y-plane next 3 for z-plane next 3 scans ! 20 ticks ! 200 for select drive next 100 ticks ! 3 for x-bars next 3 for y-bars next 3 for z-bars next 3 scans ! 20 ticks ! 200 for (random) drive next again ; flush init-ports cp @ RND !