unit dotmat; {written by Iain Whyte. (c) 1994 } { This unit generates a 'dot matrix' LED effect that is very effective. If you would like to use this code, all that I ask is that you mention it in the credits somewhere, and let me know what you used it for. If you have any suggestions, or you want to talk to me or ask questions, I can be contacted at whytei@topaz.ucq.edu.au or ba022@cq-pan.cqu.edu.au via the Internet, or by snail-post : Iain Whyte 141 Racecourse Road Mt Morgan Q4714 Australia. or on the Rockhampton Computer Club BBS, via the programming, IBM/DOS, or AMIGA conferences... RCC BBS: (079) 276200 Instructions : Self explanatary, really, there is a sample prog for using this unit at the of this file..... } {displays upto 10 characters at once, max string size (ATM) is 20 chars....} interface uses dos,crt,graph; procedure display_dotmat_screen(xpos,ypos:integer); procedure create_dotmat(inputstring:string); procedure straight_display; procedure left_right; procedure right_left; procedure top_bot; procedure bot_top; procedure italics; procedure random_fade_out; procedure random_fade_in; procedure fall_away; implementation type letter_set=array[0..8,0..4] of integer; dotmattype=array[0..8,0..119] of integer; const pixelsize = 2; {size of each LED element i.e. 2 therfore LED is 2x2 pixels} a : letter_set = ((0,1,1,1,0), {each letter is set up as a 5x9 array} (1,0,0,0,1), {1 means LED is ON, 0 means LED OFF} (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1)); b : letter_set = ((1,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,0)); c : letter_set = ((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,1), (0,1,1,1,0)); d : letter_set = ((1,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,0)); e : letter_set = ((1,1,1,1,1), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,1,1)); f : letter_set = ((1,1,1,1,1), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0)); g : letter_set = ((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,0), (1,0,0,0,0), (1,0,1,1,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); h : letter_set = ((1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1)); i : letter_set = ((0,1,1,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,1,1,1,0)); j : letter_set = ((0,0,1,1,1), (0,0,0,1,0), (0,0,0,1,0), (0,0,0,1,0), (0,0,0,1,0), (1,0,0,1,0), (1,0,0,1,0), (1,0,0,1,0), (0,1,1,0,0)); k : letter_set = ((1,0,0,0,1), (1,0,0,1,0), (1,0,1,0,0), (1,1,0,0,0), (1,1,0,0,0), (1,1,0,0,0), (1,0,1,0,0), (1,0,0,1,0), (1,0,0,0,1)); l : letter_set = ((1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,1,1)); m : letter_set = ((1,0,0,0,1), (1,1,0,1,1), (1,1,1,1,1), (1,0,1,0,1), (1,0,1,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1)); n : letter_set = ((1,0,0,0,1), (1,1,0,0,1), (1,1,0,0,1), (1,0,1,0,1), (1,0,1,0,1), (1,0,1,0,1), (1,0,0,1,1), (1,0,0,1,1), (1,0,0,0,1)); o : letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); p : letter_set =((1,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,0,0,0,0)); q : letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,1,0,1), (1,0,0,1,1), (0,1,1,1,1)); r : letter_set =((1,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,1,1,1,0), (1,1,0,0,0), (1,0,1,0,0), (1,0,0,1,0), (1,0,0,0,1)); s : letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,0), (1,0,0,0,0), (0,1,1,1,0), (0,0,0,0,1), (0,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); t : letter_set =((1,1,1,1,1), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0)); u : letter_set =((1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); v : letter_set =((1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,0,1,0), (0,1,0,1,0), (0,0,1,0,0)); w : letter_set =((1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,1,0,1), (1,0,1,0,1), (0,1,1,1,0), (0,1,0,1,0)); x : letter_set =((1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,0,1,0), (0,0,1,0,0), (0,1,0,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1)); y : letter_set =((1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,0,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0)); z : letter_set =((1,1,1,1,1), (0,0,0,0,1), (0,0,0,0,1), (0,0,0,1,0), (0,0,1,0,0), (0,1,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,1,1)); exc : letter_set =((0,0,1,0,0), (0,1,1,1,0), (0,1,1,1,0), (0,1,1,1,0), (0,1,1,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,0,0,0), (0,0,1,0,0)); andm : letter_set =((0,0,1,1,0), (0,1,0,0,1), (0,0,1,1,0), (0,1,1,1,0), (1,0,0,1,0), (1,0,0,0,1), (1,0,0,1,1), (1,0,0,1,0), (0,1,1,0,1)); hat : letter_set =((0,1,0,1,0), (0,1,0,1,0), (1,1,1,1,1), (0,1,0,1,0), (0,1,0,1,0), (1,1,1,1,1), (0,1,0,1,0), (0,1,0,1,0), (0,1,0,1,0)); com : letter_set =((0,0,0,0,0), (0,0,0,0,0), (0,0,0,0,0), (0,0,0,0,0), (0,0,0,0,0), (0,0,1,1,0), (0,0,1,1,0), (0,0,1,0,0), (0,1,1,0,0)); ast : letter_set=((0,0,0,0,0), (1,0,1,0,1), (0,1,1,1,0), (0,0,1,0,0), (1,1,1,1,1), (0,0,1,0,0), (0,1,1,1,0), (1,0,1,0,1), (0,0,0,0,0)); la : letter_set =((0,0,0,0,1), (0,0,0,1,0), (0,0,1,0,0), (0,1,0,0,0), (1,0,0,0,0), (0,1,0,0,0), (0,0,1,0,0), (0,0,0,1,0), (0,0,0,0,1)); ra : letter_set =((1,0,0,0,0), (0,1,0,0,0), (0,0,1,0,0), (0,0,0,1,0), (0,0,0,0,1), (0,0,0,1,0), (0,0,1,0,0), (0,1,0,0,0), (1,0,0,0,0)); one :letter_set =((0,0,1,0,0), (0,1,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,1,1,1,0)); two : letter_set=((0,1,1,1,0), (1,0,0,0,1), (0,0,0,0,1), (0,0,0,1,0), (0,0,1,0,0), (0,1,0,0,0), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,1,1)); thr: letter_set =((0,1,1,1,0), (1,0,0,0,1), (0,0,0,0,1), (0,0,0,0,1), (0,0,1,1,0), (0,0,0,0,1), (0,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); four:letter_set =((1,0,0,0,0), (1,0,0,0,0), (1,0,0,1,0), (1,0,0,1,0), (1,0,0,1,0), (1,0,0,1,0), (1,1,1,1,1), (0,0,0,1,0), (0,0,0,1,0)); five:letter_set =((1,1,1,1,1), (1,0,0,0,0), (1,0,0,0,0), (1,1,1,1,0), (1,0,0,0,1), (0,0,0,0,1), (0,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); six :letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,0), (1,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); sev :letter_set =((1,1,1,1,1), (1,0,0,0,1), (0,0,0,0,1), (0,0,0,1,0), (0,0,0,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,1,0,0,0), (0,1,0,0,0)); eight:letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); nine : letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (1,0,0,0,1), (0,1,1,1,1), (0,0,0,0,1), (1,0,0,0,1), (0,1,1,1,0)); zer : letter_set =((0,1,1,1,0), (1,0,0,1,1), (1,0,0,1,1), (1,0,1,0,1), (1,0,1,0,1), (1,0,1,0,1), (1,1,0,0,1), (1,1,0,0,1), (0,1,1,1,0)); smil :letter_set =((0,1,1,1,0), (1,1,1,1,1), (1,0,1,0,1), (1,1,1,1,1), (1,1,0,1,1), (1,1,1,1,1), (1,0,0,0,1), (1,1,0,1,1), (0,1,1,1,0)); dol : letter_set =((0,0,1,0,0), (0,1,1,1,0), (1,0,1,0,1), (1,0,1,0,0), (0,1,1,1,0), (0,0,1,0,1), (1,0,1,0,1), (0,1,1,1,0), (0,0,1,0,0)); copyr: letter_set =((0,1,1,1,0), (1,0,0,0,1), (1,0,1,0,1), (1,1,0,1,1), (1,1,0,0,1), (1,1,0,1,1), (1,0,1,0,1), (1,0,0,0,1), (0,1,1,1,0)); lb: letter_set =((0,0,0,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,1,0,0,0), (0,1,0,0,0), (0,1,0,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,0,1,0)); rb: letter_set =((0,1,0,0,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,0,1,0), (0,0,0,1,0), (0,0,0,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,1,0,0,0)); quest: letter_set =((0,1,1,1,0), (1,0,0,0,1), (0,0,0,0,1), (0,0,0,1,0), (0,0,0,1,0), (0,0,1,0,0), (0,0,1,0,0), (0,0,0,0,0), (0,0,1,0,0)); var letters:array[' '..'z']of letter_set; outchars:array[0..19]of char; mainxpos,mainypos:integer; dotmatarray:dotmattype; dotmatarraymove,dotmatempty:dotmattype; counth,countv,lettercount:integer; count,count2,countmove,countloop:integer; procedure setup_chars; begin letters['a']:=a; letters['b']:=b; letters['c']:=c; letters['d']:=d; letters['e']:=e; letters['f']:=f; letters['g']:=g; letters['h']:=h; letters['i']:=i; letters['j']:=j; letters['k']:=k; letters['l']:=l; letters['m']:=m; letters['n']:=n; letters['o']:=o; letters['p']:=p; letters['q']:=q; letters['r']:=r; letters['s']:=s; letters['t']:=t; letters['u']:=u; letters['v']:=v; letters['w']:=w; letters['x']:=x; letters['y']:=y; letters['z']:=z; letters['!']:=exc; letters['&']:=andm; letters['#']:=hat; letters[',']:=com; letters['*']:=ast; letters['<']:=la; letters['>']:=ra; letters['1']:=one; letters['2']:=two; letters['3']:=thr; letters['4']:=four; letters['5']:=five; letters['6']:=six; letters['7']:=sev; letters['8']:=eight; letters['9']:=nine; letters['0']:=zer; letters['^']:=smil; letters['$']:=dol; letters['@']:=copyr; letters['(']:=lb; letters[')']:=rb; letters['?']:=quest; end; procedure display_dotmat_screen(xpos,ypos:integer); var countx,county:integer; begin mainxpos:=xpos; mainypos:=ypos; setfillstyle(1,8); for countx:=0 to 59 do begin for county:=-1 to 9 do begin bar((xpos+(countx*(pixelsize+1))),(ypos+(county*(pixelsize+1))), ((xpos+(countx*(pixelsize+1)))+(pixelsize-1)),((ypos+(county*(pixelsize+1)))+(pixelsize-1))); end; end; end; procedure convertstring_to_chars(instr:string); var count:integer; dummys:string[1]; strcount:char; begin for count:=1 to 20 do begin dummys:=copy(instr,count,1); for strcount:=' ' to 'z' do begin if dummys = strcount then outchars[count-1]:=strcount; end; end; end; procedure create_dotmat(inputstring:string); begin for countv:=0 to 8 do for counth:=0 to 119 do dotmatempty[countv,counth]:=0; setup_chars; convertstring_to_chars(inputstring); for lettercount:=0 to 19 do {make array of dots from letter data} begin for countv:=0 to 8 do begin for counth :=(lettercount*6) to ((lettercount*6)+6) do begin if counth<120 then begin dotmatarray[countv,counth]:=letters[outchars[lettercount],countv,(counth-lettercount*6)]; if (counth-lettercount*6) > 4 then dotmatarray[countv,counth]:=0; end; end; end; end; end; procedure gen_display; begin for counth:=0 to 59 do begin for countv:=0 to 8 do begin if (counth < 2) or (counth > 57) then setfillstyle(1,2) else setfillstyle(1,10); if dotmatarraymove[countv,counth] = 1 then begin bar((mainxpos+(counth*(pixelsize+1))),(mainypos+(countv*(pixelsize+1))), ((mainxpos+(counth*(pixelsize+1)))+(pixelsize-1)),((mainypos+(countv*(pixelsize+1)))+(pixelsize-1))); end; setfillstyle(1,8); if dotmatarraymove[countv,counth] = 0 then begin bar((mainxpos+(counth*(pixelsize+1))),(mainypos+(countv*(pixelsize+1))), ((mainxpos+(counth*(pixelsize+1)))+(pixelsize-1)),((mainypos+(countv*(pixelsize+1)))+(pixelsize-1))); end; end; end; end; procedure straight_display; begin dotmatarraymove:=dotmatarray; gen_display; end; procedure left_right; begin for count2:=0 to 119 do begin for count:=0 to 59 do begin countmove:=count+count2; if countmove>119 then countmove:=countmove-120; for countloop:=0 to 8 do dotmatarraymove[countloop,count]:=dotmatarray[countloop,countmove]; end; gen_display; delay(5); end; end; procedure right_left; begin for count2:=119 downto 0 do begin for count:=0 to 59 do begin countmove:=count+count2; if countmove>119 then countmove:=countmove-120; for countloop:= 0 to 8 do dotmatarraymove[countloop,count]:=dotmatarray[countloop,countmove]; end; gen_display; delay(5); end; end; procedure top_bot; begin dotmatarraymove:=dotmatempty; for count2:=-9 to 9 do begin for count:=0 to 8 do begin countmove:=count+count2; if countmove>8 then for countloop:=0 to 119 do dotmatarraymove[count,countloop]:=0 else if countmove<0 then for countloop:=0 to 119 do dotmatarraymove[count,countloop]:=0 else for countloop:=0 to 119 do dotmatarraymove[count,countloop]:=dotmatarray[countmove,countloop]; end; gen_display; delay(50); end; end; procedure bot_top; begin for count2:=9 downto -9 do begin for count:=0 to 8 do begin countmove:=count+count2; if countmove>8 then for countloop:=0 to 119 do dotmatarraymove[count,countloop]:=0 else if countmove<0 then for countloop:=0 to 119 do dotmatarraymove[count,countloop]:=0 else for countloop:=0 to 119 do dotmatarraymove[count,countloop]:=dotmatarray[countmove,countloop]; end; gen_display; delay(50); end; end; procedure italics; begin for count:=0 to 8 do begin for count2:=0 to 119 do begin if (count mod 2) = 0 then begin dotmatarraymove[count,count2]:=dotmatarray[count,count2+(count div 2)]; end else dotmatarraymove[count,count2]:=dotmatarray[count,count2+((count-1) div 2)]; end; end; dotmatarray:=dotmatarraymove; end; procedure random_fade_out; var v,h,rnd,countdots:integer; begin randomize; dotmatarraymove:=dotmatarray; countdots:=0; for v:=0 to 8 do begin for h:=0 to 119 do begin if dotmatarraymove[v,h]=1 then countdots:=countdots+1; end; end; repeat for v:=0 to 8 do begin for h:=0 to 119 do begin if dotmatarraymove[v,h]=1 then begin rnd:=random(5); if rnd = 1 then begin countdots:=countdots-1; dotmatarraymove[v,h]:=0; end; end; end; end; gen_display; until countdots<=0; end; procedure random_fade_in; var v,h,rnd,countdots:integer; begin randomize; dotmatarraymove:=dotmatempty; countdots:=0; for v:=0 to 8 do begin for h:=0 to 119 do begin if dotmatarray[v,h]=1 then countdots:=countdots+1; end; end; repeat for v:=0 to 8 do begin for h:=0 to 119 do begin if (dotmatarray[v,h]=1)and (dotmatarraymove[v,h]=0) then begin rnd:=random(5); if rnd = 1 then begin countdots:=countdots-1; dotmatarraymove[v,h]:=1; end; end; end; end; gen_display; until countdots<=0; end; procedure fall_away; begin dotmatarraymove:=dotmatarray; for count:=8 downto 0 do begin count2:=count; repeat for countloop:=0 to 119 do begin if count2=count then begin dotmatarraymove[count2,countloop]:=dotmatarray[count,countloop]; end else begin dotmatarraymove[count2,countloop]:=dotmatarray[count,countloop]; dotmatarraymove[count2-1,countloop]:=0; end; end; gen_display; delay(5); count2:=count2+1; until count2=10; end; end; end. {------------------------------- DEMO ----------------------------------} program test_dotmat_unit; uses dos,crt,graph,dotmat; var in1,in2:integer; begin {12345678901234567890} {length guide} initgraph(in1,in2,'c:\bp\bgi'); {initialise 640x480x16c mode bgi} cleardevice; display_dotmat_screen(50,50); {set_up, display blank LED matrix} create_dotmat('this is a demo ! '); {loads string into matrix array} straight_display; {display on matrix} delay(1000); left_right; {scroll from left to right} delay(1000); right_left; {scroll from right to left} create_dotmat('fading in! '); {set up new msg} random_fade_in; {randomised fade} delay(1000); create_dotmat('fade out!! '); straight_display; delay(1000); random_fade_out; create_dotmat('can scroll 4 ways!!! '); left_right; top_bot; {scroll from top to bottom} right_left; bot_top; {scroll from bottom to top} create_dotmat('italics for the font!'); {create new msg} italics; {generate italics} random_fade_in; left_right; delay(1000); random_fade_out; create_dotmat('and a special effect '); {create new msg} left_right; delay(1000); create_dotmat('called fall away! '); left_right; delay(1000); fall_away; {demo Special FX} create_dotmat('well, what dya think?'); left_right; fall_away; create_dotmat('@ iain whyte 1994 '); random_fade_in; left_right; right_left; random_fade_out; top_bot; bot_top; closegraph; {kill graphics mode} end.