Shop OBEX P1 Docs P2 Docs Learn Events
P2 Nokia 5110 LCD PASM Driver — Parallax Forums

P2 Nokia 5110 LCD PASM Driver

Cluso99Cluso99 Posts: 18,069
edited 2014-03-28 16:57 in Propeller 2
Here is a P2 Driver for the Nokia 5110 LCD giving a 16x6 text screen.
It is a fairly simple conversion of my P1 pasm driver.
The 5110 pcb plugs nicely into the I/O socket of the Parallax DE0 expansion board. No other connections are required.

This is an extract of the main P2 code excluding the font table...
                orgh    $00E00/4                ' start of hub ram
                org     0
entry
' Initialize the LCD 
              mov       outa, _init             ' preset outputs
              mov       dira, _dira             ' enable outputs
              call      #pause
'             andn      outa, _blight           ' BL=0=on
              call      #pause
              andn      outa, _rst              ' reset=0
              call      #pause
              or        outa, _rst              ' reset=1
              call      #pause
' setup the display
              mov       x, #$21                 ' PD=0=active, V=0=normal mode, H=1=extended commands follow
              call      #writec
              mov       x, #$C8                 ' Vop=$48 (contrast)
              call      #writec
              mov       x, #$06                 ' Temp=$02
              call      #writec
              mov       x, #$12                 ' Bias=$02
              call      #writec
              mov       x, #$20                 ' PD=0=active, V=0=normal mode, H=0=normal commands follow
              call      #writec
              mov       x, #$0C                 ' DE=10=normal display
              call      #writec
'             mov       x, #$0D                 ' DE=11=inverse
'             call      #writec                  
'             mov       x, #$09                 ' DE=01=all segments on
'             call      #writec
              call      #clear                  ' clear screen
' output full char sequence $20-$7F, then looping
              mov       z, #" "
begin1        mov       t, wait1                '\ delay
:here         djnz      t, @:here               '/
              mov       x, z
              call      #writech
              add       z, #1
              cmp       z, #$80         wz
        if_z  mov       z, #" "              
              jmp       #begin1
wait1         long      1 << 23
'------------------------------------------------------------------------------------------------
' Write char in "x" to LCD
writech       and       x, #$7F                 ' chr = ((ch - $20) * 5)
              sub       x, #$20
              mov       y, x
              shl       x, #2                   ' *4
              add       x, y                    ' *5
              locptra   #font
              addptra   x                       ' + Font hub addr
' fetch and write 5 cols of dots
              mov       y, #5
:wrloop       rdbyte    x, ptra++
              call      #writed
              djnz      y, @:wrloop
              mov       x, #0
              call      #writed
writech_ret   ret
'------------------------------------------------------------------------------------------------
' Write a single command or data byte to the LCD
writec        andn      outa, _cmd              ' /CMD=0 (sampled with D0)
              jmp       #writex
writed        or        outa, _cmd              ' /CMD=1=DATA              
writex        andn      outa, _ce               ' /CE=0
              call      #pause
' transmit D7 first, DI is sampled on +ve edge of CLK
              shl       x, #24                  ' D7 in b31
              mov       n, #8                   ' 8 bit count
:loop         rol       x, #1            wc     ' sample b31
        if_nc andn      outa, _di               ' Dn=0
        if_c  or        outa, _di               ' Dn=1                     
              andn      outa, _clk              '\ /CLK=0
              call      #pause                  '|
              or        outa, _clk              '| /CLK=1 (samples this edge)
              call      #pause                  '/
              djnz      n, @:loop
              or        outa, _ce               ' /CE=1
              call      #pause
writec_ret
writed_ret    ret
'------------------------------------------------------------------------------------------------
' Clear screen
clear         mov       x, #$00
              mov       y, #(84 * 48 / 8)
:clear        call      #writed
              djnz      y, @:clear
              mov       x, #0
              mov       y, #0
              call      #goto
clear_ret     ret
'------------------------------------------------------------------------------------------------
' Goto(x,y)   valid values from (0,0) to (14*6-1,5)
goto          shl       x, #1                   ' *2
              mov       n, x
              shl       x, #1                   ' *4
              add       x, n                    ' *6
              add       x, #$80                 ' x = $80 + x*6
              call      #writec
              mov       x, y
              add       x, #$40                 ' y = $40 + y
              call      #writec
