LCD03 - I2C/Serial LCD
Technical Documentation
Overview
The I2C and serial display driver provides easy operation of a standard 20*4 LCD Text
display. It requires only a 5v power supply and the two data connections for either mode,
freeing up pins on your processor. Many useful text formatting functions are provided
(described below) and also the ability to put together custom characters into memory
which can be called off as required. There is a 64 byte FIFO buffer to ensure a minimum
of delay in writing to the display.
The LCD03 is the same as the LCD02 apart from the added ability to control the backlight
in software. It is now easily possible to turn the backlight on and off by sending commands
via the I2C / Serial link.
Connections
                                                        Easy connections for 3*4
                                                        keypad, just wire pins 2-8
                                                          to corresponding red
                                                                numbers
                 Pins 1 and 9 are unconnected - only pins 2 - 8 are used.
                                                                                     Page 1
Serial/I2C Mode selection
A single jumper link is used to select Serial or I2C mode. When the jumper is present
(factory default) the module is in serial mode. When the jumper is removed the module is
in I2C mode. The mode jumper is only checked as part of the power-up sequence, so
make sure the display is off before changing modes. If you change the link position while
the module is powered, nothing will change until next time you switch on.
FIFO
Because the I2C communications operate faster than the display can accept data, all
commands and text you send to the display are placed in the FIFO (First In, First Out)
buffer. This data is sent to the display as fast as it will accept it. The FIFO is 64 bytes in
length and the number of free bytes can be returned in either mode. When sending lots of
text to the display, you should check the number of free bytes so you don't overflow the
buffer. If the buffer does overflow, the excess bytes are ignored. The FIFO buffer exists in
Serial mode too, but at 9600 the display is fast enough and you are unlikely to need to
check it.
I2C Operation
I2C Bus
The I2C display is located on the I2C bus at an address of 0XC6. The SCL and SDA lines
should have pull-up resistors on them somewhere on the bus. You only require 1 pair of
resistors for the whole I2C bus, not specifically for the LCD03. They are normally on the
master controller and you may already have them. If not, anything between 1k8 and 10k
should work. I recommend 1k8 for best noise immunity.
Display control commands
The LCD03 has four registers, three of which are read only information registers. Register
0 is a dual purpose register, when written, it is the command register where all of the
instructions from the commands section should be sent. When read it returns the number
of free bytes in the FIFO buffer.
                 register              Read                     Write
                            Number of free bytes in FIFO      Command
                    0
                                       buffer                  register
                    1         Keypad state Low byte               x
                    2         Keypad state High byte              x
                    3                Version                      x
Serial operation
The Serial mode operates over a link with a baud rate of 9600 bps (no parity, 1 stop bit)
and 5v signals, Do NOT connect RS232 directly to the module - you will destroy it. Use a
MAX232 or equivalent to convert the RS232 levels to 5v. Operation is with the same
command set as the I2C mode with an additional set of commands to request data to be
sent i.e. the software version.
                        Commands (for both I2C and Serial)
decimal    command                                   description
   0     null (ignored)                      Ignored as a no operation
   1     Cursor Home               Sets the cursor to the home position (top left)
         Set cursor (1- Cursor to a position specified by the next byte, where 1 is the
   2
               80)                       top left and 80 is the bottom right
        set cursor (line, Sets cursor using two bytes, where first byte is the line and the
   3
            column)                         second byte is the column
                                                                                       Page 2
decimal    command                                   description
   4       Hide cursor        stops the position cursor from appearing on the display
              Show
    5       underline                 Changes the cursor to the underline type
             cursor
          Show blinking
    6                                  Changes the cursor to the blinking type
             cursor
                        deletes the preceding character from the current position on the
    8       Backspace
                                                     display
        Horizontal tab     Moves the current position across by the tab space set by
    9
         (by tab set)                  command 18 (default tab space 4)
                         Moves the cursor down one line to the position beneath in the
   10   Smart line feed
                                                 same column
                        Moves the cursor up one line to the position above in the same
   11     Vertical tab
                                                     column
   12    Clear screen        Clears the screen and sets cursor to the home position
           Carriage
   13                             Moves the cursor to the start of the next line
             Return
                         Clears the contents of the current column and moves cursor
   17   Clear Column
                                              right by one column
                         Sets the required tab size, the following byte can be a size of
   18        Tab set
                                               between 1 and 10
   19    Backlight on                 Turns the backlight of the LCD03 on
         Backlight off
   20                                 Turns the backlight of the LCD03 off
            (default)
         Custom char     allows 8 custom chars to be built. See custom char generator
   27
           generator                                  below
 32-255 ASCII chars                 Writes ASCII chars straight to the display
                         Additional commands (Serial only)
decimal     command                                 description
                           Results in the module returning its FIFO status, the number of
   14      FIFO status
                                             free bytes from 0 to 64
             Software
   15                      Results in the module returning its single byte software version
              version
                            Returns keypad input status, two bytes returned with the low
   16     Keypad status
                                         byte first (see keypad section)
Custom char generator
Custom characters can be generated by sending an 8 byte map. The first thing that must
be done is to send a command of 27 to indicate that you intend to make a custom char.
Next you have to specify the position in ram of one of the 8 available chars you intend to
build, the 8 chars are mapped at positions 128-135. Then the pattern should be sent as
below.
How to calculate an 8 byte character pattern:
Eight bytes are sent with the highest bit masked on, the next two bits are ignored (x) and
                                                                                    Page 3
the final 5 bits show the line pattern.
                           Bit Bit Bit Bit Bit
                            4   3 2     1   0
                                                         sent byte
                  Byte 0                           1xx00000 (128)
                  Byte 1                           1xx00100 (132)
                  Byte 2                           1xx01110 (142)
                  Byte 3                           1xx10101 (149)
                  Byte 4                           1xx00100 (132)
                  Byte 5                           1xx00100 (132)
                  Byte 6                           1xx00100 (132)
                 Byte 7                           1xx00000 (128)
So to build the above arrow into location 128 you would send this sequence to the
command register:
      •   27 (char generate command)
      •   128 (location to be filled)
      •   128 (byte 0)
      •   132 (byte1)
      •   142 (byte2)
      •   149 (byte3)
      •   132 (byte 4)
      •   132 (byte 5)
      •   132 (byte 6)
      •   128 (byte 7)
Now the char is built into a memory location it can be called at any time as long as the
module remains powered by simply sending the address between 128 and 135.
Keypad input
An added feature of the module is the ability to connect a 3*4 Keypad, the module will
automatically scan the status of the keys at regular intervals. The result is then provided in
two bytes for easy use, shown by the diagram below. Each bit represents the row and
column of each button on the keypad. The second row is the keypad characters when
using our keypad.
                  High byte                                       Low byte
  0       0   0    0    4/3   4/2 4/1 3/3         3/2 3/1 2/3      2/2   2/1   1/3 1/2 1/1
  0     0   0       0   #      0    *    9          8     7    6    5     4     3     2  1
Any key press will result in the corresponding bit in the byte being driven high. In I2C
mode these bytes are available for reading from registers one and two.
In serial mode, just send 16 to the LCD03 and it will reply with the two bytes as above with
the low byte first.
                                                                                      Page 4