'USART settings
'#define USART_BAUD_RATE 9600
'#define USART_BLOCKING
'#define USART_TX_BLOCKING

'#define GLCD_RESET 8   ' LCD RST .... Pin 1
'#define GLCD_DC    0   ' LCD Dat/Com. Pin 5
'#define GLCD_SDIN  1   ' LCD SPIDat . Pin 6
'#define GLCD_SCLK  3   ' LCD SPIClk . Pin 4

#define LCD_X     84
#define LCD_Y     48

#define LCD_COM   0 
#define LCD_DAT   1


Sub InitGlcd

    Set GLCD_RESET Off
    wait 100 ms
    Set GLCD_RESET On

    GlcdWrite( LCD_COM, 0x21 )                   ' LCD Extended Commands
    GlcdWrite( LCD_COM, 0xBf )               ' Set LCD Vop Contrast. 'B1
    GlcdWrite( LCD_COM, 0x04 )              ' Set Temp coefficent. '0x04
    GlcdWrite( LCD_COM, 0x14 )               ' LCD bias mode 1:48. '0x13
    GlcdWrite( LCD_COM, 0x0C )    ' LCD in normal mode. 0x0d for inverse
    GlcdWrite( LCD_COM, 0x20 )
    GlcdWrite( LCD_COM, 0x0C )
End Sub

Sub GlcdWrite( Glcdcomdat, Glcddat )

    if Glcdcomdat=1 then                                           ' Is data
        Set GLCD_DC On
    else
        Set GLCD_DC Off
    end if
    repeat 8                                          ' Send byte to lcd
        Set GLCD_SCLK Off

        if Glcddat.7=1  then
            Set GLCD_SDIN On
        else            
            Set GLCD_SDIN Off
        end if
        rotate Glcddat left
        
        Set GLCD_SCLK On
        wait 1 us
    end repeat
End Sub

Sub GlcdClear
    repeat 503
        GlcdWrite( LCD_DAT, 0x00 )
    end repeat
End Sub

Sub GlcdCharacter( Glcdchar )

    if Glcdchar < 0x50 then
        Glcdchar = (Glcdchar-0x20)*5
        repeat 5
            Glcdchar += 1
            ReadTable ascii_table_L, Glcdchar, charLine
            GlcdWrite( LCD_DAT, charLine )
        end repeat
    else
        Glcdchar = (Glcdchar-0x50)*5
        repeat 5
            Glcdchar += 1
            ReadTable ascii_table_H, Glcdchar, charLine
            GlcdWrite( LCD_DAT, charLine )
        end repeat
    end if
    GlcdWrite( LCD_DAT, 0x00 )
End Sub

Sub GlcdPrint( in GlcdstrDat as string )

    for GlcdIndex=1 to GlcdstrDat(0)
        GlcdCharacter( GlcdstrDat( GlcdIndex ) )
    next
End Sub

Sub GlcdPrint( In GlcdNumberI as Integer )

    if GlcdNumberI < 0 then
       GlcdPrint( "-" )
       GlcdNumberI = -GlcdNumberI;
    end if
   GlcdPrintFa( GlcdNumberI )
End Sub

Sub GlcdPrint( In GlcdNumber as long )

    GlcdPrintFa( GlcdNumber )
End Sub

Sub GlcdPrintFa( in GlcdNumber as long )

    Dim GlcdNum(10)
    
    for GlcdIndex=10 to 1                                'Process digits
        GlcdNum(GlcdIndex) = GlcdNumber%10
        GlcdNumber = GlcdNumber/10
    next
    Do while GlcdNum(GlcdIndex)=0                   'Find first non cero
        GlcdIndex += 1
    Loop
    Do while GlcdIndex < 11                                'Print number
        GlcdCharacter( GlcdNum(GlcdIndex)+0x30 )
        GlcdIndex += 1
    Loop
End Sub

Sub GlcdGotoXY( In Glcdp_x, In Glcdp_y )

  GlcdWrite( LCD_COM, (0x80 | Glcdp_x) )                            ' Column
  GlcdWrite( LCD_COM, (0x40 | Glcdp_y) )                               ' Row
End Sub

Sub GlcdDrawPixel( In Glcdp_x, In Glcdp_y )

    ReadTable pix_table, Glcdp_y%8+1, Glcdpix
    Glcdp_y = Glcdp_y/8
    GlcdGotoXY( Glcdp_x, Glcdp_y )
    
    GlcdWrite( LCD_DAT, Glcdpix )
