#Region Project Attributes
    #AutoFlushLogs: True
    #CheckArrayBounds: True
    #StackBufferSize: 300
#End Region
Sub Process_Globals
    Public Serial1 As Serial
    Private led As LedControl
    Public DINPin As Pin
    Public CSpin As Pin
    Public CLKPin As Pin
    Public Timer1 As Timer
    Public count As Byte
    Public stringtext As String="B4R is great!"  'Text to display
    Public Timerinterval As Long=2000              '2 seconds
    Public bc As ByteConverter
    Public indextext As Int
    Public rows As Int=8                'rmax7219 8x8 display
    Public columns As Int=8
    Public firstchar As Int=2           'place on LCD to begin displaying char
    Public appearchareffect As Int=100 'appear effect on displaying string
End Sub
Private Sub AppStart
    Serial1.Initialize(115200)
    Timer1.Initialize("Timer1_Tick",Timerinterval)
    DINPin.Initialize(10,DINPin.MODE_OUTPUT)
    CSpin.Initialize(9,CSpin.MODE_OUTPUT)
    CLKPin.Initialize(8,CLKPin.MODE_OUTPUT)
    Log("AppStart")
    led.Initialize(DINPin.PinNumber,CLKPin.PinNumber,CSpin.PinNumber,1)
    led.Shutdown(0, False)
    led.SetIntensity(0, 8)
    If firstchar >3 Then firstchar=2  'char (5 rows values) + firstchar place <=8
    Timer1.Enabled=True
End Sub
Sub GetByte(Index As UInt) As Byte
   Return RunNative("getdata", Index)
End Sub
Sub Timer1_Tick
    led.ClearDisplay(0)
    Dim charmapindex As Int=stringtext.GetBytes(indextext)  'Get character
    For j=0 To 4  'Get the five rows that build the char (see charmap Inline C# code)
        led.setRow(0,firstchar+j,GetByte((charmapindex-31)*5+j)) ' Substracting 31 as first char in charmap begins before sp (ASCII)
        Delay(appearchareffect)
    Next
    If indextext=stringtext.Length-1 Then
        indextext=0
    Else
        indextext=indextext+1
    End If