goto_ret      ret            
'------------------------------------------------------------------------------------------------
' small delay as LCD is 4MHz max
pause         mov       t, #8
:here         djnz      t, @:here
pause_ret     ret
'------------------------------------------------------------------------------------------------
x             long      0
y             long      0
z             long      0
n             long      0
t             long      0
ptr           long      0
'------------------------------------------------------------------------------------------------
'              |------------------------ PIN_GND = 24    '8 GND pwr supplied by prop pin
'              | |---------------------- PIN_LED  = 22    '7 LED backlight enable pin     BL=0
'              | | |-------------------- PIN_3V3  = 20    '6 3v3 pwr supplied by prop pin
'              | | |  |----------------- PIN_SCLK = 18    '5 Serial Clock pin
'              | | |  | |--------------- PIN_SDIN = 16    '4 Serial Data pin
'              | | |  | | |------------- PIN_DC   = 14    '3 Data / Command selection pin D=1
'              | | |  | | | |----------- PIN_SCE  = 12    '2 Serial clock enable pin
'              | | |  | | | | |--------- PIN_RST  = 10    '1 Reset pin
_dira   long  %101010_101010101 << 10
_init   long  %001010_101010101 << 10
_blight long  %001000_000000000 << 10
_clk    long  %000000_100000000 << 10
_di     long  %000000_001000000 << 10
_cmd    long  %000000_000010000 << 10
_ce     long  %000000_000000100 << 10
_rst    long  %000000_000000001 << 10
'------------------------------------------------------------------------------------------------
'================================================================================================
              orgh
'Bit definitions for the font table. Each character is stored as 5 bytes,
'where each byte represents one vertical row of 8 pixels
FONT    

Nokia5110A_021.spin

