Seite 1 von 1

Dotmatrix Beispiel

Verfasst: 11.01.2010 18:49
von gekkonier
Vielleicht kanns wer brauchen - wer grössere "Dotpixel" haben will oder den "Font" mit anderen Dimensionen haben will müsste halt die entsprechenden Stellen anpassen.

Beschreibung:
Dieses Beispiel zeigt die Möglichkeit numerische Werte in einer Art Dotmatrix (1 Dot = 1 Sprite) an der gewünschten Stelle in einem Screen anzuzeigen.

Anleitung:
Quelltext abspeichern, Ein PNG ins selbe Verzeichnis (8x8 Pixel) mit Namen "dot_8x8.png" - das sollte einen einzelnen Punkt darstellen!

Anmerkung:
Natürlich könnte man in Procedure DrawNumber(value.i, posx.i, posy.i) sich den Zwischenschritt mit dem ins temporäre Array kopieren ersparen, aber es läuft *g*

Screenshot vom Fenster:
Bild

Der Quelltext davon:

Code: Alles auswählen

; weil ich ein png als spritegrafik verwenden will
UsePNGImageDecoder()

Enumeration ;sprites
  #dotmatrixpic
EndEnumeration

; initstuff - fehlerbehandlung ist dein kaffee ;)
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,200,200,"test")
OpenWindowedScreen(WindowID(0), 0,0,200,200,0,0,0)

