Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wyświetlacz od Nokii 3310, Bascom - komendy,obsługa

tyrystor12 14 Lis 2009 00:49 10226 9
  • #1 14 Lis 2009 00:49
    tyrystor12
    Poziom 8  

    Witam .
    Od pewnego czasu poszukuję informacji na temat obsługi monochromatycznego wyświetlacza graficznego od Nokii 3310 w Bascomie, ale na razie nic konkretnego nie znalazłem. W internecie jest wiele tematów na ten temat, ale żaden mi nie pomógł. Chodzi mi o :

    1. Obsługę wyświetlacza - Jaka najlepsza jest częstotliwość odświeżania, jak skonfigurować parametry wyświetlacza w Bascomie?... (Config......,.....,...)
    2. Jakie są komendy sterujące pracą wyświetlacza w Bascomie ? - jak się ich używa itp...
    3. W jaki sposób narysować dowolna figurę geometryczną, nadać jej wypełnienie, wyświetlić tekst?
    4. Jakie są wymagania w stosunku do mikro-kontrolera AVR - pamięć ... (czy np. MEGA8 się nada do prostych zastosowań?
    Za wszelkie odpowiedzi dziękuję.

    0 9
  • Mitronik
  • Pomocny post
    #2 14 Lis 2009 08:04
    ZbeeGin
    Poziom 38  

    tyrystor12 napisał:
    1. Obsługę wyświetlacza - Jaka najlepsza jest częstotliwość odświeżania, jak skonfigurować parametry wyświetlacza w Bascomie?... (Config......,.....,...)

    Zapomnij. Bascom nie ma natywnej obsługi tego wyświetlacza.

    tyrystor12 napisał:
    2. Jakie są komendy sterujące pracą wyświetlacza w Bascomie ? - jak się ich używa itp...

    Też zapomnij. Nie ma takich.

    Lepiej użyj forumowej/sieciowej wyszukiwarki, rusz głową i napisz sam.

    0
  • Mitronik
  • Pomocny post
    #3 14 Lis 2009 18:54
    M. S.
    Poziom 34  

    Prześledź to: (co zbyteczne, wyrzuć. Mega 8 daje radę)

    Code:
    '-----------LCD for Nokia 3310 and Mega AVR---------------------------------------
    
    '
    'Based on Louis Frigon program in C: "Nokia LCD Library" at www.microsyl.com
    'and
    'Darek Dobrowolski program in Bascom: "Wysterowanie wyświetlacza LCD LPH7779(Nokia 3310) przez ATmega128L cz.1,2,3" at
    'http://maxparadys.w.interia.pl/avr.htm
    '
    'I think bitmap prepared with FastLCD from http://www.fastavr.com/
    '
    '
    'By RGB 12.06.05
    '
    'Bascom AVR 1.11.7.7
    '--------------------------------------------------------------------------------

    'Set in Options, Compiler:
    'Hwstc = 128
    'Softstc = 128
    'Frame = 128

    $regfile = "m8def.dat"
    $crystal = 4000000


    'LCD VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    Config Pinb.0 = Output
    Config Pinb.2 = Output
    Config Pinb.1 = Output

    Config Pinb.3 = Output
    Config Pinb.5 = Output
    Enable Interrupts
    Enable Spi

    Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 4 , Noss = 1
    Spiinit

    '---------------------- LCD vars  ----------------------------
    Dim Lcd_data As Byte
    Dim Updatelcd As Bit                                        '1 = Update
    Dim Lcd_cache(504) As Byte                                  'data to send to LCD RAM
    Dim Lcdcacheidx As Word                                     'pointer
    Dim Ch As Byte


    '---------------------- Aliases ------------------------------------
    Lcd_dc Alias Portb.0                                        'low = command mode, high = data
    Lcd_sce Alias Portb.2                                       'low = enable LCD SPI, high = SPI disable
    Lcd_rst Alias Portb.1                                       'low = reset

    '--------------------- LCD constants -----------------------------
    Const Lcd_inver = &H0D                                      'inverted  screen (after normal command mode)




    Const Lcd_normal = &H0C                                     'normal  screen (after normal command mode)
    Const Test = &H09                                           'All pixels on (after normal command mode)
    Const Normal_command = &H20                                 'normal command mode

    '--------------------- LCD Sub declarations -------------------------
    Declare Sub Lcd_cmd(byval Command As Byte )
    Declare Sub Lcdinit
    Declare Sub Lcdclear
    Declare Sub Lcdupdate
    Declare Sub Lcdgoxy(byval X As Byte , Byval Y As Byte)
    'from 1,1 to 14,6
    Declare Sub Lcdchr(byval Ch As Byte , Byval Lcdfontsize As Byte , Byval Ch_inv As Byte)
    'ch=character, Lcdfontsize 1 = high 1, Lcdfontsize 2=high 2, Ch_inv 1=inverse
    Declare Sub Lcdstr(byval Lcdstring As String , Byval Lcdfontsize As Byte , Byval Ch_inv As Byte)
    'lcdstring = string to LCD, Lcdfontsize 1 = high 1, Lcdfontsize 2=high 2, Ch_inv 1=inverse
    Declare Sub Lcdpixel(byval X As Byte , Byval Y As Byte , Byval Pixelmode As Byte )
    'x 1-84, y 1-48, pixelmode 0=OFF, pixelmode 1=ON, pixelmode 2=XOR
    Declare Sub Lcdline(byval X1 As Byte , Byval Y1 As Byte , Byval X2 As Byte , Byval Y2 As Byte , Byval Pixelmode As Byte )
    'xy1=start, xy2=end of line, pixelmode as in Lcdpixel
    Declare Sub Lcdrectangle(byval X3 As Byte , Byval Y3 As Byte , Byval Wide As Byte , Byval Height As Byte)
    Declare Sub Show(byval Xx As Byte , Byval Yy As Byte)
    'show bitmap from program memory. XX 1 to (84-_width), YY 1 to 6 (n*8)
    Declare Sub Clearshow(byval Xx As Byte , Byval Yy As Byte)
    'clear window last show
    'LCD ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    '--------------------- LCD Init ----------------------------------
    Call Lcdinit                                                'must be first in program!!!

    'vvvvvvvvvvvvvvvvvvvv DEMO VVVVVVVVVVVVVVVVVVVVVVVVVVV

    Dim Ii As Byte
    Dim Wsk As Byte
    Wsk = 0

    Do
       Lcdclear

       Lcdgoxy 6 , 5
       Lcdstr "Text" , 1 , 0
       Lcdupdate
       Wait 2

       Lcdgoxy 1 , 1
       Lcdstr "Normal" , 1 , 0
       Lcdupdate
       Wait 2

       Lcdgoxy 9 , 1
       Lcdstr "Inwers" , 1 , 1
       Lcdupdate
       Wait 2

       Lcdgoxy 1 , 3
       Lcdstr "Double" , 2 , 0
       Lcdupdate
       Wait 2

       Lcdgoxy 1 , 3
       Lcdstr "Bitmap" , 2 , 0
       Restore Egypt
       Show 1 , 4
       Lcdupdate
       Wait 3

       Lcdclear

       Lcdgoxy 3 , 3
       Lcdstr "  Pixels " , 1 , 0
       Lcdupdate
       Wait 1

       For Ii = 1 To 84
          If Wsk = 0 Then
             Wsk = 1
          Else
             Wsk = 0
          End If
          Lcdpixel Ii , 8 , Wsk
          Lcdupdate
          Waitms 10
       Next Ii

       Lcdgoxy 3 , 3
       Lcdstr "  Line   " , 1 , 0
       Lcdupdate
       Wait 1
       Lcdline 1 , 1 , 84 , 48 , 1
       Lcdupdate
       Wait 3

       Lcdgoxy 3 , 3
       Lcdstr "  Line XOR" , 1 , 1
       Lcdgoxy 3 , 4
       Lcdstr "          " , 1 , 1
       Lcdupdate
       Wait 1
       Lcdline 84 , 1 , 1 , 48 , 2
       Lcdupdate
       Wait 3

       Lcdgoxy 3 , 3
       Lcdstr "Rectangle " , 1 , 0
       Lcdupdate
       Wait 1

       Lcdrectangle 3 , 3 , 80 , 43
       Lcdupdate
       Wait 2

     Loop

    '^^^^^^^^^^^^^^^^^^^^^ DEMO ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



    '  ----------------------- LCD subroutines -----------------------

    '----------------------- Lcd_cmd (Command) ----------------------
    Sub Lcd_cmd(byval Command As Byte )
       Reset Lcd_sce                                            ' SPI enable
       Reset Lcd_dc                                             ' command mode
       Spiout Command , 1
       Set Lcd_dc                                               ' data mode
       Set Lcd_sce                                              ' data mode
    End Sub

    '----------------------- Lcdinit ------------------------------
    Sub Lcdinit
       Waitms 5
       Reset Lcd_rst                                            'RESET LCD
       Waitms 5
       Set Lcd_rst                                              'end of reset
       Set Lcd_sce                                              'in Lcd_cmd() will be "L"!
       Call Lcd_cmd(&H21)                                       'extended command mode
       Call Lcd_cmd(&Hf8)                                       'c8LCD contrast (mayby you must change)
       Call Lcd_cmd(&H06)                                        'temperature compensation
       Call Lcd_cmd(&H13)                                        'bias 1:48
       Call Lcd_cmd(&H20)                                        'normal command mode
       Call Lcd_cmd(&H0c)                                        'normal display
       Call Lcd_cmd(&H40)                                        'Y=0
       Call Lcd_cmd(&H80)                                        'X=0
       Call Lcdclear
       Call Lcdupdate
    End Sub

    '---------------------- Lcdclear ------------------------------
    Sub Lcdclear
       Local I As Word
       For I = 1 To 504
           Lcd_cache(i) = 0
       Next I
    '    Lcdcacheidx = 1
    End Sub
    '--------------------- Lcdupdate -------------------------------
    'copy full LCD_cache to LCD RAM
    Sub Lcdupdate
       Local I As Word
       Call Lcd_cmd(&H80)                                        'sets 0 X-addr of RAM
       Call Lcd_cmd(&H40)                                        'sets 0 Y-addr of RAM
       For I = 1 To 504
         Lcd_data = Lcd_cache(i)
         Reset Lcd_sce                                          'SPI to LCD enable
         Set Lcd_dc                                             'Data
         Spiout Lcd_data , 1
         While Spsr.7 = 1                                       'wait until SPIF = 0
         Wend
         Reset Lcd_dc
         Set Lcd_sce                                            'SPI to LCD disable
       Next I
       Updatelcd = 0
    End Sub

    '--------------------- Lcdgoxy--------------------------------
    Sub Lcdgoxy(byval X As Byte , Byval Y As Byte)              'from 1,1 to 14,6
       Local I As Word
       Local J As Word
       X = X - 1
       I = X
       I = I * 6
       Y = Y - 1
       J = Y
       J = Y * 84
       Lcdcacheidx = I + J
       Incr Lcdcacheidx                                         'Lcdchacheidx 1-504!
    End Sub

    '------------------ Lcdchr-------------------------------------
    Sub Lcdchr(byval Ch As Byte , Byval Lcdfontsize As Byte , Byval Ch_inv As Byte)       '1 character on LCD
       Local I As Byte
       Local J As Word
       Local K As Byte
       Local Ba As Byte
       Local Bb As Byte
       Local Tmpidx As Word
       Local Tmpidx1 As Word
       If Ch < &H20 Then Ch = 92
       If Ch > &H7B Then Ch = 92
       J = Ch - 32
       J = J * 5
       If Lcdfontsize = 1 Then
          For I = 1 To 6
             K = Lookup(j , Fontlookup)
             If Ch_inv = 1 Then                                 'negative
                If I = 6 Then                                   'black for 6 row
                   K = 255
                Else
                   K = K Xor &HFF
                End If
             Else
                If I = 6 Then                                   'white for 6 row
                   K = 0
                End If
             End If

             Lcd_cache(lcdcacheidx) = K
             Incr Lcdcacheidx
             Incr J
          Next I
       Else                                                     'high 2
          Tmpidx = Lcdcacheidx - 84                             'signs go up and can't be at 1,x
          For I = 1 To 6
             If I = 6 Then
                If Ch_inv = 1 Then
                   K = 255
                Else
                   K = 0
                End If
             Else
                K = Lookup(j , Fontlookup)
                If Ch_inv = 1 Then
                   K = K Xor &HFF
                End If
             End If
             Ba.0 = K.0
             Ba.1 = K.0
             Ba.2 = K.1
             Ba.3 = K.1
             Ba.4 = K.2
             Ba.5 = K.2
             Ba.6 = K.3
             Ba.7 = K.3

             Bb.0 = K.4
             Bb.1 = K.4
             Bb.2 = K.5
             Bb.3 = K.5
             Bb.4 = K.6
             Bb.5 = K.6
             Bb.6 = K.7
             Bb.7 = K.7

             Lcd_cache(tmpidx) = Ba                             'up of character
             Incr Tmpidx
             Lcd_cache(tmpidx) = Ba                             'double wide
             Incr Tmpidx
             Tmpidx1 = Tmpidx + 82
             Lcd_cache(tmpidx1) = Bb                            'down of character
             Incr Tmpidx1
             Lcd_cache(tmpidx1) = Bb                            'double wide
             Incr J
          Next I
          Lcdcacheidx = Lcdcacheidx + 12                        '6+6
      End If
      Kon_lcdchr:
    End Sub
    '-------------------- Lcdstr----------------------------------------
    Sub Lcdstr(lcdstring As String , Lcdfontsize As Byte , Ch_inv As Byte)
       Local M As Byte
       Local N As String * 1
       For M = 1 To Len(lcdstring)
          N = Mid(lcdstring , M , 1)
          Ch = Asc(n)
          Call Lcdchr(ch , Lcdfontsize , Ch_inv )
       Next M
    End Sub
    '------------------- Lcdpixel --------------------------------------
    Sub Lcdpixel(x As Byte , Y As Byte , Pixelmode As Byte )
       Local Index As Word
       Local Offset As Byte
       Local I As Byte
       If X > 84 Then Goto End_lcdpixel
       If Y > 48 Then Goto End_lcdpixel
       Y = Y - 1
       Index = Y / 8
       Index = Index * 84
       Index = Index + X
       Offset = Y / 8
       Offset = Offset * 8
       Offset = Y - Offset
       Lcd_data = Lcd_cache(index)
       I = 1
       Shift I , Left , Offset
       Select Case Pixelmode
       Case 0:                                                  'pixel off
          I = I Xor &HFF
          Lcd_data = Lcd_data And I
       Case 1:                                                  'pixel on
          Lcd_data = Lcd_data Or I
       Case 2:                                                  'pixel xor
          Lcd_data = Lcd_data Xor I
       End Select
       Lcd_cache(index) = Lcd_data
    End_lcdpixel:
    End Sub
    '----------------------- Lcdline ------------------------------------
    Sub Lcdline(x1 As Byte , Y1 As Byte , X2 As Byte , Y2 As Byte , Pixelmode As Byte )
       Local Dx As Integer
       Local Dy As Integer
       Local Stepx As Integer
       Local Stepy As Integer
       Local Fraction As Integer
       Local I As Byte

       Dy = Y2 - Y1
       Dx = X2 - X1

       If Dy < 0 Then
          Dy = -dy
          Stepy = -1
       Else
          Stepy = 1
       End If
       If Dx < 0 Then
          Dx = -dx
          Stepx = -1
       Else
          Stepx = 1
       End If
       Shift Dx , Left , 1                                      '-2
       Shift Dy , Left , 1                                      '-2
       Call Lcdpixel(x1 , Y1 , Pixelmode)

       If Dx > Dy Then
          I = Dx
          Shift I , Right , 1                                   '/2
          Fraction = Dy - I
          While X1 <> X2
             If Fraction >= 0 Then
                Y1 = Y1 + Stepy
                Fraction = Fraction - Dx
             End If
             X1 = X1 + Stepx
             Fraction = Fraction + Dy
             Call Lcdpixel(x1 , Y1 , Pixelmode)
          Wend
       Else
          I = Dy
          Shift I , Right , 1                                   '/2
          Fraction = Dx - I
          While Y1 <> Y2
             If Fraction >= 0 Then
                X1 = X1 + Stepx
                Fraction = Fraction - Dy
             End If
             Y1 = Y1 + Stepy
             Fraction = Fraction + Dx
             Call Lcdpixel(x1 , Y1 , Pixelmode)
          Wend
       End If
    Updatelcd = 1
    End Sub

    '  ----------------------- LCDrectangle -----------------------

    Sub Lcdrectangle(x3 As Byte , Y3 As Byte , Wide As Byte , Height As Byte)
        Wide = X3 + Wide
        Decr Wide
        Height = Y3 + Height
        Decr Height
        Call Lcdline(x3 , Y3 , Wide , Y3 , 1 )
        Call Lcdline(x3 , Height , Wide , Height , 1 )
        Call Lcdline(x3 , Y3 , X3 , Height , 1 )
        Call Lcdline(wide , Y3 , Wide , Height , 1 )
    End Sub

     '--------------------- Show ----------------------
     'XX 1 to (84-_width), YY 1 to 6 (n*8)
     'must be RESTORE "data to show" before CALL it subrotine
    Sub Show(xx As Byte , Yy As Byte)
       Local Swidth As Byte
       Local Shigh As Byte
       Local Cacheidx As Word
       Local I As Byte
       Local J As Byte
       Local K As Byte
       Local L As Byte
       Read Swidth
       Read Shigh
       K = Yy + Shigh
       K = K - 1
       L = Xx + Swidth
       L = L - 1
       If K > 6 Then Goto End_show
       If L > 84 Then Goto End_show

       For I = Yy To K
       Cacheidx = I - 1
          Cacheidx = Cacheidx * 84
          Cacheidx = Cacheidx + Xx
          For J = Xx To L
             Read Ch
             Lcd_cache(cacheidx) = Ch
             Incr Cacheidx
          Next J
       Next I
       Updatelcd = 1
       End_show:
    End Sub

    '--------------------- ClearShow ----------------------
    'XX 1 to (84-_width), YY 1 to 6 (n*8)
    'must be RESTORE "data to show" before CALL it subrotine
    Sub Clearshow(xx As Byte , Yy As Byte)
       Local Swidth As Byte
       Local Shigh As Byte
       Local Cacheidx As Word
       Local I As Byte
       Local J As Byte
       Local K As Byte
       Local L As Byte
       Read Swidth
       Read Shigh
       K = Yy + Shigh
       K = K - 1
       L = Xx + Swidth
       L = L - 1
       For I = Yy To K
       Cacheidx = I - 1
          Cacheidx = Cacheidx * 84
          Cacheidx = Cacheidx + Xx
          For J = Xx To L
             Lcd_cache(cacheidx) = 0
             Incr Cacheidx
          Next J
       Next I
       Updatelcd = 1
    End Sub


    End                                                         'end program                                                                             'end program


    '                              Character generator

    '     This table defines the standard ASCII characters in a 5x7 dot format.
    '------------------------------------------------------------------------------/
    $data
    Fontlookup:
    Data &H00 , &H00 , &H00 , &H00 , &H00 ,                     ' sp
    Data &H00 , &H00 , &H2F , &H00 , &H00 ,                     ' !
    Data &H00 , &H07 , &H00 , &H07 , &H00 , ' "
    Data &H14 , &H7F , &H14 , &H7F , &H14 ,                     ' #
    Data &H24 , &H2A , &H7F , &H2A , &H12 ,                     ' $
    Data &HC4 , &HC8 , &H10 , &H26 , &H46 ,                     ' %
    Data &H36 , &H49 , &H55 , &H22 , &H50 ,                     ' &
    Data &H00 , &H05 , &H03 , &H00 , &H00 ,                     ' '
    Data &H00 , &H1C , &H22 , &H41 , &H00 ,                     ' (
    Data &H00 , &H41 , &H22 , &H1C , &H00 ,                     ' )
    Data &H14 , &H08 , &H3E , &H08 , &H14 ,                     ' -
    Data &H08 , &H08 , &H3E , &H08 , &H08 ,                     ' +
    Data &H00 , &H00 , &H50 , &H30 , &H00 ,                     ' ,
    Data &H10 , &H10 , &H10 , &H10 , &H10 ,                     ' -
    Data &H00 , &H60 , &H60 , &H00 , &H00 ,                     ' .
    Data &H20 , &H10 , &H08 , &H04 , &H02 ,                     ' /
    Data &H3E , &H51 , &H49 , &H45 , &H3E ,                     ' 0
    Data &H00 , &H42 , &H7F , &H40 , &H00 ,                     ' 1
    Data &H42 , &H61 , &H51 , &H49 , &H46 ,                     ' 2
    Data &H21 , &H41 , &H45 , &H4B , &H31 ,                     ' 3
    Data &H18 , &H14 , &H12 , &H7F , &H10 ,                     ' 4
    Data &H27 , &H45 , &H45 , &H45 , &H39 ,                     ' 5
    Data &H3C , &H4A , &H49 , &H49 , &H30 ,                     ' 6
    Data &H01 , &H71 , &H09 , &H05 , &H03 ,                     ' 7
    Data &H36 , &H49 , &H49 , &H49 , &H36 ,                     ' 8
    Data &H06 , &H49 , &H49 , &H29 , &H1E ,                     ' 9
    Data &H00 , &H36 , &H36 , &H00 , &H00 ,                     ' :
    Data &H00 , &H56 , &H36 , &H00 , &H00 ,                     ' ;
    Data &H08 , &H14 , &H22 , &H41 , &H00 ,                     ' <
    Data &H14 , &H14 , &H14 , &H14 , &H14 ,                     ' =
    Data &H00 , &H41 , &H22 , &H14 , &H08 ,                     ' >
    Data &H02 , &H01 , &H51 , &H09 , &H06 ,                     ' ?
    Data &H32 , &H49 , &H59 , &H51 , &H3E ,                     ' @
    Data &H7E , &H11 , &H11 , &H11 , &H7E ,                     ' A
    Data &H7F , &H49 , &H49 , &H49 , &H36 ,                     ' B
    Data &H3E , &H41 , &H41 , &H41 , &H22 ,                     ' C
    Data &H7F , &H41 , &H41 , &H22 , &H1C ,                     ' D
    Data &H7F , &H49 , &H49 , &H49 , &H41 ,                     ' E
    Data &H7F , &H09 , &H09 , &H09 , &H01 ,                     ' F
    Data &H3E , &H41 , &H49 , &H49 , &H7A ,                     ' G
    Data &H7F , &H08 , &H08 , &H08 , &H7F ,                     ' H
    Data &H00 , &H41 , &H7F , &H41 , &H00 ,                     ' I
    Data &H20 , &H40 , &H41 , &H3F , &H01 ,                     ' J
    Data &H7F , &H08 , &H14 , &H22 , &H41 ,                     ' K
    Data &H7F , &H40 , &H40 , &H40 , &H40 ,                     ' L
    Data &H7F , &H02 , &H0C , &H02 , &H7F ,                     ' M
    Data &H7F , &H04 , &H08 , &H10 , &H7F ,                     ' N
    Data &H3E , &H41 , &H41 , &H41 , &H3E ,                     ' O
    Data &H7F , &H09 , &H09 , &H09 , &H06 ,                     ' P
    Data &H3E , &H41 , &H51 , &H21 , &H5E ,                     ' Q
    Data &H7F , &H09 , &H19 , &H29 , &H46 ,                     ' R
    Data &H46 , &H49 , &H49 , &H49 , &H31 ,                     ' S
    Data &H01 , &H01 , &H7F , &H01 , &H01 ,                     ' T
    Data &H3F , &H40 , &H40 , &H40 , &H3F ,                     ' U
    Data &H1F , &H20 , &H40 , &H20 , &H1F ,                     ' V
    Data &H3F , &H40 , &H38 , &H40 , &H3F ,                     ' W
    Data &H63 , &H14 , &H08 , &H14 , &H63 ,                     ' X
    Data &H07 , &H08 , &H70 , &H08 , &H07 ,                     ' Y
    Data &H61 , &H51 , &H49 , &H45 , &H43 ,                     ' Z
    Data &H00 , &H7F , &H41 , &H41 , &H00 ,                     ' [
    Data &H55 , &H2A , &H55 , &H2A , &H55 ,                     ' 55
    Data &H00 , &H41 , &H41 , &H7F , &H00 ,                     ' ]
    Data &H04 , &H02 , &H01 , &H02 , &H04 ,                     ' ^
    Data &H40 , &H40 , &H40 , &H40 , &H40 ,                     ' _
    Data &H00 , &H01 , &H02 , &H04 , &H00 ,                     ' '
    Data &H20 , &H54 , &H54 , &H54 , &H78 ,                     ' a
    Data &H7F , &H48 , &H44 , &H44 , &H38 ,                     ' b
    Data &H38 , &H44 , &H44 , &H44 , &H20 ,                     ' c
    Data &H38 , &H44 , &H44 , &H48 , &H7F ,                     ' d
    Data &H38 , &H54 , &H54 , &H54 , &H18 ,                     ' e
    Data &H08 , &H7E , &H09 , &H01 , &H02 ,                     ' f
    Data &H0C , &H52 , &H52 , &H52 , &H3E ,                     ' g
    Data &H7F , &H08 , &H04 , &H04 , &H78 ,                     ' h
    Data &H00 , &H44 , &H7D , &H40 , &H00 ,                     ' i
    Data &H20 , &H40 , &H44 , &H3D , &H00 ,                     ' j
    Data &H7F , &H10 , &H28 , &H44 , &H00 ,                     ' k
    Data &H00 , &H41 , &H7F , &H40 , &H00 ,                     ' l
    Data &H7C , &H04 , &H18 , &H04 , &H78 ,                     ' m
    Data &H7C , &H08 , &H04 , &H04 , &H78 ,                     ' n
    Data &H38 , &H44 , &H44 , &H44 , &H38 ,                     ' o
    Data &H7C , &H14 , &H14 , &H14 , &H08 ,                     ' p
    Data &H08 , &H14 , &H14 , &H18 , &H7C ,                     ' q
    Data &H7C , &H08 , &H04 , &H04 , &H08 ,                     ' r
    Data &H48 , &H54 , &H54 , &H54 , &H20 ,                     ' s
    Data &H04 , &H3F , &H44 , &H40 , &H20 ,                     ' t
    Data &H3C , &H40 , &H40 , &H20 , &H7C ,                     ' u
    Data &H1C , &H20 , &H40 , &H20 , &H1C ,                     ' v
    Data &H3C , &H40 , &H30 , &H40 , &H3C ,                     ' w
    Data &H44 , &H28 , &H10 , &H28 , &H44 ,                     ' x
    Data &H0C , &H50 , &H50 , &H50 , &H3C ,                     ' y
    Data &H44 , &H64 , &H54 , &H4C , &H44



    Egypt:
    Data 84 , 3,                                                ' Image Table Name, Xbytes, N of Lines, 254 bytes
    Data &HFF , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01,
    Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H81 , &H81 , &H81 , &H41 , &H41 , &H21,
    Data &H21 , &H31 , &H11 , &H11 , &H11 , &H11 , &H11 , &H31 , &H21 , &HA1 , &H41 , &HC1 , &H81 , &H81 , &H01 , &H01,
    Data &H01 , &H01 , &H01 , &H81 , &HC1 , &HE1 , &HF1 , &HF9 , &HFF , &HF3 , &H8D , &H11 , &H31 , &H41 , &H81 , &H81,
    Data &HE1 , &HF1 , &HF9 , &HFD , &HFF , &HFF , &HFD , &H09 , &H11 , &H21 , &H41 , &H81 , &H01 , &H01 , &H01 , &H01,
    Data &H01 , &H01 , &H01 , &HFF , &HFF , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40,
    Data &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H60 , &H60 , &H3C , &H04 , &H06 , &H03 , &H01 , &H00,
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H80 , &HE0 , &HE0 , &HF8 , &HFC , &HFE , &HFF , &HFF , &H82 , &H04,
    Data &H08 , &H30 , &HE1 , &HE3 , &HF4 , &HFC , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HF0,
    Data &HFC , &HFC , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HE0 , &H00 , &H00 , &H00,
    Data &H01 , &H02 , &H04 , &H08 , &H10 , &H20 , &HC0 , &HFF , &HFF , &HFE , &HDE , &HFE , &HFE , &HFF , &HFE , &HFF,
    Data &HFE , &HFF , &HEF , &HEF , &HDF , &HDF , &HFF , &HEF , &HFF , &HEF , &HEF , &HEF , &HEF , &H9E , &HDE , &HDE,
    Data &HDE , &HDE , &HCE , &HCE , &HCE , &HEE , &HEE , &HCE , &H8E , &HCF , &HCF , &HCF , &HDF , &HEF , &HCF , &HEF,
    Data &HCF , &HEF , &HDF , &HFC , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF,
    Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF,
    Data &HFF , &HFE , &HFC , &HFC , &HF8 , &HFC , &HFC , &HFF , &HFF , &HFF , &HFC , &HFF

    1
  • #4 07 Sie 2010 18:10
    Ziele6
    Poziom 14  

    Odkopię trochę temat bo sam walczę z ekranem od nokii i mam problem. W większości przypadków podawany jest powyższy kod do obsługi lcd ale u mnie on nie działa i nie mam zielonego pojęcia dlaczego. Jedyne co zmieniłem to pin DC na Portb.3, kwarc na 8Mhz oraz procesor na atmega32. Na ekranie nic się nie pojawia. Ekran jest na pewno sprawny ponieważ poniższy kod działa ok. Nie ma tylko użytego sprzętowego SPI i wyświetla jedynie obrazek.

    Code:

    $regfile "m32def.dat"
    $crystal = 8000000


    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.5 = Output
    Config Pinb.7 = Output

    Lcd_dc Alias Portb.3                                        'low = command mode, high = data
    Lcd_sce Alias Portb.2                                       'low = enable LCD SPI, high = SPI disable
    Lcd_rst Alias Portb.1                                       'low = reset
    Lcd_out Alias Portb.5
    Lcd_clk Alias Portb.7

    Dim R As Byte , Dana As Byte , Dcbit As Bit , Rint As Integer
    Dim Licznik As Integer
    Dim A As Byte
    Dim X As Byte
    Dim Y As Byte

    'Dim R1 As Byte
    'DCbit - bit modeselct



    'Zasilanie PCDka=3.2V (green LED+1n4148 zasilane 5Voltami przez 500ohm +100uF filtr)
    'Voltage converter przez 470nF do masy
    'Nie zapomnij o rezystorach podciagajacych do plusa porty p.0 i p.1 !

    'P3.7 = 0                                                    'umnie ten port podawal mase na lcd
    Waitms 20                                                   'bez tego opoznienia LCD u mnie niechcialo wystartowac


    'resetowanie 'w nocie jest napisane, ze max 100ms po podaniu zasialania na uklad ta procedura musi wystapic, ze zly reset uszkodzic moze sterownik
    'ale nieuwalilem jeszcze wyswietlacza bawiac sie na rozne sposoby, wiec informacje te dotycza raczej ogolnie sterownikow PCD8544

    'Noto RESET

    Gosub Init_lcd


    'Teraz sprubujemy wyczyscic LCD z "smieci"
    'kasowanie calego ekranu
    Dcbit = 0                                                   'bedzie slana komenda

    'ustaw flage x na 0
    Dana = 0
    'Dana = &B10000000
    'siedem mlodszych bitow tego bajtu wyznacza ten rejestr
    Dana.7 = 1                                                  'x
    Gosub Send

    'ustaw flage y na 0
    Dana = 0
    'Dana = &B10000000
    '3 najmlodsze bity tego bajtu wyznaczaja ten rejestr  (patrz nota katalogowa !)
    Dana.7 = 0
    Dana.6 = 1                                                  'y
    Gosub Send


     Gosub Cls_lcd


    'Na koniec sprobujemy wyswietlic literki zdefiniowane we wbudowanym chargeneratorze bascomowym
    'ustawimy adres rozpoczecia  na jakis przypadkowy np: x=15,y=2


    Dcbit = 0                                                   'chyba pamietacie
    'gdyby wczesniej bylo ustawione coinnego w rejestrze H
    Dana = &B00100000                                           ' Przywroc interpretowanie instrukcji zwyklych (nie rozszerzonych -bit.0)
    'rejestr V ustawimy na 0 = adresowanie poziome, zeby nam bylo latwiej malowac znaczki
    Dana.1 = 0                                                  'vertical adresing jesli =1
    Gosub Send


    'ilosc pixeli od lewej krawedzi ekranu
    'ustaw licznik x na 15
    Dana = 0
    'Dana = &B10000000
    'siedem mlodszych bitow tego bajtu wyznacza ten rejestr
    Dana.7 = 1                                                  'x
    Gosub Send


    'ilosc pixeli (x8) od gory ekranu
    'ustaw licznik y na 2
    Dana = 0
    'Dana = &B10000000
    '3 najmlodsze bity tego bajtu wyznaczaja ten rejestr  (patrz nota katalogowa !)
    Dana.7 = 0
    Dana.6 = 1                                                  'y
    Gosub Send



    Aa:
    Dcbit = 1


     Restore Dane1                                              'point to stored data
    For Licznik = 1 To 504                                      'for number of data items
       Read A
       Dana = A
       Gosub Send
    Next Licznik
    'Waitms 250
    'Gosub Cls_lcd
    'Waitms 250
    'Goto Aa


    End

    '*************************************************************

    Init_lcd:

    Lcd_rst = 0                                                 'RESET=L (aktywny)
    Lcd_rst = 1                                                 'reset=H
    Dcbit = 0
     Restore Init_data
      For Licznik = 1 To 5
       Read Dana
       Gosub Send
      Next Licznik
    Return

    Poz_lcd:

    Return
                                                       'jesli DCbit=0 -wysylana komenda
    '''dana.0=bit odpowiedzialny za interpretacje instrukcji rozszerzonych
    '''dana.1=Bit odpowiedzialny za tyb adresowania (V)
    '''dana.2=Bit odpowiedzialny za powerdown       (PD)



    'Dana = &B00100001                                           'wlacz rozszerzone instrukcje (patrz nota katalogowa)
    'Gosub Send


    'zmieniane trzy ponizsze parametry wyswietlania  nie przynosza widocznych efektow w moim wyswietlaczu od nokii3310
    'moze w tych wyswietlaczach sa programowane na stale w ROM?
    'Cos ktos wie niech da znac ...
    'Dana = &B00000101                                           'temperature control
    'Gosub Send
    'Dana = &B00010011                                           'bias system
    'Gosub Send
    'Dana = &B11110000                                           ' set vop
    'Gosub Send


    'Dana = &B00100000                                           ' Przywroc interpretowanie instrukcji zwyklych (nie rozszerzonych -bit.0)
    '
    'Dana.1 = 0                                                  'vertical adresing jesli =1
    'Gosub Send

    'Dana = &B00001100                                           'spowrotem do -normal operation
    'Gosub Send





    Cls_lcd:
    Dcbit = 1
    For Rint = 1 To 504
     Dana = 0
    Gosub Send
    Next Rint

    Return


    Send:
    Lcd_sce = 0                                                 'enable (SCE)
    Lcd_dc = Dcbit
    For R = 7 To 0 Step -1
     Lcd_clk = 0
     Lcd_out = Dana.r
     Lcd_clk = 1
    Next R
    Lcd_clk = 0
    Return

    Init_data:
    Data &B00100001 , &B00000101 , &B00010011 , &B11110000 , &B00001100

    Dane1:
    Rem ****** linia 1 ******
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 128 , 128 , 192 , 64 , 192 , 96 ,
    Data 64 , 96 , 96 , 96 , 96 , 224 , 96 , 224 , 224 , 224 , 240 , 240 ,
    Data 216 , 136 , 140 , 12 , 4 , 6 , 2 , 2 , 2 , 2 , 6 , 6 ,
    Data 12 , 32 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Rem ****** linia 2 ******
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 128 , 224 ,
    Data 112 , 24 , 140 , 230 , 195 , 51 , 49 , 216 , 237 , 252 , 190 , 127 ,
    Data 223 , 239 , 111 , 123 , 52 , 111 , 121 , 127 , 234 , 255 , 255 , 255 ,
    Data 255 , 255 , 255 , 255 , 255 , 254 , 252 , 248 , 240 , 224 , 128 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Rem ****** linia 3 ******
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 48 , 126 , 63 , 13 ,
    Data 134 , 195 , 241 , 120 , 190 , 110 , 215 , 189 , 211 , 252 , 255 , 227 ,
    Data 224 , 224 , 224 , 224 , 224 , 224 , 224 , 224 , 224 , 227 , 255 , 255 ,
    Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 254 ,
    Data 96 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Rem ****** linia 4 ******
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 192 , 240 , 252 , 254 ,
    Data 255 , 245 , 255 , 245 , 255 , 253 , 255 , 254 , 255 , 253 , 255 , 199 ,
    Data 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 135 , 199 , 231 ,
    Data 231 , 231 , 231 , 231 , 231 , 231 , 231 , 231 , 231 , 231 , 231 , 231 ,
    Data 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Rem ****** linia 5 ******
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 232 , 254 , 255 , 255 , 95 , 15 ,
    Data 31 , 63 , 63 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
    Data 255 , 254 , 254 , 252 , 254 , 252 , 254 , 254 , 254 , 255 , 255 , 255 ,
    Data 255 , 255 , 191 , 255 , 223 , 119 , 127 , 27 , 31 , 7 , 3 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Rem ****** linia 6 ******
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 15 , 63 , 127 , 127 , 240 , 224 ,
    Data 224 , 224 , 192 , 96 , 96 , 97 , 33 , 51 , 19 , 23 , 15 , 15 ,
    Data 7 , 15 , 7 , 15 , 7 , 15 , 7 , 7 , 7 , 7 , 3 , 3 ,
    Data 3 , 3 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,

    0
  • #5 17 Wrz 2010 17:26
    tomson5
    Poziom 16  

    Witam

    Zaciekawił mnie temat obsługi w/w wyświetlacza i na szybkiego zmontowałem coś takiego i uruchomiłem go na kodzie który tutaj przytoczył kolega @M. S.

    Zadziałał tak jak powinno i badam teraz jego możliwości przy okazji tworzenia swojego nowego projektu przy którym bardzo by mi się przydał taki LCD

    Brakuje mi tutaj jeszcze większej czcionki niż "Double"
    Nie wiem czy na podstawie tablicy która jest w tym kodzie jest to możliwe czy może trzeba istniejącą zmodyfikować. Jeżeli można to w jaki sposób to się robi ??

    0
  • #6 07 Sty 2011 10:25
    Aimeiz
    Poziom 15  

    Tomsonie5.

    Próbuję uruchomić ten kod podany przez M.S na atmega 168 z kwarcem 8MHz
    Zmieniłem zatem definicję procesora i kwarcu na:
    $regfile = "m168def.dat"
    $crystal = 8000000

    Podłączyłem wyświetlacz do portu b
    'Podłączenie wyświetlacza v. portb:
    '1 - +Vcc - +4V
    '2 - sclk - Portb.4 ??
    '3 - sda (sdin) - Portb.3 ??
    '4 - d/c - Portb.0
    '5 - sce - Portb.2
    '6 - GND - GND
    '7 - kondensator 10uF
    '8 - res - Portb.1
    Te zdefiniowane aliasy naprowadziły mnie na podłączanie trzech wyprowadzeń wyświetlacza dc, sce i rst:

    Lcd_dc Alias Portb.0 'low = command mode, high = data
    Lcd_sce Alias Portb.2 'low = enable LCD SPI, high = SPI disable
    Lcd_rst Alias Portb.1 'low = reset

    Nie mam skąd wywnioskować gdzie podłączyć sclk i sda.

    Jak podłączyłeś wyświetlacz, że ten kod Ci zadziałał?
    Wyświetlacz jest dobry bo wersja kodu podana przez Ziel6 działa przy podłączeniu:
    '1 - +Vcc - +4V
    '2 - sclk - Portb.4
    '3 - sda (sdin) - Portb.5
    '4 - d/c - Portb.3
    '5 - sce - Portb.2
    '6 - GND - GND
    '7 - kondensator 10uF
    '8 - res - Portb.1

    I zmianie definicji procesora na m168:
    $regfile "m168def.dat"
    $crystal = 8000000

    W obydwu przypadkach procesor atmega168 chodzi na kwarcu 8MHz, podłączonym do pb6 I pb7

    0
  • #7 07 Sty 2011 16:59
    tomson5
    Poziom 16  

    Mnie zadziałał orginalny Lcd Nokii, natomiast z drugim który jest podróbką niestety miałem problem. Być może to jest przyczyną u ciebie.

    Z tymi Chińskimi jest jakiś myk w programie. Trochę inny sposób inicjacji, ale mnie się na szybko nie udało tego rozwiazać.

    0
  • #8 07 Sty 2011 17:04
    Aimeiz
    Poziom 15  

    W końcu na atmega 168 prawodłowo zadziałał mi ten kod.
    W komentarzu dołożyłem podłączenia.
    Musiałem zrezygnować w pierwszym podejściu z kwarcu, bo portu PB6 i PB7 są tu wykorzystane do sterowania wyświetlaczem.
    Kupowałem wyświetlacze jakoś bardzo tanio, więc pewnie chińskie.



    Code:
    '**************** Driving graph. display NOKIA LPH7779 ver.1.1 ******************
    
    '* U must unmark correct "stack declaration" section, depending on processor    *
    '* used.  ATMega - tested OK, 85x5 - not tested.                                *
    '******************************* (Tiny LCD) *************************************

    $regfile = "m168def.dat"
    $crystal = 7372800
    $baud = 9600
    $swstack = 200
    $hwstack = 100
    'atmega 168 Z WEWNĘTZRNYM OSCYLATOREK 8MHz
    'Podłączenie wyświetlacza:
    'atmega pin     LPH7779
    '+ Vcc 4.2v     1 (Vcc 2.8 - 5V)
    'PB1            2 (SCLK)
    'PB2            3 (SDIN)
    'PB5            4 (D/C)
    'PB6            5 (SCE)
    'GND            6 (GND)
    'PB7            8 (RESET)
    'Klawiaturka
    'PD0/INT0       Sw1
    'PD1/INT1       Sw2
    'PD2/INT2       Sw3
    'PD3/INT3       Sw4

    Config Portd = Input                                        'keys
    'Config Portb = Output                                       'communication port to LCD
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Spi = Soft , Din = Portb.3 , Dout = Portb.2 , Ss = None , Clock = Portb.1
    'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
    Config 1wire = Portb.0                                      'DS1820 on pin 12 (pull up)

    '************************** Global vars declarations ****************************
    Dim Txloc As Byte , Tyloc As Byte , Yy As Byte , Xx As Byte , Tout As Byte
    Dim Menu_ptr As Byte , Crc_ptr As Byte , Tsens As Byte , Err_ptr As Byte , Key_pressed As Byte
    '************************** 1Wire vars ******************************************
    Dim Bd(9) As Byte
    'Sc(1)                           'Temperature LSB
    'Sc(2)                           'Temperature MSB
    'Sc(3)                           'TH/user byte 1         also SRAM
    'Sc(4)                           'TL/user byte 2         also SRAM
    'Sc(5)                           'config                 also SRAM    x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
    'Sc(6)                           'res
    'Sc(7)                           'res
    'Sc(8)                           'res
    'Sc(9)                           '8 CRC
    Dim I As Byte , Tmp As Byte , T As Integer , Crc As Byte
    Dim T1 As Integer , V As Byte , A As Byte , Tx1 As String * 14 , Tx2 As String * 14
    Dim Tleft As String * 4 , Tright As String * 1
    Dim T1min As Integer , T1act As Integer , T1max As Integer
    Dim T2min As Integer , T2act As Integer , T2max As Integer
    Dim Dsid1(8) As Byte                                        'Dallas ID 64 bits incl CRC
    Dim Dsid2(8) As Byte
    'When used like this : DsId(1) = 1wread(8)
    'DsId(1) = family code           'Ds1820 10h, DS18B20 28h, Ds18s20 10h
    'DsId(2)                         '48 Bits Serial, LSB
    'DsId(3)
    'DsId(4)
    'DsId(5)
    'DsId(6)
    'DsId(7)                         '48 Bits Serial, MSB
    'DsId(8)                         '8 CRC

    '*********************************** Aliases ************************************
    Lcd_cmd Alias Portb.5                                       'Low for cmd mode
    Lcd_cs Alias Portb.6
    Lcd_res Alias Portb.7                                       'Low for reset

    '*************************** LCD commands constants *****************************
    Const Extcmd = &H21                                         'extended command mode
    Const Contrmid = &HC8                                       'LCD contract medium level(after Extcmd)
    Const Tempcomp2 = &H06                                      'temperature compensation (after Extcmd)
    Const Bias48 = &H13                                         'bias 1:48 for LCD (after Extcmd)
    Const Normcmd = &H20                                        'normal command mode
    Const Lcdinv = &H0D                                         'inverted LCD screen(after Normcmd)
    Const Lcdnorm = &H0C                                        'normal LCD screen(after Normcmd)
    Const Lcdxaddr0 = &H80                                      'set X addr of RAM to 0(after Normcmd)
    Const Lcdpdown = &H24                                       'LCD in power down mode
    Const Lcdact = &H20                                         'LCD in active mode

    '************************* Subprograms declarations *****************************
    Declare Sub Tcmd(byval Tlcdcmd As Byte)
    Declare Sub Tlcdinit
    Declare Sub Tcls
    Declare Sub Tgphloc(txglc As Byte , Tyglc As Byte)
    Declare Sub Tlocate(byval Txlc As Byte , Byval Tylc As Byte)
    Declare Sub Tprintf(byval Tstring As String , Byval Chr_inv As Byte)
    Declare Sub Tshowpic
    '************************* 1Wire declarations ***********************************
    Declare Sub Tprinttp(byval T0 As Integer , Byval Xlc As Byte , Byval Ylc As Byte)
    Declare Sub Read1820
    Declare Sub Crcit
    Declare Sub Temperature
    Declare Sub Errorchk

    '********************************************************************************
    '****************************** MAIN loop **********************************START
    Spiinit
    Tlcdinit
    Tcmd Lcdact                                                 'activate LCD
    Portd = &B00001111                                          'LSB(keys) bits pullup
    Menu_ptr = 1
    Gosub Menu
    Main_loop:
    Gosub Kbd_scan
    If Key_pressed = 0 Then Goto Main_loop
    Gosub Kbd_decode
    Gosub Menu
    Goto Main_loop

    End

    '******************************* MENU SUB **********************************START
    Menu:
    Tcls
    Tlocate 0 , 0
    Tprintf "    M E N U   " , 0
    Tlocate 0 , 2
    Tprintf " 1 EGYPT DEMO " , 0
    Tlocate 0 , 3
    Tprintf " 2 ASCII DEMO " , 0
    Tlocate 0 , 4
    Tprintf " 3 1WIRE TEST " , 0
    Tlocate 0 , 5
    Tprintf " 4 LCD   OFF  " , 0
    If Menu_ptr = 1 Then
      Tlocate 0 , 2
      Tprintf " 1 EGYPT DEMO " , 1
      Goto Menu_exit
    End If
    If Menu_ptr = 2 Then
      Tlocate 0 , 3
      Tprintf " 2 ASCII DEMO " , 1
      Goto Menu_exit
    End If
    If Menu_ptr = 3 Then
      Tlocate 0 , 4
      Tprintf " 3 1WIRE TEST " , 1
      Goto Menu_exit
    End If
    If Menu_ptr = 4 Then
      Tlocate 0 , 5
      Tprintf " 4 LCD   OFF  " , 1
    End If
    Menu_exit:
    Return

    '***************************** Keyboard SUB ********************************START
    Kbd_decode:
    Select Case Tout
      Case &H0E : Decr Menu_ptr
      Case &H0D : Incr Menu_ptr
      Case &H0B : Gosub Execute
      Case &H07 : Nop
    End Select
    If Menu_ptr = 0 Then
      Menu_ptr = 4
    End If
    If Menu_ptr = 5 Then
      Menu_ptr = 1
    End If
    Return

    Kbd_scan:
    Key_pressed = 0
    Tout = Pind And &H0F
    If Tout = &H0F Then
      Return
    End If
    Waitms 50                                                   'wait 50 mS and check
    Tout = Pind And &H0F                                        'if key is really pressed
    If Tout = &H0F Then
      Return
    End If
    Key_pressed = 1
    Return

    '****************************** Execute Demos SUB **************************START
    Execute:
    Select Case Menu_ptr
      Case &H01 : Gosub 1
      Case &H02 : Gosub 2
      Case &H03 : Gosub 3
      Case &H04 : Gosub 4
    End Select
    Return

    '******************************** Demos SUBS *******************************START
    '*********************************** 1 ******************************************
    1:
    Tcls
    Tlocate 0 , 0
    Tprintf "  EGYPT DEMO" , 0
    Tlocate 0 , 2
    Restore Egypt
    Tshowpic
    Wait 10
    Return

    '*********************************** 2 ******************************************
    2:
    Tcls
    Tlocate 0 , 0
    Tprintf " abcdefghijklmnopqrstuvwxyz" , 0
    Wait 1

    Tlocate 0 , 2
    Tprintf "ABCDEFGHIJKLMNPQRSTUVWXYZ" , 1
    Wait 1

    Tlocate 0 , 4
    Tprintf "0123456789ąćęłńóśźżŁŚŹŻ}[-,^" , 0
    Wait 5

    Tcmd Lcdinv
    Wait 5
    Tcmd Lcdnorm
    Wait 1
    Return

    '*********************************** 3 ******************************************
    3:
    Call Tcls
    Call Tlocate(0 , 1)
    Call Tprintf( "     ilość    " , 0)
    Call Tprintf( "   sensorów:  " , 0)
    Sens0:
    Tsens = 1wirecount()
    Tx1 = Str(tsens)
    Call Tlocate(7 , 3)
    Call Tprintf(tx1 , 0)
    Wait 2
    If Tsens = 0 Then
     Goto Sens0
    End If

    Call Tcls
    Dsid1(1) = 1wsearchfirst()
    If Tsens > 1 Then
      Dsid2(1) = 1wsearchnext()
    End If
    Call Temperature
    Gosub Temp_min_max_res
    Gosub Tprint_min_max

    Do
    Call Temperature
    Call Errorchk
    Call Tprinttp(t1act , 5 , 2)
    If Tsens > 1 Then
     Call Tprinttp(t2act , 5 , 3)
    End If

    Gosub Kbd_scan
    If Key_pressed = 1 Then
      Goto Exit_3
    End If

    Loop

    Wait 1
    Exit_3:
    Call Tcls
    Call Tlocate(0 , 2)
    Call Tprintf( "powrót do menu" , 0)
    Wait 1
    Return

    Tprint_min_max:
    Call Tprinttp(t1max , 8 , 0)
    Call Tprinttp(t1min , 0 , 0)
    Call Tprinttp(t2max , 8 , 5)
    Call Tprinttp(t2min , 0 , 5)
    Return

    Temp_min_max_res:
    T1min = T1act
    T1max = T1act
    T2min = T2act
    T2max = T2act
    Return


    '*********************************** 4 ******************************************
    4:
    Tcls
    Tlocate 1 , 2
    Tprintf "Powerdown in" , 0
    Tlocate 7 , 3
    Tprintf "3" , 0
    Wait 1
    Tlocate 7 , 3
    Tprintf "2" , 0
    Wait 1
    Tlocate 7 , 3
    Tprintf "1" , 0
    Wait 1
    Tcmd Lcdpdown
    Wait 5

    Tcls
    Tlocate 3 , 1
    Restore Been
    Tshowpic

    Tcmd Lcdact
    Wait 10
    Return
    '*****************************************************************************END

    '******************************** LCD subroutines *******************************
    '********************************* Tcmd(Tlcdcmd) ***************************START
    Sub Tcmd(byval Tlcdcmd As Byte)
    Reset Lcd_cmd                                               'command mode
    Reset Lcd_cs
    Spiout Tlcdcmd , 1
    Set Lcd_cs
    Set Lcd_cmd                                                 'data mode
    End Sub

    '********************************** Tlcdinit *******************************START
    Sub Tlcdinit
    Reset Lcd_res                                               'RESET LCD display
    Set Lcd_res
    Tcmd Lcdpdown                                               '
    Tcmd Extcmd                                                 'look into
    Tcmd Contrmid                                               '"LCD commands constants"
    Tcmd Tempcomp2                                              'section
    Tcmd Bias48                                                 '
    Tcmd Normcmd                                                '
    Tcmd Lcdnorm                                                '
    Tcls                                                        '
    End Sub

    '************************************ Tcls *********************************START
    Sub Tcls
    Local Tword As Word
    Tcmd Normcmd
    Tcmd Lcdnorm
    Tcmd Lcdxaddr0
    Tout = 0
    For Tword = 0 To 503                                        '84x6 times sends 0 to clear LCD
      Reset Lcd_cs : Spiout Tout , 1 : Set Lcd_cs
    Next
    End Sub

    '***************************** Tgphloc(Txglc , Tyglc) **********************START
    Sub Tgphloc(txglc As Byte , Tyglc As Byte)
    Reset Lcd_cmd                                               'command mode
    Tout = Tyglc + &H40                                         'sets 0-5 Y-addr of RAM
    Reset Lcd_cs
    Spiout Tout , 1
    Set Lcd_cs
    Tout = Txglc * &H06                                         'sets 0-13 X-addr of RAM
    Tout = Tout + &H80
    Reset Lcd_cs
    Spiout Tout , 1
    Set Lcd_cmd                                                 'data mode
    End Sub

    '***************************** Tlocate(Txloc, Tyloc) ***********************START
    Sub Tlocate(byval Txlc As Byte , Byval Tylc As Byte)
    Txloc = Txlc
    Tyloc = Tylc
    Tgphloc Txloc , Tyloc
    End Sub

    '********************************* Tprintf(Tstring) ************************START
    Sub Tprintf(byval Tstring As String , Byval Chr_inv As Byte)
    Local Tsub As Word , Tword As Word , Tchr As String * 1
    For Xx = 1 To Len(tstring)
     Tchr = Mid(tstring , Xx , 1)
     Select Case Tchr
      Case " " : Tsub = 0
      Case "a" : Tsub = 1
      Case "b" : Tsub = 2
      Case "c" : Tsub = 3
      Case "d" : Tsub = 4
      Case "e" : Tsub = 5
      Case "f" : Tsub = 6
      Case "g" : Tsub = 7
      Case "h" : Tsub = 8
      Case "i" : Tsub = 9
      Case "j" : Tsub = 10
      Case "k" : Tsub = 11
      Case "l" : Tsub = 12
      Case "m" : Tsub = 13
      Case "n" : Tsub = 14
      Case "o" : Tsub = 15
      Case "p" : Tsub = 16
      Case "q" : Tsub = 17
      Case "r" : Tsub = 18
      Case "s" : Tsub = 19
      Case "t" : Tsub = 20
      Case "u" : Tsub = 21
      Case "v" : Tsub = 22
      Case "w" : Tsub = 23
      Case "x" : Tsub = 24
      Case "y" : Tsub = 25
      Case "z" : Tsub = 26
      Case "A" : Tsub = 27
      Case "B" : Tsub = 28
      Case "C" : Tsub = 29
      Case "D" : Tsub = 30
      Case "E" : Tsub = 31
      Case "F" : Tsub = 32
      Case "G" : Tsub = 33
      Case "H" : Tsub = 34
      Case "I" : Tsub = 35
      Case "J" : Tsub = 36
      Case "K" : Tsub = 37
      Case "L" : Tsub = 38
      Case "M" : Tsub = 39
      Case "N" : Tsub = 40
      Case "O" : Tsub = 41
      Case "P" : Tsub = 42
      Case "Q" : Tsub = 43
      Case "R" : Tsub = 44
      Case "S" : Tsub = 45
      Case "T" : Tsub = 46
      Case "U" : Tsub = 47
      Case "V" : Tsub = 48
      Case "W" : Tsub = 49
      Case "X" : Tsub = 50
      Case "Y" : Tsub = 51
      Case "Z" : Tsub = 52
      Case "0" : Tsub = 53
      Case "1" : Tsub = 54
      Case "2" : Tsub = 55
      Case "3" : Tsub = 56
      Case "4" : Tsub = 57
      Case "5" : Tsub = 58
      Case "6" : Tsub = 59
      Case "7" : Tsub = 60
      Case "8" : Tsub = 61
      Case "9" : Tsub = 62
      Case "ą" : Tsub = 63
      Case "ć" : Tsub = 64
      Case "ę" : Tsub = 65
      Case "ł" : Tsub = 66
      Case "ń" : Tsub = 67
      Case "ó" : Tsub = 68
      Case "ś" : Tsub = 69
      Case "ź" : Tsub = 70
      Case "ż" : Tsub = 71
      Case "Ł" : Tsub = 72
      Case "Ś" : Tsub = 73
      Case "Ź" : Tsub = 74
      Case "Ż" : Tsub = 75
      Case "}" : Tsub = 76
      Case "[" : Tsub = 77
      Case "-" : Tsub = 78
      Case "," : Tsub = 79
      Case "^" : Tsub = 80
      Case Else : Goto Exit_case
     End Select
     Restore Ascii
     Set Lcd_cmd                                                'turn off command mode
     Tsub = Tsub * 6
     If Tsub <> 0 Then
      For Tword = 1 To Tsub                                     'shift to character pointer
      Read Tout                                                 'Tsub times
      Next
     End If
      For Yy = 1 To 6                                           'printing character loop
      Read Tout
      If Chr_inv = 1 Then
       Tout = Tout Xor &HFF                                     'invert Tout
      End If
      Reset Lcd_cs
      Spiout Tout , 1                                           '6x8 bits
      Set Lcd_cs
      Next
    Exit_case:
    Next
    End Sub

    '************************************ Tshowpic *****************************START
    Sub Tshowpic
    Local Twidth As Byte , Thigh As Byte
    Read Twidth
    Read Thigh
    For Yy = 1 To Thigh
     For Xx = 1 To Twidth
      Read Tout : Reset Lcd_cs : Spiout Tout , 1 : Set Lcd_cs
     Next
     Incr Tyloc
     Tgphloc Txloc , Tyloc
    Next
    End Sub


    '************************************* 1 Wire subs *************************START
    '************************************* Temperature *************************START
    Sub Temperature
    1wreset : 1wwrite &HCC : 1wwrite &H44                       'start measure
    Waitms 500                                                  'wait for end of conversion


    1wverify Dsid1(1)                                           'address First Sensor ""
    Call Read1820                                               'read 9 bytes
    If Crc = 0 Then                                             'sensor present, check CRC
     T1act = T
     If T > T1max Then
      T1max = T
     End If
     If T < T1min Then
      T1min = T
     End If                                                     'CRC OK, print T*10 on LCD
     Else
      Crc_ptr = 1                                               'CRC NOT OK
    End If

    If Tsens > 1 Then
     1wverify Dsid2(1)                                          'address second sensor
     Call Read1820                                              'read 9 bytes
     If Crc = 0 Then                                            'sensor present, check CRC
      T2act = T                                                 'CRC OK, print T*10 on LCD
      If T > T2max Then
       T2max = T
      End If
     If T < T2min Then
       T2min = T
     End If
     Else
      Crc_ptr = 1                                               'CRC NOT OK
     End If
    End If
    End Sub
    '************************************* Read1820 ****************************START
    Sub Read1820                                                ' reads sensor and calculate
                                                                ' T for 0.1 C

    1wwrite &HBE                                                ' read 9 data
    Bd(1) = 1wread(9)
    1wreset
                                                         ' read bytes in array
    Call Crcit                                                  ' ckeck CRC
    If Crc = 0 Then                                             ' if is OK, calculate for
    Tmp = Bd(1) And 1                                           ' 0.1C precision
    If Tmp = 1 Then Decr Bd(1)
    T = Makeint(bd(1) , Bd(2))
    T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
    T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
    End If

    End Sub
    '************************************* Crcit *******************************START
    Sub Crcit                                                   ' calculate 8 bit CRC
                                                                 ' bigger but faster
    Crc = 0                                                     ' needs a 256 elements table
    For I = 1 To 9
    Tmp = Crc Xor Bd(i)
    Crc = Lookup(tmp , Crc8)
    Next
    End Sub
    '************************************* Tprinttp ****************************START
    Sub Tprinttp(byval T0 As Integer , Byval Xlc As Byte , Byval Ylc As Byte)

    Tx1 = Str(t0)
    V = Len(tx1)
     Select Case V
      Case 4 : Tleft = Left(tx1 , 3)
      Case 3 : Tleft = Left(tx1 , 2)
      Case 2 : Tleft = Left(tx1 , 1)
      Case 1 : Tleft = "0"
      Case Else : Goto Exit_ttp
      End Select
    Tright = Right(tx1 , 1)
    If Tleft = "-" Then
      Tleft = "-0"
    End If
    Call Tlocate(xlc , Ylc)
    Call Tprintf(tleft , 0)
    Call Tprintf( "," , 0)
    Call Tprintf(tright , 0)
    Call Tprintf( "^" , 0)
    Select Case V
      Case 4 : Goto Exit_ttp
      Case 3 : Call Tprintf( " " , 0)
      Case 2 : Call Tprintf( "  " , 0)
      Case 1 : Call Tprintf( "  " , 0)
      End Select
    Exit_ttp:
    End Sub
    '************************************* ErrorChk ****************************START
    Sub Errorchk

    If Crc_ptr = 1 Then
     Call Tcls
     Call Tlocate(0 , 2)
     Call Tprintf( "   CRC error  " , 0)
     Err_ptr = 1
     Wait 2
    Goto Exit_err
    End If
    If Err_ptr = 1 Then
     Call Tcls
     Call Tlocate(0 , 2)
     Call Tprintf( " unknown error" , 0)
     Wait 2
    End If

    Exit_err:
    Crc_ptr = 0

    End Sub

    '************************************* D A T A *****************************START
    Crc8:
    Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
    Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
    Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
    Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
    Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
    Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
    Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
    Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
    Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
    Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
    Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
    Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
    Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
    Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
    Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
    Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
    Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
    Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
    Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
    Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
    Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
    Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
    Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
    Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
    Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
    Data 10 , 84 , 215 , 137 , 107 , 53

    Ascii:
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ,              ' space
    Data &H30 , &H4A , &H4A , &H52 , &H7C , &H00 ,              'a
    Data &H3F , &H48 , &H44 , &H44 , &H38 , &H00 ,              'b
    Data &H38 , &H44 , &H44 , &H44 , &H28 , &H00 ,              'c
    Data &H38 , &H44 , &H44 , &H48 , &H7F , &H00 ,              'd
    Data &H38 , &H54 , &H54 , &H54 , &H18 , &H00 ,              'e
    Data &H00 , &H04 , &H7E , &H05 , &H00 , &H00 ,              'f
    Data &H0C , &H52 , &H52 , &H4A , &H3C , &H00 ,              'g
    Data &H7F , &H08 , &H04 , &H04 , &H78 , &H00 ,              'h
    Data &H00 , &H44 , &H7D , &H40 , &H00 , &H00 ,              'i
    Data &H00 , &H40 , &H44 , &H3D , &H00 , &H00 ,              'j
    Data &H7F , &H20 , &H10 , &H28 , &H44 , &H00 ,              'k
    Data &H00 , &H41 , &H7F , &H40 , &H00 , &H00 ,              'l
    Data &H7C , &H04 , &H18 , &H04 , &H7C , &H00 ,              'm
    Data &H7C , &H08 , &H04 , &H04 , &H78 , &H00 ,              'n
    Data &H38 , &H44 , &H44 , &H44 , &H38 , &H00,               'o
    Data &H7C , &H14 , &H24 , &H24 , &H18 , &H00 ,              'p
    Data &H18 , &H24 , &H24 , &H14 , &H7C , &H00 ,              'q
    Data &H7C , &H04 , &H04 , &H08 , &H00 , &H00 ,              'r
    Data &H08 , &H54 , &H54 , &H54 , &H20 , &H00 ,              's
    Data &H04 , &H3F , &H44 , &H40 , &H00 , &H00 ,              't
    Data &H3C , &H40 , &H40 , &H40 , &H3C , &H00 ,              'u
    Data &H1C , &H20 , &H40 , &H20 , &H1C , &H00 ,              'v
    Data &H3C , &H40 , &H30 , &H40 , &H3C , &H00 ,              'w
    Data &H44 , &H28 , &H10 , &H28 , &H44 , &H00 ,              'x
    Data &H0C , &H50 , &H50 , &H48 , &H3C , &H00 ,              'y
    Data &H44 , &H64 , &H54 , &H4C , &H44 , &H00 ,              'z
    Data &H7C , &H12 , &H11 , &H12 , &H7C , &H00 ,              'A
    Data &H7F , &H49 , &H49 , &H49 , &H36 , &H00 ,              'B
    Data &H3E , &H41 , &H41 , &H41 , &H22 , &H00 ,              'C
    Data &H7F , &H41 , &H41 , &H41 , &H3E , &H00 ,              'D
    Data &H7F , &H49 , &H49 , &H49 , &H41 , &H00 ,              'E
    Data &H7F , &H09 , &H09 , &H09 , &H01 , &H00 ,              'F
    Data &H3E , &H41 , &H49 , &H49 , &H3A , &H00 ,              'G
    Data &H7F , &H08 , &H08 , &H08 , &H7F , &H00 ,              'H
    Data &H00 , &H41 , &H7F , &H41 , &H00 , &H00 ,              'I
    Data &H20 , &H41 , &H41 , &H41 , &H3F , &H00 ,              'J
    Data &H7F , &H08 , &H14 , &H22 , &H41 , &H00 ,              'K
    Data &H7F , &H40 , &H40 , &H40 , &H40 , &H00 ,              'L
    Data &H7F , &H02 , &H04 , &H02 , &H7F , &H00 ,              'M
    Data &H7F , &H04 , &H08 , &H10 , &H7F , &H00 ,              'N
    Data &H3E , &H41 , &H41 , &H41 , &H3E , &H00 ,              'O
    Data &H7F , &H09 , &H09 , &H09 , &H06 , &H00 ,              'P
    Data &H3E , &H41 , &H51 , &H61 , &H7E , &H00 ,              'Q
    Data &H7F , &H09 , &H19 , &H29 , &H46 , &H00 ,              'R
    Data &H06 , &H49 , &H49 , &H49 , &H30 , &H00 ,              'S
    Data &H01 , &H01 , &H7F , &H01 , &H01 , &H00 ,              'T
    Data &H3F , &H40 , &H40 , &H40 , &H3F , &H00 ,              'U
    Data &H1F , &H20 , &H40 , &H20 , &H1F , &H00 ,              'V
    Data &H7F , &H20 , &H10 , &H20 , &H7F , &H00 ,              'W
    Data &H63 , &H14 , &H08 , &H14 , &H63 , &H00 ,              'X
    Data &H03 , &H04 , &H78 , &H04 , &H03 , &H00 ,              'Y
    Data &H61 , &H51 , &H49 , &H45 , &H43 , &H00 ,              'Z
    Data &H3E , &H51 , &H49 , &H45 , &H3E , &H00 ,              '0
    Data &H00 , &H42 , &H7F , &H40 , &H00 , &H00 ,              '1
    Data &H42 , &H61 , &H51 , &H49 , &H46 , &H00 ,              '2
    Data &H22 , &H41 , &H49 , &H49 , &H36 , &H00 ,              '3
    Data &H18 , &H14 , &H12 , &H7F , &H10 , &H00 ,              '4
    Data &H27 , &H45 , &H45 , &H45 , &H39 , &H00 ,              '5
    Data &H3E , &H49 , &H49 , &H49 , &H32 , &H00 ,              '6
    Data &H61 , &H11 , &H09 , &H05 , &H03 , &H00 ,              '7
    Data &H36 , &H49 , &H49 , &H49 , &H36 , &H00 ,              '8
    Data &H26 , &H49 , &H49 , &H49 , &H3E , &H00 ,              '9
    Data &H30 , &H4A , &H4A , &HD2 , &H7C , &H00 ,              'ą
    Data &H38 , &H44 , &H46 , &H45 , &H28 , &H00 ,              'ć
    Data &H38 , &H54 , &H54 , &HD4 , &H18 , &H00 ,              'ę
    Data &H00 , &H49 , &H7F , &H44 , &H00 , &H00 ,              'ł
    Data &H7C , &H08 , &H06 , &H05 , &H78 , &H00 ,              'ń
    Data &H38 , &H44 , &H46 , &H45 , &H38 , &H00 ,              'ó
    Data &H08 , &H54 , &H56 , &H55 , &H20 , &H00 ,              'ś
    Data &H44 , &H64 , &H56 , &H4D , &H44 , &H00 ,              'ź
    Data &H44 , &H64 , &H55 , &H4C , &H44 , &H00 ,              'ż
    Data &H10 , &H7F , &H44 , &H42 , &H40 , &H00 ,              'Ł
    Data &H04 , &H4A , &H4B , &H4A , &H30 , &H00 ,              'Ś
    Data &H62 , &H56 , &H4B , &H46 , &H42 , &H00 ,              'Ź
    Data &H61 , &H59 , &H49 , &H4D , &H43 , &H00 ,              'Ż
    Data &H7E , &H43 , &H41 , &H43 , &H7E , &H00 ,              '}  BATT
    Data &H00 , &H00 , &H00 , &H7F , &H7F , &H00 ,              '[  PASEK
    Data &H00 , &H08 , &H08 , &H08 , &H08 , &H00 ,              '-
    Data &H00 , &H80 , &H60 , &H00 , &H00 , &H00 ,              ',
    Data &H00 , &H02 , &H05 , &H05 , &H02 , &H00                '^  DEGR

    Egypt:
    Data 84 , 3,                                                ' Image Table Name, Xbytes, N of Lines, 254 bytes
    Data &HFF , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01,
    Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H81 , &H81 , &H81 , &H41 , &H41 , &H21,
    Data &H21 , &H31 , &H11 , &H11 , &H11 , &H11 , &H11 , &H31 , &H21 , &HA1 , &H41 , &HC1 , &H81 , &H81 , &H01 , &H01,
    Data &H01 , &H01 , &H01 , &H81 , &HC1 , &HE1 , &HF1 , &HF9 , &HFF , &HF3 , &H8D , &H11 , &H31 , &H41 , &H81 , &H81,
    Data &HE1 , &HF1 , &HF9 , &HFD , &HFF , &HFF , &HFD , &H09 , &H11 , &H21 , &H41 , &H81 , &H01 , &H01 , &H01 , &H01,
    Data &H01 , &H01 , &H01 , &HFF , &HFF , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40,
    Data &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H40 , &H60 , &H60 , &H3C , &H04 , &H06 , &H03 , &H01 , &H00,
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H80 , &HE0 , &HE0 , &HF8 , &HFC , &HFE , &HFF , &HFF , &H82 , &H04,
    Data &H08 , &H30 , &HE1 , &HE3 , &HF4 , &HFC , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HF0,
    Data &HFC , &HFC , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HE0 , &H00 , &H00 , &H00,
    Data &H01 , &H02 , &H04 , &H08 , &H10 , &H20 , &HC0 , &HFF , &HFF , &HFE , &HDE , &HFE , &HFE , &HFF , &HFE , &HFF,
    Data &HFE , &HFF , &HEF , &HEF , &HDF , &HDF , &HFF , &HEF , &HFF , &HEF , &HEF , &HEF , &HEF , &H9E , &HDE , &HDE,
    Data &HDE , &HDE , &HCE , &HCE , &HCE , &HEE , &HEE , &HCE , &H8E , &HCF , &HCF , &HCF , &HDF , &HEF , &HCF , &HEF,
    Data &HCF , &HEF , &HDF , &HFC , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF,
    Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF,
    Data &HFF , &HFE , &HFC , &HFC , &HF8 , &HFC , &HFC , &HFF , &HFF , &HFF , &HFC , &HFF

    Been:
    Data 48 , 4,                                                ' Image Table Name, Xbytes, N of Lines, 194 bytes
    Data &H00 , &H00 , &H00 , &H1C , &H70 , &H80 , &H00 , &H80 , &HE0 , &H18 , &H08 , &H0C , &H04 , &H04 , &H06 , &H02,
    Data &H02 , &H02 , &H02 , &H02 , &H02 , &H02 , &H02 , &H02 , &H02 , &H02 , &H06 , &H04 , &H0C , &H0C , &H7C , &HF8,
    Data &HF8 , &HF0 , &HF0 , &HF0 , &HF0 , &HE0 , &HE0 , &HE0 , &HE0 , &HC0 , &HC0 , &H60 , &H30 , &H18 , &H00 , &H00,
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H07 , &H0E , &H3F , &H7F , &HF8 , &H0C , &H24 , &H74 , &H3C , &H3C , &HDC,
    Data &H5C , &H58 , &H30 , &H00 , &H00 , &HF8 , &HFC , &HFC , &HFE , &H5E , &H5E , &H5E , &H4E , &H7E , &H7E , &H3C,
    Data &H3D , &H3F , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &H01 , &H00 , &H00 , &H00 , &H00 , &H00,
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H1B , &HFE , &HFC , &HF0 , &HC0 , &H80 , &HF0,
    Data &HE8 , &HE0 , &HE0 , &HC0 , &HE0 , &HEB , &HEF , &HF7 , &HF6 , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &HE0 , &HF8,
    Data &HFE , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &H7F , &H03 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00,
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H03 , &H07 , &H1F , &H3F , &H3F,
    Data &H3F , &H3F , &H3D , &H39 , &H39 , &H3B , &H39 , &H39 , &H3D , &H3F , &H3F , &H3F , &H3F , &H3F , &H3F , &H3F,
    Data &H3F , &H3F , &H3F , &H3F , &H3F , &H1F , &H07 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00

    0
  • #9 09 Sty 2011 22:12
    Aimeiz
    Poziom 15  

    Tak jak wspomniałem w poprzednim poście, program z SPI ustawionym na soft działa bardzo dobrze, gdy wyświetlacz podłączony jest do portu - B
    Wprowadziłem aliasy, tak, żebym mógł łatwo przełożyć wyświetlacza na inny port.
    Działa ustawienie jak w kodzie post wyżej, jak również zmienione, w ramach portu b jak poniżej:

    Code:
    '*********************************** Aliases ************************************
    
    '                                                            'HPH7779 - 1 - Vcc+ 2.8 - 5V
    Lcd_clock Alias Portb.0                                     'HPH7779 - 2 - SCLK
    Lcd_out Alias Portb.1                                       'HPH7779 - 3 - SDIN
    Lcd_cmd Alias Portb.2                                       'HPH7779 - 4 - D/C Low for cmd mode
    Lcd_cs Alias Portb.3                                        'HPH7779 - 5 - SCE
    '                                                            'HPH7779 - 6 - GND
    Lcd_res Alias Portb.4                                       'HPH7779 - 8 - RESET Low for reset
    Lcd_din Alias Portb.7                                       'LPH7779 - brak połączenia
    Lcd_ss Alias None                                           'LPH7779 - brak połączenia
    Kbdpin Alias Pind                                           'Port czytania klawiaturki
    .
    .
    .
    .
    Config Lcd_cmd = Output
    Config Lcd_cs = Output
    Config Lcd_res = Output
    Config Spi = Soft , Din = Lcd_din , Dout = Lcd_out , Ss = Lcd_ss , Clock = Lcd_clock
    .
    .



    Wygodniej jest mi mieć wyświetlacz na porcie D, więc przedefiniowałem aliasy:

    Code:
    *********************************** Aliases ************************************
    
    '                                                            'HPH7779 - 1 - Vcc+ 2.8 - 5V
    Lcd_clock Alias Portd.0                                     'HPH7779 - 2 - SCLK
    Lcd_out Alias Portd.1                                       'HPH7779 - 3 - SDIN
    Lcd_cmd Alias Portd.2                                       'HPH7779 - 4 - D/C Low for cmd mode
    Lcd_cs Alias Portd.3                                        'HPH7779 - 5 - SCE
    '                                                            'HPH7779 - 6 - GND
    Lcd_res Alias Portd.4                                       'HPH7779 - 8 - RESET Low for reset
    Lcd_din Alias Portd.7                                       'LPH7779 - brak połączenia
    Lcd_ss Alias None                                           'LPH7779 - brak połączenia
    Kbdpin Alias Pinb                                           'Port czytania klawiaturki
    .
    .
    .
    Config Lcd_cmd = Output
    Config Lcd_cs = Output
    Config Lcd_res = Output
    Config Spi = Soft , Din = Lcd_din , Dout = Lcd_out , Ss = Lcd_ss , Clock = Lcd_clock
    .


    Przełączyłem wyświetlacz, skompilowałem program, załadowałem we flasha i niestety wyświetlacz nic nie wyświetla.
    Czy jest ograniczenie że w atmega 168 spi musi być na porcie B, nawet gdy ustawiamy Config SPI = soft, które pozwala na zdefiniowanie pinów pod który podpinamy peryferial?
    Mam kod do procesora, w postaci wynikowej, gdzie taki wyświetlacz jest podpięty pod portd.0 - portd.4 i działa, ale nie wiem czy tam jest sterowanie napisane "na piechotę", czy poprzez port SPI.

    Nie mogę nigdzie znaleźć specyfikacji sterowania tego wyświetlacza LPH7779, może ktoś mi poda link, albo prześle na PM-a?

    0
  • #10 27 Lut 2011 17:55
    Aimeiz
    Poziom 15  

    Znalazłem w końcu dokumentację do wyświetlacza i dorobiłem procedurę zastępującą SPI. Teraz można sobie podłączać pod dowolne piny i porty:

    Code:
    '------------------------------- LCD Aliases -----------------------
    
    '                                                            'HPH7779 - 1 - Vcc+ 2.8 - 5V
    Lcd_clock Alias Portb.0                                     'HPH7779 - 2 - SCLK
    Lcd_out Alias Portb.1                                       'HPH7779 - 3 - SDIN
    Lcd_dc Alias Portb.2                                        'HPH7779 - 4 - D/C Low for cmd mode
    Lcd_sce Alias Portb.3                                       'HPH7779 - 5 - SCE
    '                                                            'HPH7779 - 6 - GND
    Lcd_rst Alias Portb.4                                       'HPH7779 - 8 - RESET Low for reset
    Lcd_din Alias Portb.7                                       'LPH7779 - brak połączenia
    Lcd_ss Alias None                                           'LPH7779 - brak połączenia

    '---------------------------------- LCD Sub declarations -----------
    Declare Sub Spiout_1(byref Data As Byte , Byval Bytes As Byte)

    '  ----------------------- LCD subroutines -----------------------
    '********************************* SEND Without SPI ************************START
    Sub Spiout_1(byref Data As Byte , Byval Bytes As Byte)
    Local C As Byte
    Local Bytes_l As Byte
    For Bytes_l = 1 To Bytes
    '   Reset Lcd_cs                                             'enable (SCE)
       For C = 7 To 0 Step -1
          Reset Lcd_clock
    'NOP's up to 8MHz Atmega, NOP delays are not neccessary.
    'On 16mhz without NOPs display doesn't work
          NOP
          NOP
          NOP
          Lcd_out = Data.c
          NOP
          NOP
          NOP
          Set Lcd_clock
       Next C
          NOP
          NOP
          NOP
    '   Reset Lcd_clock
    Next Bytes_l
    'Set Lcd_cs
    End Sub



    Wystarczy podmienić tą procedurą spiout_1 komendę spiout w procedurach obsługi wyświetlacza, oraz usunąć komendę Config SPI i już nie jesteśmy uwiązani do stałego portu i pinów.

    0