Comments

  • Bob Lawrence (VE1RLL)Bob Lawrence (VE1RLL) Posts: 1,720
    edited 2014-03-26 16:43
    @Cluso99
    Here is a P2 Driver for the Nokia 5110 LCD

    I don't have a LCD to try it but I do like how you comment the code. :)

    Have you updated your P2 spreadsheet lately?


    Here's the data sheet for the PCD8544 display driver if anyone is interested.:



    https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf

  • Cluso99Cluso99 Posts: 18,069
    edited 2014-03-26 17:51
    @Cluso99
    I don't have a LCD to try it but I do like how you comment the code. :)
    Thanks Bob :) I learnt properly 40 years ago - makes it easy when you have to remember what you did years later!
    Have you updated your P2 spreadsheet lately?
    http://forums.parallax.com/showthread.php/125543-Propeller-II-update-BLOG?p=1252228&viewfull=1#post1252228
    Here's the data sheet for the PCD8544 display driver if anyone is interested.:
    https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf
    I bought a cheap one from eBay a while back. Cost ~$3 posted.
    BEWARE: The pinout is DIFFERENT for the Sparkfun version.
  • Cluso99Cluso99 Posts: 18,069
    edited 2014-03-26 17:53
    Here is a pic of my setup with the LCD...

    DE0_Nokia5110_LCD.jpg
    153 x 204 - 39K
    211 x 316 - 42K
  • Cluso99Cluso99 Posts: 18,069
    edited 2014-03-26 20:13
    Here is a version that runs in HUBEX mode :)
    Note only the registers (variables and constants) remain in cog (plus the jmp #hubex instruction due to DE0 limitation).
    DAT
    '================================================================================================
                  orgh      $00E00/4                ' start of hub ram
                  org       0                       ' start of cog ram
    entry         jmp       #hubex                  ' go execute from hub ram
    '------------------------------------------------------------------------------------------------
    '              |------------------------ PIN_GND  = 24    '8 GND pwr supplied by prop pin
    '              | |---------------------- PIN_LED  = 22    '7 LED backlight enable pin     BL=0
    '              | | |-------------------- PIN_3V3  = 20    '6 3v3 pwr supplied by prop pin
    '              | | |  |----------------- PIN_SCLK = 18    '5 Serial Clock pin
    '              | | |  | |--------------- PIN_SDIN = 16    '4 Serial Data pin
    '              | | |  | | |------------- PIN_DC   = 14    '3 Data / Command selection pin D=1
    '              | | |  | | | |----------- PIN_SCE  = 12    '2 Serial clock enable pin
    '              | | |  | | | | |--------- PIN_RST  = 10    '1 Reset pin
    _dira   long  %101010_101010101 << 10
    _init   long  %001010_101010101 << 10
    _blight long  %001000_000000000 << 10
    _clk    long  %000000_100000000 << 10
    _di     long  %000000_001000000 << 10
    _cmd    long  %000000_000010000 << 10
    _ce     long  %000000_000000100 << 10
    _rst    long  %000000_000000001 << 10
    '------------------------------------------------------------------------------------------------
    wait1         long      1 << 23
    x             long      0
    y             long      0
    z             long      0
    n             long      0
    t             long      0
    '------------------------------------------------------------------------------------------------
    '================================================================================================
                  orgh                              ' hubex code
    hubex              
    ' Initialize the LCD 
                  mov       outa, _init             ' preset outputs
                  mov       dira, _dira             ' enable outputs
                  call      @pause
    '             andn      outa, _blight           ' BL=0=on
                  call      @pause
                  andn      outa, _rst              ' reset=0
                  call      @pause
                  or        outa, _rst              ' reset=1
                  call      @pause
    ' setup the display
                  mov       x, #$21                 ' PD=0=active, V=0=normal mode, H=1=extended commands follow
                  call      @writec
                  mov       x, #$C8                 ' Vop=$48 (contrast)
                  call      @writec
                  mov       x, #$06                 ' Temp=$02
                  call      @writec
                  mov       x, #$12                 ' Bias=$02
                  call      @writec
                  mov       x, #$20                 ' PD=0=active, V=0=normal mode, H=0=normal commands follow
                  call      @writec
                  mov       x, #$0C                 ' DE=10=normal display
                  call      @writec
    '             mov       x, #$0D                 ' DE=11=inverse
    '             call      @writec                  
    '             mov       x, #$09                 ' DE=01=all segments on
    '             call      @writec
                  call      @clear                  ' clear screen
    ' output full char sequence $20-$7F, then looping
                  mov       z, #" "
    begin1        mov       t, wait1                '\ delay
    :here         djnz      t, @:here               '/
                  mov       x, z
                  call      @writech
                  add       z, #1
                  cmp       z, #$80         wz
            if_z  mov       z, #" "              
                  jmp       @begin1
    '------------------------------------------------------------------------------------------------
    ' Write char in "x" to LCD
    writech       and       x, #$7F                 ' chr = ((ch - $20) * 5)
                  sub       x, #$20
                  mov       y, x
                  shl       x, #2                   ' *4
                  add       x, y                    ' *5
                  locptra   #font
                  addptra   x                       ' + Font hub addr
    ' fetch and write 5 cols of dots
                  mov       y, #5
    :wrloop       rdbyte    x, ptra++
                  call      @writed
                  djnz      y, @:wrloop
                  mov       x, #0
                  call      @writed
    writech_ret   ret
    '------------------------------------------------------------------------------------------------
    ' Write a single command or data byte to the LCD
    writec        andn      outa, _cmd              ' /CMD=0 (sampled with D0)
                  jmp       @writex
    writed        or        outa, _cmd              ' /CMD=1=DATA              
    writex        andn      outa, _ce               ' /CE=0
                  call      @pause
    ' transmit D7 first, DI is sampled on +ve edge of CLK
                  shl       x, #24                  ' D7 in b31
                  mov       n, #8                   ' 8 bit count
    :loop         rol       x, #1            wc     ' sample b31
            if_nc andn      outa, _di               ' Dn=0
            if_c  or        outa, _di               ' Dn=1                     
                  andn      outa, _clk              '\ /CLK=0
                  call      @pause                  '|
                  or        outa, _clk              '| /CLK=1 (samples this edge)
                  call      @pause                  '/
                  djnz      n, @:loop
                  or        outa, _ce               ' /CE=1
                  call      @pause
    writec_ret
    writed_ret    ret
    '------------------------------------------------------------------------------------------------
    ' Clear screen
    clear         mov       x, #$00
                  mov       y, #(84 * 48 / 8)
    :clear        call      @writed
                  djnz      y, @:clear
                  mov       x, #0
                  mov       y, #0
                  call      @goto
    clear_ret     ret
    '------------------------------------------------------------------------------------------------
    ' Goto(x,y)   valid values from (0,0) to (14*6-1,5)
    goto          shl       x, #1                   ' *2
                  mov       n, x
                  shl       x, #1                   ' *4
                  add       x, n                    ' *6
                  add       x, #$80                 ' x = $80 + x*6
                  call      @writec
                  mov       x, y
                  add       x, #$40                 ' y = $40 + y
                  call      @writec
    goto_ret      ret            
    '------------------------------------------------------------------------------------------------
    ' small delay as LCD is 4MHz max
    pause         mov       t, #8
    :here         djnz      t, @:here
    pause_ret     ret
    '================================================================================================
                  orgh
    'Bit definitions for the font table. Each character is stored as 5 bytes,
    'where each byte represents one vertical row of 8 pixels
    font    
    
    
    Nokia5110A_023.spin
  • Bob Lawrence (VE1RLL)Bob Lawrence (VE1RLL) Posts: 1,720
    edited 2014-03-28 08:19

    Thanks Ray! Great job on the Doc's. I can tell that you've been working hard keep up with the constant changes. :)

    Here is a version that runs in HUBEX mode

    Interesting example of HUBEX usage.

  • Cluso99Cluso99 Posts: 18,069
    edited 2014-03-28 14:40
    Bob,
    Yes, the HUBEXEC mode was quite simple to implement. However, with a depth of 4 for the LIFO (stack) for CALL/RET, I must be on the limit. Any more and I will have to use CALLX/RETX using the AUX & PTRX for the stack.
  • Bill HenningBill Henning Posts: 6,445
    edited 2014-03-28 14:46
    Nice work Ray.

    I have a whole passel of little bw LCD modules, I should check the model number. I remember they needed a funny small smt connector...
  • Cluso99Cluso99 Posts: 18,069
    edited 2014-03-28 16:57
    Thanks Bill.
    These modules come with a pcb with the same 8pin 0.1" pitch on top andbottom edge ofthe pcb so it plugs straight into the expansion connector on the parallax expansion board. Nothing else required. Mine has ablue backlight (off in the photo) all for $3 posted on eBay.
Sign In or Register to comment.