; unten in der datasection trage dein 8x8 pix für einen dot ein
CatchSprite(#dotmatrixpic, ?dotmatriximage)


; die dotmatrix ist ein array mit den Zahlen 0 bis 9
; eine zahl ist 3 breit, und 5 hoch bei 10 ziffern muss die matrix also 30 breit sein
Global Dim dotmatrix.i(30,5)

; einlesen ins array
Restore dotmatrixdata
For y = 0 To 4
  For x = 0 To 29
    Read dotmatrix(x,y)
  Next
Next

; das wird verwendet um die uebergebene nummer an posx und posy anzuzeigen
; das png, welches als sprite verwendet wird sollte 8x8 pixel haben.
; andere bildgroessen lassen sich leicht dynamisieren, indem du die entsprechenden
; positionierung umschreibst, ich beschränke mich auf einen 8x8 "bildpunkt"
Procedure DrawNumber(value.i, posx.i, posy.i)
  
  ; helferleins
  valuestr.s = Str(value)
  valuelen.i = Len(valuestr)
  outputmatrixdimension = valuelen * 4

  ; hier erstelle ich ein array mit den notwendigen dimension
  Dim outputmatrix(outputmatrixdimension, 4)
  
  ; hier kopiere ich die "buchstaben" aus der dotmatrixdata in meine outputmatrix
  For valuepos = 0 To valuelen - 1
    dotmatrixoffset = Val(Mid(valuestr, valuepos+1, 1)) * 3
    For innerpos = 0 To 2
      For y = 0 To 4
        outputmatrix(valuepos*3 + valuepos + innerpos, y) = dotmatrix(dotmatrixoffset + innerpos, y)
      Next
    Next
  Next
  
  ; hier wird die outputmatrix an der gewünschten Stelle ausgegeben
  For y = 0 To 4
    For x = 0 To outputmatrixdimension
      If outputmatrix(x,y) = 1
        DisplaySprite(#dotmatrixpic, x*8+posx, y*8+posy)
      EndIf
    Next
  Next
  
EndProcedure

; mainloop
Repeat
  ; windowevents wollen abgefragt werden, sonst schmiert das ab!
  Repeat
    event=WindowEvent()
    Select event
      Case #PB_Event_Gadget
        If EventGadget() = 0
          End
        EndIf
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until event=0
  ExamineKeyboard()
  ; hier die zeichenroutinen
  ClearScreen(RGB(0,0,0))
  ; und hier zeigen wir unseren supertollen highscore endlich an ;)
  DrawNumber(345,20, 20)
  DrawNumber(915, 20, 80)
  FlipBuffers()
  Delay(1)
Until KeyboardPushed(#PB_Key_Escape)

DataSection
; die Ziffern 0 bis 9
dotmatrixdata:
Data.l 1,1,1, 0,0,1, 1,1,1, 1,1,1, 1,0,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1
Data.l 1,0,1, 0,0,1, 0,0,1, 0,0,1, 1,0,1, 1,0,0, 1,0,0, 0,0,1, 1,0,1, 1,0,1
Data.l 1,0,1, 0,0,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,1, 1,1,1, 1,1,1
Data.l 1,0,1, 0,0,1, 1,0,0, 0,0,1, 0,0,1, 0,0,1, 1,0,1, 0,0,1, 1,0,1, 0,0,1
Data.l 1,1,1, 0,0,1, 1,1,1, 1,1,1, 0,0,1, 1,1,1, 1,1,1, 0,0,1, 1,1,1, 1,1,1
dotmatriximage:
IncludeBinary "dot_8x8.png"
EndDataSection
Edit: FlipBuffers() im Code vergessen >_<

Re: Dotmatrix Beispiel

Verfasst: 11.01.2010 19:33
von WPö
Jaaa, sehr schön das Ganze. Kann man alternativ mit DrawImage oder so machen, weil ich glaube, allzuviele Sprites belasten die Grafikkarte zu sehr. Möglich, daß ich mich täusche. Dieses Wissen stammt noch aus meiner Amiga-Zeit. Naja, bei Grafikkarten von mehr als 128kB sollte es keine Probleme geben. Inzwischen haben wir da tlw. die 4000fache Menge.

Gruß - WPo

Re: Dotmatrix Beispiel

Verfasst: 11.01.2010 19:39
von gekkonier
Stimmt schon, aber in Zeiten wo Diablo2 (Spriteorgie ohne Ende) auf allen Rechnern läuft sollte das kein Problem sein *g*

Re: Dotmatrix Beispiel

Verfasst: 11.01.2010 21:04
von Kaeru Gaman
@gekkonier

nice! :allright:


@WPo

hier ist nur ein Sprite drin, dafür sollte doch genug Platz sein?
und gerade wenn man ein Bild tausend mal darstellen will, nimmt man Sprites statt Images.

Hier stellt sich lediglich die Frage, ob man auf Image oder auf Screen arbeiten will.
Screen ist schneller, Animiertes Image passt besser in Window-GUIs.
Images auf Screen darstellen kann man komplett vergessen, viel zu langsam.

Re: Dotmatrix Beispiel

Verfasst: 11.01.2010 21:33
von WPö
Jupp. Hab mich nur seit Amiga-Zeiten nicht mehr mit dem Thema beschäftigt. Danke!
Gruß - WPo

Re: Dotmatrix Beispiel

Verfasst: 11.02.2011 14:31
von tinux
Dot_Matrix 5x7

Code: Alles auswählen

EnableExplicit

Procedure Dot_Matrix(text.s,x,y,dot_w_h,LEDColorOn,LEDColorOff)
  
  Define s,i,t,f,h,hh,a,Matrix,dot_farbe,dot_x,dot_y
  
  Dim zeichen.s(Len(text.s))
  Dim mask.s(Len(text.s))
  
  For s = 1 To Len(text.s)
    zeichen.s(s) = Mid(text.s,s,1)
    
    If zeichen.s(s) = "" : mask.s(s)="00000000000000000000000000000000000" : EndIf
    If zeichen.s(s) = "!" : mask.s(s)="00100001000010000100001000000000100" : EndIf
    ;If zeichen.s(s) = Chr(34) : mask.s(s)="01010010100101000000000000000000000" : EndIf
    If zeichen.s(s) = "#" : mask.s(s)="01010010101111101010111110101001010" : EndIf
    If zeichen.s(s) = "$" : mask.s(s)="00100011111010001110001011111000100" : EndIf
    If zeichen.s(s) = "%" : mask.s(s)="11000110010001000100010001001100011" : EndIf
    If zeichen.s(s) = "&" : mask.s(s)="01100100101010001000101011001001101" : EndIf
    If zeichen.s(s) = "'" : mask.s(s)="01100001000100000000000000000000000" : EndIf
    If zeichen.s(s) = "(" : mask.s(s)="00010001000100001000010000010000010" : EndIf
    If zeichen.s(s) = ")" : mask.s(s)="01000001000001000010000100010001000" : EndIf
    If zeichen.s(s) = "*" : mask.s(s)="00000001001010101110101010010000000" : EndIf
    If zeichen.s(s) = "+" : mask.s(s)="00000001000010011111001000010000000" : EndIf
    If zeichen.s(s) = "," : mask.s(s)="00000000000000000000011000010001000" : EndIf
    If zeichen.s(s) = "-" : mask.s(s)="00000000000000011111000000000000000" : EndIf
    If zeichen.s(s) = "." : mask.s(s)="00000000000000000000011000110000000" : EndIf
    If zeichen.s(s) = "/" : mask.s(s)="00000000010001000100010001000000000" : EndIf
    
    If zeichen.s(s) = "0" : mask.s(s)="01110100011001110101110011000101110" : EndIf
    If zeichen.s(s) = "1" : mask.s(s)="00100011000010000100001000010001110" : EndIf
    If zeichen.s(s) = "2" : mask.s(s)="01110100010000100010001000100011111" : EndIf
    If zeichen.s(s) = "3" : mask.s(s)="01110100010000100110000011000101110" : EndIf
    If zeichen.s(s) = "4" : mask.s(s)="00010001100101010010111110001000010" : EndIf
    If zeichen.s(s) = "5" : mask.s(s)="11111100001000011110000010000111110" : EndIf
    If zeichen.s(s) = "6" : mask.s(s)="01110100001000011110100011000101110" : EndIf
    If zeichen.s(s) = "7" : mask.s(s)="11111100010000100010001000010000100" : EndIf
    If zeichen.s(s) = "8" : mask.s(s)="01110100011000101110100011000101110" : EndIf
    If zeichen.s(s) = "9" : mask.s(s)="01110100011000101111000011000101110" : EndIf
    
    If zeichen.s(s) = ":" : mask.s(s)="00000011000110000000011000110000000" : EndIf
    If zeichen.s(s) = ";" : mask.s(s)="00000011000110000000011000010001000" : EndIf
    If zeichen.s(s) = "<" : mask.s(s)="00010001000100010000010000010000010" : EndIf
    If zeichen.s(s) = "=" : mask.s(s)="00000000001111100000111110000000000" : EndIf
    If zeichen.s(s) = ">" : mask.s(s)="01000001000001000001000100010001000" : EndIf
    If zeichen.s(s) = "?" : mask.s(s)="01110000010000100010001000000000100" : EndIf
    If zeichen.s(s) = "@" : mask.s(s)="01110100011001110101101111000001110" : EndIf
    
    If zeichen.s(s) = "A" : mask.s(s)="01110100011000110001111111000110001" : EndIf
    If zeichen.s(s) = "B" : mask.s(s)="11110100011000111110100011000111110" : EndIf
    If zeichen.s(s) = "C" : mask.s(s)="01110100011000010000100001000101110" : EndIf
    If zeichen.s(s) = "D" : mask.s(s)="11100100101000110001100011001011100" : EndIf
    If zeichen.s(s) = "E" : mask.s(s)="11111100001000011110100001000011111" : EndIf
    If zeichen.s(s) = "F" : mask.s(s)="11111100001000011110100001000010000" : EndIf
    If zeichen.s(s) = "G" : mask.s(s)="01110100011000010111100011000101111" : EndIf
    If zeichen.s(s) = "H" : mask.s(s)="10001100011000111111100011000110001" : EndIf
    If zeichen.s(s) = "I" : mask.s(s)="01110001000010000100001000010001110" : EndIf
    If zeichen.s(s) = "J" : mask.s(s)="00111000100001000010000101001001100" : EndIf
    If zeichen.s(s) = "K" : mask.s(s)="10001100101010011000101001001010001" : EndIf
    If zeichen.s(s) = "L" : mask.s(s)="10000100001000010000100001000011111" : EndIf
    If zeichen.s(s) = "M" : mask.s(s)="10001110111010110101100011000110001" : EndIf
    If zeichen.s(s) = "N" : mask.s(s)="10001100011100110101100111000110001" : EndIf
    If zeichen.s(s) = "O" : mask.s(s)="01110100011000110001100011000101110" : EndIf
    If zeichen.s(s) = "P" : mask.s(s)="11110100011000111110100001000010000" : EndIf
    If zeichen.s(s) = "Q" : mask.s(s)="01110100011000110001101011001001101" : EndIf
    If zeichen.s(s) = "R" : mask.s(s)="11110100011000111110101001001010001" : EndIf
    If zeichen.s(s) = "S" : mask.s(s)="01111100001000001110000010000111110" : EndIf
    If zeichen.s(s) = "T" : mask.s(s)="11111001000010000100001000010000100" : EndIf
    If zeichen.s(s) = "U" : mask.s(s)="10001100011000110001100011000101110" : EndIf
    If zeichen.s(s) = "V" : mask.s(s)="10001100011000110001100010101000100" : EndIf
    If zeichen.s(s) = "W" : mask.s(s)="10001100011000110101101011010101010" : EndIf
    If zeichen.s(s) = "X" : mask.s(s)="10001100010101000100010101000110001" : EndIf
    If zeichen.s(s) = "Y" : mask.s(s)="10001100011000101010001000010000100" : EndIf
    If zeichen.s(s) = "Z" : mask.s(s)="11111000010001001110010001000011111" : EndIf
    
    If zeichen.s(s) = "a" : mask.s(s)="00000000000111000001011111000101111" : EndIf
    If zeichen.s(s) = "b" : mask.s(s)="10000100001011011001100011000111110" : EndIf
    If zeichen.s(s) = "c" : mask.s(s)="00000000000111010000100001000101110" : EndIf
    If zeichen.s(s) = "d" : mask.s(s)="00001000010110110011100011000101111" : EndIf
    If zeichen.s(s) = "e" : mask.s(s)="00000000000111010001111111000001110" : EndIf
    If zeichen.s(s) = "f" : mask.s(s)="00110010010100011100010000100001000" : EndIf
    If zeichen.s(s) = "g" : mask.s(s)="00000011111000110001011110000101110" : EndIf
    If zeichen.s(s) = "h" : mask.s(s)="10000100001011011001100011000110001" : EndIf
    If zeichen.s(s) = "i" : mask.s(s)="00100000000110000100001000010001110" : EndIf
    If zeichen.s(s) = "j" : mask.s(s)="00010000000011000010000101001001100" : EndIf
    If zeichen.s(s) = "k" : mask.s(s)="10000100001001010100110001010010010" : EndIf
    If zeichen.s(s) = "l" : mask.s(s)="01100001000010000100001000010001110" : EndIf
    If zeichen.s(s) = "m" : mask.s(s)="00000000000101010101101011010110101" : EndIf
    If zeichen.s(s) = "n" : mask.s(s)="00000000001011011001100011000110001" : EndIf
    If zeichen.s(s) = "o" : mask.s(s)="00000000000111010001100011000101110" : EndIf
    If zeichen.s(s) = "p" : mask.s(s)="00000000001111010001111101000010000" : EndIf
    If zeichen.s(s) = "q" : mask.s(s)="00000000000111010010011100001000011" : EndIf
    If zeichen.s(s) = "r" : mask.s(s)="00000000001011011001100001000010000" : EndIf
    If zeichen.s(s) = "s" : mask.s(s)="00000000000111010000011100000111110" : EndIf
    If zeichen.s(s) = "t" : mask.s(s)="01000010001110001000010000100100110" : EndIf
    If zeichen.s(s) = "u" : mask.s(s)="00000000001000110001100011001101101" : EndIf
    If zeichen.s(s) = "v" : mask.s(s)="00000000001000110001100010101000100" : EndIf
    If zeichen.s(s) = "w" : mask.s(s)="00000000001000110001101011010101010" : EndIf
    If zeichen.s(s) = "x" : mask.s(s)="00000000001000101010001000101010001" : EndIf
    If zeichen.s(s) = "y" : mask.s(s)="00000000001000110001011110000101110" : EndIf
    If zeichen.s(s) = "z" : mask.s(s)="00000000001111100010001000100011111" : EndIf
    
    If zeichen.s(s) = "§" : mask.s(s)="01111100000111010001011100000111110" : EndIf
    If zeichen.s(s) = "Ä" : mask.s(s)="01010000000111010001111111000110001" : EndIf
    If zeichen.s(s) = "ä" : mask.s(s)="01010000000111000001011111000101111" : EndIf
    If zeichen.s(s) = "Ö" : mask.s(s)="01010000000111010001100011000101110" : EndIf
    If zeichen.s(s) = "ö" : mask.s(s)="00000010100000001110100011000101110" : EndIf
    If zeichen.s(s) = "Ü" : mask.s(s)="01010000001000110001100011000101110" : EndIf
    If zeichen.s(s) = "ü" : mask.s(s)="01010000001000110001100011001101101" : EndIf
    If zeichen.s(s) = "ß" : mask.s(s)="01110100011111010001110011011010000" : EndIf
    
  Next
  
  Matrix=CreateImage(0,dot_w_h*(6*Len(text.s)),dot_w_h*8)
  StartDrawing(ImageOutput(0))
  BackColor(RGB(0,0,0))
  
  For i=1 To 35*Len(text.s)
    hh+1
    If Val(Mid(mask.s(h+1), hh, 1)) = 1
      dot_farbe=LEDColorOn
    Else
      dot_farbe=LEDColorOff
    EndIf
    
    Box(((dot_x+t*dot_w_h)+a)+(dot_w_h/2), (dot_y+f*dot_w_h)+(dot_w_h)/2, dot_w_h-2, dot_w_h-2 , dot_farbe)
    
    If i % 5 = 0 : t-5 : f+1 : EndIf
    
    t+1
    
    If i % 35 = 0 : h+1 :hh=0: f=0 : t=0 : a+(dot_w_h*6) : EndIf
    
  Next
  
  StopDrawing()
  
  StartDrawing(WindowOutput(0))
  DrawImage(Matrix, x, y, ImageWidth(0), ImageHeight(0))
  StopDrawing()
  
EndProcedure

ExamineDesktops()

If OpenWindow(0, DesktopWidth(0)/2, DesktopHeight(0)/2, 430, 150, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible) 
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat 
    Dot_Matrix(FormatDate(" %dd.%mm.%yyyy ", Date()),0,0,6,$00ff00,$003000)
    Dot_Matrix(FormatDate("  %hh:%ii:%ss  ", Date()),0,50,6,$0000ff,$000030)
    Dot_Matrix(FormatDate("Hello World!", Date()),0,100,6,RGB(255,255,0),RGB(30,30,0))
    Delay(1) 
  Until  WindowEvent() = #PB_Event_CloseWindow 
EndIf 

Re: Dotmatrix Beispiel

Verfasst: 11.02.2011 17:04
von NicTheQuick
Also diese String-Masken mag ich ja überhaupt nicht. Wie wäre es, wenn du das einfach immer in Quads reinpackst? 35 Bit passen da dann ja mehr als locker rein. Speicher sparst du gleich auch noch und anstatt mühsam mit 'Mid()' da durch zu rennen, kannst du einfach locker shiften und mit & das unterste Bit auslesen.

Außerdem wäre statt den tausenden Ifs ein Select-Block viel einfacher in der Art:

Code: Alles auswählen

Select Asc(zeichen.s)
  Case 'a': blablubb
  Case 'b': blablubb
  ...
  Default: k.a.
EndSelect
Das sähe nicht nur schön aus, das wäre sogar gleich auch noch einfacher. :)

Wie du auch mit Pointern über Strings laufen kannst, kannst du dir dann ja bei Gelegenheit auch mal anschauen. :wink:

Re: Dotmatrix Beispiel

Verfasst: 11.02.2011 18:39
von STARGÅTE
@NicTheQuick:
Wir denken auf der selben Ebene ^^

wollte ihm auch schon den Code umschreiben, und BitMasken nutzen, war aber zu faul die Masken alle umzuconvertieren.
Wenn man diese dann noch in eine DataSection packt, kann man sich die komplette Select/If Sache sparen.
Weil man dann den Character direkt als Addition*8 für die Maske nutzen kann.

Hier mal die "Übersetzung", habe jedoch nur Ascii 32 bis 64 übersetzt ^^:

Code: Alles auswählen

EnableExplicit

Structure QuadArray : q.q[0] : EndStructure
Structure CharArray : c.c[0] : EndStructure

Procedure DrawLED(Text$, x, y, Size, LEDColorOn, LEDColorOff)

  Protected *Mask.QuadArray = ?Mask-8*32
  Protected Index.i, Bit.i, Asc.i, Shift.i = 1
  Protected *Char.CharArray = @Text$
  Protected Color.i, ImageID.i
   
  ImageID = CreateImage(0, Size*6*Len(Text$), Size*8)
  StartDrawing(ImageOutput(0))
    BackColor(RGB(0,0,0))
    While *Char\c[Index]
      Asc = *Char\c[Index]
      For Bit = 0 To 34
        If *Mask\q[Asc] & $400000000>>Bit
          Color = LEDColorOn
        Else
          Color = LEDColorOff
        EndIf
        Box(Shift+(Bit%5)*Size, Int(Bit/5)*Size+1, Size-2, Size-2, Color)
      Next
      Index + 1
      Shift + 6*Size
    Wend
  StopDrawing()
  StartDrawing(WindowOutput(0))
    DrawImage(ImageID, x, y, ImageWidth(0), ImageHeight(0))
  StopDrawing()
  FreeImage(0)
  
EndProcedure

ExamineDesktops()

If OpenWindow(0, DesktopWidth(0)/2, DesktopHeight(0)/2, 430, 150, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible) 
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat 
    DrawLED(FormatDate(" %dd.%mm.%yyyy ", Date()),0,0,6,$00ff00,$003000)
    DrawLED(FormatDate("# %hh:%ii:%ss #", Date()),0,50,6,$0000ff,$000030)
    Delay(10) 
  Until  WindowEvent() = #PB_Event_CloseWindow 
EndIf 

DataSection
  Mask:
  Data.q $000000000,$108421004,$294A00000,$295F57D4A,$11F4717C4,$632222263,$32544564D,$308800000
  Data.q $088842082,$208210888,$009575480,$0084F9080,$000003088,$0000F8000,$000003180,$002222200
  Data.q $3A33AE62E,$11842108E,$3A211111F,$3A213062E,$08CA97C42,$7E10F043E,$3A10F462E,$7E2111084
  Data.q $3A317462E,$3A317862E,$018C03180
EndDataSection

Re: Dotmatrix Beispiel

Verfasst: 12.02.2011 13:28
von Christian H
STARGÅTE hat geschrieben:Hier mal die "Übersetzung", habe jedoch nur Ascii 32 bis 64 übersetzt ^^:
Habe ein wenig an der "Übersetzung" gearbeitet:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 1000, 200, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible)
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat
    DrawLED(FormatDate(" %dd.%mm.%yyyy ", Date()),0,  0,6,$00ff00,$003000)
    DrawLED(FormatDate("# %hh:%ii:%ss #", Date()),0, 50,6,$0000ff,$000030)
    DrawLED("@ABCDEFGHIJKLMNOPQRSTUVWXYZ"        ,0,100,6,RGB(255,255,0),RGB(30,30,0))
    DrawLED("@abcdefghijklmnopqrstuvwxyz"        ,0,150,6,RGB(255,255,0),RGB(30,30,0))
    Delay(50)
  Until  WindowEvent() = #PB_Event_CloseWindow
