Shop OBEX P1 Docs P2 Docs Learn Events
parallel lcd control — Parallax Forums

parallel lcd control

chrillzchrillz Posts: 3
edited 2009-01-08 19:16 in BASIC Stamp
I have just got an parallel lcd working following an example from http://www.weethet.nl/english/basicstamp2_lcdcontrol.php, but I don't understand why my lcd (a 16x1) doesn't print more than 8 characters? I can't figure out how to utilize the whole row of the lcd.

the code is:

' -----[noparse][[/noparse] Constants ]-------------------------------------------------------
'
RS      CON     4                       ' Register Select (1 = char)
E       CON     5                       ' LCD Enable pin  (1 = enabled)

' LCD control characters
'
ClrLCD  CON     $01                     ' clear the LCD
CrsrHm  CON     $02                     ' move cursor to home position
CrsrLf  CON     $10                     ' move cursor left
CrsrRt  CON     $14                     ' move cursor right
DispLf  CON     $18                     ' shift displayed chars left
DispRt  CON     $1C                     ' shift displayed chars right
DDRam   CON     $80                     ' Display Data RAM control

 
' -----[noparse][[/noparse] Variables ]-------------------------------------------------------
'
char    VAR     BYTE                    ' character sent to LCD
index   VAR     BYTE                    ' loop counter


' -----[noparse][[/noparse] EEPROM Data ]-----------------------------------------------------
'
Msg     DATA    "BASIC Stamp 2              LCD in action"      ' preload message


' -----[noparse][[/noparse] Initialization ]--------------------------------------------------
'
Init:     DIRL = %00111111                ' set pins 0-5 as outputs
    OUTS = $0000                    ' clear the pins

' Initialize the LCD (Hitachi HD44780 controller)
'
LCDinit:    'pause 500            ' Wait for LCD init                
           ' =================================
    ' STANDARD HITACHI 44780 4-BIT INIT
' =================================
           char=%00000011        ' Set 8-bit mode (1)
           GOSUB LCDCMD
           char=%00000011        ' Set 8-bit mode (2)
           GOSUB LCDCMD
           char=%00000011        ' Set 8-bit mode (3)
           GOSUB LCDCMD
          char=%00000010        ' Set 4-bit mode
           GOSUB LCDCMD
           char=%00101111        ' Set duty cycle  11xx = 5x11 matrix
           GOSUB LCDCMD        '            10xx = 5x8 matric
           char=%00000000        ' Display control mode
           GOSUB LCDCMD
           char=%00001000        ' Set display OFF, cursor OFF, blink OFF
           GOSUB LCDCMD
           char=%00000000        ' Display control mode
           GOSUB LCDCMD
           char=%00001111        ' Set display ON, cursor ON, blink ON
           GOSUB LCDCMD        ' 11CB -> C=1 cursor on, B=1 blink on
           char=%00000000        ' Entry control mode
           GOSUB LCDCMD
           char=%00000110        ' Set cursor right, no display shift
           GOSUB LCDCMD        ' 01IS -> I=1 cursor right, S=1 shift display

    char = ClrLCD        ' Clear LCD
    GOSUB LCDCMD

' -----[noparse][[/noparse] Main Code ]-------------------------------------------------------
'
Start:  
    FOR index = 0 TO 39
      READ Msg + index, char        ' get character from EEPROM
              'char=index
      GOSUB LCDwr                   ' write it
    NEXT

    PAUSE 1000                      ' wait 2 seconds

    char = ClrLCD                   ' clear the LCD
    GOSUB LCDCMD

    PAUSE 500

    GOTO Start                      ' do it all over


' -----[noparse][[/noparse] Subroutines ]-----------------------------------------------------
'
' Send command to the LCD
'
LCDcmd: LOW RS                          ' enter command mode
'
' Write ASCII char to LCD 
'
LCDwr: 
    OUTA = char.HIGHNIB             ' output high nibble
    PULSOUT E, 1                    ' strobe the Enable line
    OUTA = char.LOWNIB              ' output low nibble
    PULSOUT E, 1
    HIGH RS                         ' return to character mode
    RETURN

Comments

  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    edited 2009-01-08 19:16
    Some have strange mapping of the addresses. If it is a 1 line by 16 character display then most likely the second half of the display is actually line 2. You can set the DDRAM address directly to it and continue printing. I have two such displays in my parts drawers at home. I can print up to 8 characters, then I have to set the address to line 2 and keep printing. When I attach a serial backpack, I can print 8 characters, do a CR/LF and keep printing. A datasheet for the display should show the address mapping and line configuration. I hope this helps. Take care.

    P.S. – If you write a program that keeps printing characters it should eventually show up on the second half of the display.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Chris Savage
    Parallax Engineering
Sign In or Register to comment.