End Sub

Sub GlcdDrawFrame                                    'draw display frame
 
    for GlcdIndex=0 to 83                                          ' Top
        GlcdGotoXY( GlcdIndex, 0 )
        GlcdWrite( LCD_DAT, 0x01 )
    next
    for GlcdIndex=0 to 83                                        'Bottom
        GlcdGotoXY( GlcdIndex, 5 )
        GlcdWrite( LCD_DAT, 0x80 )
    next
    for GlcdIndex=0 to 5                                         ' Right
        GlcdGotoXY( 83, GlcdIndex )
        GlcdWrite( LCD_DAT, 0xff )
    next
    for GlcdIndex=0 to 5                                          ' Left
        GlcdGotoXY( 0, GlcdIndex )
        GlcdWrite( LCD_DAT, 0xff)
    next
End Sub

Table ascii_table_L
0x00, 0x00, 0x00, 0x00, 0x00 ' 20  
0x00, 0x00, 0x5f, 0x00, 0x00 ' 21 !
0x00, 0x07, 0x00, 0x07, 0x00 ' 22 "
0x14, 0x7f, 0x14, 0x7f, 0x14 ' 23 #
0x24, 0x2a, 0x7f, 0x2a, 0x12 ' 24 $
0x23, 0x13, 0x08, 0x64, 0x62 ' 25 %
0x36, 0x49, 0x55, 0x22, 0x50 ' 26 &
0x00, 0x05, 0x03, 0x00, 0x00 ' 27 
0x00, 0x1c, 0x22, 0x41, 0x00 ' 28 (
0x00, 0x41, 0x22, 0x1c, 0x00 ' 29 )
0x14, 0x08, 0x3e, 0x08, 0x14 ' 2a *
0x08, 0x08, 0x3e, 0x08, 0x08 ' 2b +
0x00, 0x50, 0x30, 0x00, 0x00 ' 2c ,
0x08, 0x08, 0x08, 0x08, 0x08 ' 2d -
0x00, 0x60, 0x60, 0x00, 0x00 ' 2e .
0x20, 0x10, 0x08, 0x04, 0x02 ' 2f /
0x3e, 0x51, 0x49, 0x45, 0x3e ' 30 0
0x00, 0x42, 0x7f, 0x40, 0x00 ' 31 1
0x42, 0x61, 0x51, 0x49, 0x46 ' 32 2
0x21, 0x41, 0x45, 0x4b, 0x31 ' 33 3
0x18, 0x14, 0x12, 0x7f, 0x10 ' 34 4
0x27, 0x45, 0x45, 0x45, 0x39 ' 35 5
0x3c, 0x4a, 0x49, 0x49, 0x30 ' 36 6
0x01, 0x71, 0x09, 0x05, 0x03 ' 37 7
0x36, 0x49, 0x49, 0x49, 0x36 ' 38 8
0x06, 0x49, 0x49, 0x29, 0x1e ' 39 9
0x00, 0x36, 0x36, 0x00, 0x00 ' 3a :
0x00, 0x56, 0x36, 0x00, 0x00 ' 3b ,
0x08, 0x14, 0x22, 0x41, 0x00 ' 3c <
0x14, 0x14, 0x14, 0x14, 0x14 ' 3d =
0x00, 0x41, 0x22, 0x14, 0x08 ' 3e >
0x02, 0x01, 0x51, 0x09, 0x06 ' 3f ?
0x32, 0x49, 0x79, 0x41, 0x3e ' 40 @
0x7e, 0x11, 0x11, 0x11, 0x7e ' 41 A
0x7f, 0x49, 0x49, 0x49, 0x36 ' 42 B
0x3e, 0x41, 0x41, 0x41, 0x22 ' 43 C
0x7f, 0x41, 0x41, 0x22, 0x1c ' 44 D
0x7f, 0x49, 0x49, 0x49, 0x41 ' 45 E
0x7f, 0x09, 0x09, 0x09, 0x01 ' 46 F
0x3e, 0x41, 0x49, 0x49, 0x7a ' 47 G
0x7f, 0x08, 0x08, 0x08, 0x7f ' 48 H
0x00, 0x41, 0x7f, 0x41, 0x00 ' 49 I
0x20, 0x40, 0x41, 0x3f, 0x01 ' 4a J
0x7f, 0x08, 0x14, 0x22, 0x41 ' 4b K
0x7f, 0x40, 0x40, 0x40, 0x40 ' 4c L
0x7f, 0x02, 0x0c, 0x02, 0x7f ' 4d M
0x7f, 0x04, 0x08, 0x10, 0x7f ' 4e N
0x3e, 0x41, 0x41, 0x41, 0x3e ' 4f O
End Table