EndIf

DataSection
  Mask:
  Data.q $000000000,$108421004,$294A00000,$295F57D4A,$11F4717C4,$632222263,$32544564D,$308800000
  Data.q $088842082,$208210888,$009575480,$0084F9080,$000003088,$0000F8000,$000003180,$002222200
  Data.q $3A33AE62E,$11842108E,$3A211111F,$3A213062E,$08CA97C42,$7E10F043E,$3A10F462E,$7E2111084
  Data.q $3A317462E,$3A317862E,$018C03180,$018C03088,$088882082,$001F07C00,$208208888,$382111004
  Data.q $3A33ADE0E
  Data.q $3A318FE31,$7A31F463E,$3A308422E       ;ABC
  Data.q %11100100101000110001100011001011100 ;D
  Data.q %11111100001000011110100001000011111 ;E
  Data.q %11111100001000011110100001000010000
  Data.q %01110100011000010111100011000101111
  Data.q %10001100011000111111100011000110001
  Data.q %01110001000010000100001000010001110
  Data.q %00111000100001000010000101001001100
  Data.q %10001100101010011000101001001010001
  Data.q %10000100001000010000100001000011111
  Data.q %10001110111010110101100011000110001
  Data.q %10001100011100110101100111000110001
  Data.q %01110100011000110001100011000101110
  Data.q %11110100011000111110100001000010000
  Data.q %01110100011000110001101011001001101
  Data.q %11110100011000111110101001001010001
  Data.q %01111100001000001110000010000111110
  Data.q %11111001000010000100001000010000100
  Data.q %10001100011000110001100011000101110
  Data.q %10001100011000110001100010101000100
  Data.q %10001100011000110101101011010101010
  Data.q %10001100010101000100010101000110001
  Data.q %10001100011000101010001000010000100
  Data.q %11111000010001001110010001000011111 ;Z
  Data.q %11100100001000010000100001000011100 ; [
  Data.q %00000100000100000100000100000100000 ; \
  Data.q %00111000010000100001000010000100111 ; ]
  Data.q %00100010101000100000000000000000000 ; ^
  Data.q %00000000000000000000000000000011111 ;_
  Data.q %00100000100000000000000000000000000 ; `
  ;       11111222223333344444555556666677777
  Data.q %00000000000111000001011111000101111 ;a
  Data.q %10000100001011011001100011000111110
  Data.q %00000000000111010000100001000101110
  Data.q %00001000010110110011100011000101111
  Data.q %00000000000111010001111111000001110
  Data.q %00110010010100011100010000100001000
  Data.q %00000011111000110001011110000101110
  Data.q %10000100001011011001100011000110001
  Data.q %00100000000110000100001000010001110
  Data.q %00010000000011000010000101001001100
  Data.q %10000100001001010100110001010010010
  Data.q %01100001000010000100001000010001110
  Data.q %00000000000101010101101011010110101
  Data.q %00000000001011011001100011000110001
  Data.q %00000000000111010001100011000101110
  Data.q %00000000001111010001111101000010000
  Data.q %00000000000111010010011100001000011
  Data.q %00000000001011011001100001000010000
  Data.q %00000000000111010000011100000111110
  Data.q %01000010001110001000010000100100110
  Data.q %00000000001000110001100011001101101
  Data.q %00000000001000110001100010101000100
  Data.q %00000000001000110001101011010101010
  Data.q %00000000001000101010001000101010001
  Data.q %00000000001000110001011110000101110
  Data.q %00000000001111100010001000100011111 ;z
EndDataSection
Gruß Christian

Re: Dotmatrix Beispiel

Verfasst: 12.02.2011 15:13
von tinux
Danke für die Tipps und Beispiele!

Code: Alles auswählen

EnableExplicit

Procedure DrawLED(Text$, x, y, Size, LEDColorOn, LEDColorOff)
  
  Structure QuadArray : q.q[0] : EndStructure
  Structure CharArray : c.c[0] : EndStructure
  
  Protected *Mask.QuadArray = ?Mask-8*32
  Protected Index.i, Bit.i, Asc.i, Shift.i = 1
  Protected *Char.CharArray = @Text$
  Protected Color.i, ImageID.i
   
  ImageID = CreateImage(0, Size*6*Len(Text$), Size*8)
  StartDrawing(ImageOutput(0))
    BackColor(RGB(0,0,0))
    While *Char\c[Index]
      Asc = *Char\c[Index]
      For Bit = 0 To 34
        If *Mask\q[Asc] & $400000000>>Bit
          Color = LEDColorOn
        Else
          Color = LEDColorOff
        EndIf
        Box(Shift+(Bit%5)*Size, Int(Bit/5)*Size+1, Size-1, Size-1, Color)
      Next
      Index + 1
      Shift + 6*Size
    Wend
  StopDrawing()
  StartDrawing(WindowOutput(0))
    DrawImage(ImageID, x, y, ImageWidth(0), ImageHeight(0))
  StopDrawing()
  FreeImage(0)
  
DataSection
  Mask:
  Data.q 0         ,$108421004,$294A00000,$295F57D4A,$11F4717C4,$632222263,$32544564D,$308800000 ; 32-
  Data.q $088842082,$208210888,$009575480,$0084F9080,$000003088,$0000F8000,$000003180,$002222200 ; 40-
  Data.q $3A33AE62E,$11842108E,$3A211111F,$3A213062E,$08CA97C42,$7E10F043E,$3A10F462E,$7E2111084 ; 48-
  Data.q $3A317462E,$3A317862E,$018C03180,$18C03088 ,$88882082 ,$1F07C00  ,$208208888,$382111004 ; 56-
  Data.q $3A33ADE0E,$3A318FE31,$7A31F463E,$3A308422E,$72518C65C,$7E10F421F,$7E10F4210,$3A30BC62F ; 64-
  Data.q $4631FC631,$38842108E,$1C4210A4C,$4654C5251,$42108421F,$4775AC631,$4639ACE31,$3A318C62E ; 72-
  Data.q $7A31F4210,$3A318D64D,$7A31F5251,$3E107043E,$7C8421084,$46318C62E,$46318C544,$4631AD6AA ; 80-
  Data.q $462A22A31,$463151084,$7C227221F,$188421086,$1041041  ,$30842108C,$115100000,$1F        ; 88-
  Data.q $10400000 ,$E0BE2F   ,$4216CC63E,$E8422E   ,$42D9C62F ,$E8FE0E   ,$1928E2108,$1F18BC2E  ; 96-
  Data.q $4216CC631,$100C2108E,$80610A4C ,$4212A6292,$30842108E,$AAD6B5   ,$16CC631  ,$E8C62E    ; 104-
  Data.q $1E8FA10  ,$E93843   ,$16CC210  ,$E8383E   ,$211C42126,$118C66D  ,$118C544  ,$118D6AA   ; 112-
  Data.q $1151151  ,$118BC2E  ,$1F1111F  ,0         ,0         ,0         ,0         ,0          ; 120-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 128-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 136-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 144-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 152-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,$3E0E8B83E ; 160-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 168-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 176-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 184-
  Data.q 0         ,0         ,0         ,0         ,$280E8FE31,0         ,0         ,0          ; 192-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 200-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,$280E8C62E,0          ; 208-
  Data.q 0         ,0         ,0         ,0         ,$28118C62E,0         ,0         ,$3A3E8E6D0 ; 216-
  Data.q 0         ,0         ,0         ,0         ,$280E0BE2F,0         ,0         ,0          ; 224-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,0         ,0          ; 232-
  Data.q 0         ,0         ,0         ,0         ,0         ,0         ,$1407462E ,0          ; 240-
  Data.q 0         ,0         ,0         ,0         ,$28118C66D,0         ,0         ,0          ; 248-255
EndDataSection  
  
EndProcedure

ExamineDesktops()

If OpenWindow(0, DesktopWidth(0)/2, DesktopHeight(0)/2, 430, 160, "Dot Matrix", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible)
  SetWindowColor(0, RGB(0,0,0))
  HideWindow(0, 0)
  Repeat
    DrawLED(FormatDate(" %dd.%mm.%yyyy ", Date()),0,0,6,$00ff00,$003000)
    DrawLED(FormatDate("# %hh:%ii:%ss #", Date()),0,50,6,$0000ff,$000030)
    DrawLED("@ABCDEFGHIJKLMNOPQRSTUVWXYZ",0,100,2,$ffff00,$303000)
    DrawLED("@abcdefghijklmnopqrstuvwxyz",0,120,2,$ffff00,$303000)
    DrawLED("§ÄäÖöÜüß",0,140,2,$ffff00,$303000)
    Delay(50)
  Until  WindowEvent() = #PB_Event_CloseWindow
EndIf

Gruß tinux