End Sub
#if C
#include <avr/pgmspace.h>
    const PROGMEM byte data[] = { //change the data here
    0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, // sp
    0x00, 0x00, 0x2f, 0x00, 0x00, // !
    0x00, 0x07, 0x00, 0x07, 0x00, // "
    0x14, 0x7f, 0x14, 0x7f, 0x14,  // #
    0x24, 0x2a, 0x7f, 0x2a, 0x12, //$
    0xc4, 0xc8, 0x10, 0x26, 0x46,  //%
    0x36, 0x49, 0x55, 0x22, 0x50,  //&
    0x00, 0x05, 0x03, 0x00, 0x00,  //'
    0x00, 0x1c, 0x22, 0x41, 0x00,  //(
    0x00, 0x41, 0x22, 0x1c, 0x00,  //)
    0x14, 0x08, 0x3E, 0x08, 0x14, // *
    0x08, 0x08, 0x3E, 0x08, 0x08,  //+
    0x00, 0x00, 0x50, 0x30, 0x00,  //,
    0x10, 0x10, 0x10, 0x10, 0x10,  //-
    0x00, 0x60, 0x60, 0x00, 0x00, // .
    0x20, 0x10, 0x08, 0x04, 0x02,  ///
    0x3E, 0x51, 0x49, 0x45, 0x3E,  //0
    0x00, 0x42, 0x7F, 0x40, 0x00,  //1
    0x42, 0x61, 0x51, 0x49, 0x46,  //2
    0x21, 0x41, 0x45, 0x4B, 0x31,  //3
    0x18, 0x14, 0x12, 0x7F, 0x10,  //4
    0x27, 0x45, 0x45, 0x45, 0x39,  //5
    0x3C, 0x4A, 0x49, 0x49, 0x30,  //6
    0x01, 0x71, 0x09, 0x05, 0x03, // 7
    0x36, 0x49, 0x49, 0x49, 0x36,  //8
    0x06, 0x49, 0x49, 0x29, 0x1E,  //9
    0x00, 0x36, 0x36, 0x00, 0x00,  //:
    0x00, 0x56, 0x36, 0x00, 0x00,  //;
    0x08, 0x14, 0x22, 0x41, 0x00,  //<
    0x14, 0x14, 0x14, 0x14, 0x14,  //=
    0x00, 0x41, 0x22, 0x14, 0x08,  //>
    0x02, 0x01, 0x51, 0x09, 0x06,  //?
    0x32, 0x49, 0x59, 0x51, 0x3E,  //@
    0x7E, 0x11, 0x11, 0x11, 0x7E,  //A
    0x7F, 0x49, 0x49, 0x49, 0x36,  //B
    0x3E, 0x41, 0x41, 0x41, 0x22,  //C
    0x7F, 0x41, 0x41, 0x22, 0x1C,  //D
    0x7F, 0x49, 0x49, 0x49, 0x41,  //E
    0x7F, 0x09, 0x09, 0x09, 0x01,  //F
    0x3E, 0x41, 0x49, 0x49, 0x7A,  //G
    0x7F, 0x08, 0x08, 0x08, 0x7F,  //H
    0x00, 0x41, 0x7F, 0x41, 0x00,  //I
    0x20, 0x40, 0x41, 0x3F, 0x01,  //J
    0x7F, 0x08, 0x14, 0x22, 0x41,  //K
    0x7F, 0x40, 0x40, 0x40, 0x40,  //L
    0x7F, 0x02, 0x0C, 0x02, 0x7F,  //M
    0x7F, 0x04, 0x08, 0x10, 0x7F,  //N
    0x3E, 0x41, 0x41, 0x41, 0x3E,  //O
    0x7F, 0x09, 0x09, 0x09, 0x06,  //P
    0x3E, 0x41, 0x51, 0x21, 0x5E,  //Q
    0x7F, 0x09, 0x19, 0x29, 0x46,  //R
    0x46, 0x49, 0x49, 0x49, 0x31,  //S
    0x01, 0x01, 0x7F, 0x01, 0x01, // T
    0x3F, 0x40, 0x40, 0x40, 0x3F,  //U
    0x1F, 0x20, 0x40, 0x20, 0x1F,  //V
    0x3F, 0x40, 0x38, 0x40, 0x3F,  //W
    0x63, 0x14, 0x08, 0x14, 0x63,  //X
    0x07, 0x08, 0x70, 0x08, 0x07,  //Y
    0x61, 0x51, 0x49, 0x45, 0x43,  //Z
    0x00, 0x7F, 0x41, 0x41, 0x00,  //[
    0x55, 0x2A, 0x55, 0x2A, 0x55,  //55
    0x00, 0x41, 0x41, 0x7F, 0x00,  //]
    0x04, 0x02, 0x01, 0x02, 0x04,  //^
    0x40, 0x40, 0x40, 0x40, 0x40, //,
    0x00, 0x01, 0x02, 0x04, 0x00,  //'
    0x20, 0x54, 0x54, 0x54, 0x78,  //a
    0x7F, 0x48, 0x44, 0x44, 0x38,  //b
    0x38, 0x44, 0x44, 0x44, 0x20,  //c
    0x38, 0x44, 0x44, 0x48, 0x7F,  //d
    0x38, 0x54, 0x54, 0x54, 0x18,  //e
    0x08, 0x7E, 0x09, 0x01, 0x02,  //f
    0x0C, 0x52, 0x52, 0x52, 0x3E,  //g
    0x7F, 0x08, 0x04, 0x04, 0x78, // h
    0x00, 0x44, 0x7D, 0x40, 0x00,  //i
    0x20, 0x40, 0x44, 0x3D, 0x00,  //j
    0x7F, 0x10, 0x28, 0x44, 0x00, // k
    0x00, 0x41, 0x7F, 0x40, 0x00, // l
    0x7C, 0x04, 0x18, 0x04, 0x78, // m
    0x7C, 0x08, 0x04, 0x04, 0x78,  //n
    0x38, 0x44, 0x44, 0x44, 0x38,  //o
    0x7C, 0x14, 0x14, 0x14, 0x08, // p
    0x08, 0x14, 0x14, 0x18, 0x7C,  //q
    0x7C, 0x08, 0x04, 0x04, 0x08,  //r
    0x48, 0x54, 0x54, 0x54, 0x20,  //s
    0x04, 0x3F, 0x44, 0x40, 0x20,  //t
    0x3C, 0x40, 0x40, 0x20, 0x7C,  //u
    0x1C, 0x20, 0x40, 0x20, 0x1C,  //v
    0x3C, 0x40, 0x30, 0x40, 0x3C, // w
    0x44, 0x28, 0x10, 0x28, 0x44,  //x
    0x0C, 0x50, 0x50, 0x50, 0x3C,  //y
    0x44, 0x64, 0x54, 0x4C, 0x44   //z
    };
B4R::Object beo1;
B4R::Object* getdata(B4R::Object* o) {
   return beo1.wrapNumber(pgm_read_byte_near(data + o->toLong()));
}
#end if