Table ascii_table_H
0x7f, 0x09, 0x09, 0x09, 0x06 ' 50 P
0x3e, 0x41, 0x51, 0x21, 0x5e ' 51 Q
0x7f, 0x09, 0x19, 0x29, 0x46 ' 52 R
0x46, 0x49, 0x49, 0x49, 0x31 ' 53 S
0x01, 0x01, 0x7f, 0x01, 0x01 ' 54 T
0x3f, 0x40, 0x40, 0x40, 0x3f ' 55 U
0x1f, 0x20, 0x40, 0x20, 0x1f ' 56 V
0x3f, 0x40, 0x38, 0x40, 0x3f ' 57 W
0x63, 0x14, 0x08, 0x14, 0x63 ' 58 X
0x07, 0x08, 0x70, 0x08, 0x07 ' 59 Y
0x61, 0x51, 0x49, 0x45, 0x43 ' 5a Z
0x00, 0x7f, 0x41, 0x41, 0x00 ' 5b [
0x02, 0x04, 0x08, 0x10, 0x20 ' 5c ¥
0x00, 0x41, 0x41, 0x7f, 0x00 ' 5d ]
0x04, 0x02, 0x01, 0x02, 0x04 ' 5e ^
0x40, 0x40, 0x40, 0x40, 0x40 ' 5f _
0x00, 0x01, 0x02, 0x04, 0x00 ' 60 `
0x20, 0x54, 0x54, 0x54, 0x78 ' 61 a
0x7f, 0x48, 0x44, 0x44, 0x38 ' 62 b
0x38, 0x44, 0x44, 0x44, 0x20 ' 63 c
0x38, 0x44, 0x44, 0x48, 0x7f ' 64 d
0x38, 0x54, 0x54, 0x54, 0x18 ' 65 e
0x08, 0x7e, 0x09, 0x01, 0x02 ' 66 f
0x0c, 0x52, 0x52, 0x52, 0x3e ' 67 g
0x7f, 0x08, 0x04, 0x04, 0x78 ' 68 h
0x00, 0x44, 0x7d, 0x40, 0x00 ' 69 i
0x20, 0x40, 0x44, 0x3d, 0x00 ' 6a j 
0x7f, 0x10, 0x28, 0x44, 0x00 ' 6b k
0x00, 0x41, 0x7f, 0x40, 0x00 ' 6c l
0x7c, 0x04, 0x18, 0x04, 0x78 ' 6d m
0x7c, 0x08, 0x04, 0x04, 0x78 ' 6e n
0x38, 0x44, 0x44, 0x44, 0x38 ' 6f o
0x7c, 0x14, 0x14, 0x14, 0x08 ' 70 p
0x08, 0x14, 0x14, 0x18, 0x7c ' 71 q
0x7c, 0x08, 0x04, 0x04, 0x08 ' 72 r
0x48, 0x54, 0x54, 0x54, 0x20 ' 73 s
0x04, 0x3f, 0x44, 0x40, 0x20 ' 74 t
0x3c, 0x40, 0x40, 0x20, 0x7c ' 75 u
0x1c, 0x20, 0x40, 0x20, 0x1c ' 76 v
0x3c, 0x40, 0x30, 0x40, 0x3c ' 77 w
0x44, 0x28, 0x10, 0x28, 0x44 ' 78 x
0x0c, 0x50, 0x50, 0x50, 0x3c ' 79 y
0x44, 0x64, 0x54, 0x4c, 0x44 ' 7a z
0x00, 0x08, 0x36, 0x41, 0x00 ' 7b {
0x00, 0x00, 0x7f, 0x00, 0x00 ' 7c |
0x00, 0x41, 0x36, 0x08, 0x00 ' 7d ,
0x10, 0x08, 0x08, 0x10, 0x08 ' 7e ←
0x00, 0x06, 0x09, 0x09, 0x06 ' 7f →
End Table

Table pix_table
b'00000001'
b'00000010'
b'00000100'
b'00001000'
b'00010000'
b'00100000'
b'01000000'
b'10000000'
End Table

