Serial LCD Kit LCD #117 (formerly LCD #107) with Variable LED Backlight


The latest revision of the LCD117 firmware is available pre-programmed into the PIC 16F1827. Both The Shoppe at Wulfden and Modern Device sell these chips separately, in small or bulk quantities, or bundled with displays and/or complete kits.


Introduction.

(May, '13). Thanks to Paul Badger and Brian Riley Who took over maintenance and further development. LCD117.F is LCD117.E undergoing enhancement.

      Buy here!!!

(May, '13). LC117.D source code was corrected for a minor quirk in the CCS compiler, advanced to revision LCD117.E, placed under MIT license, and is now released to the public. In order to compile and burn the firmware source code to a chip you will need a copy of CCS's PIC-C Compiler. (BBR)

      LCD117_E Source Code and Docs

(June, '10). I am phasing in the new PIC16F1827 in place of the PIC16F648A. There is no functional change.

(June, '09). Separate versions of the LCD #117 are now offered for operation at 2400, 4800, 9600 and 19,200 baud.

The LCD #117-2400 operates at 2400 and is primarily intended for the PICAXE. Note that many of the newer PICAXE's are capable of higher baud rates, but 2400 is a safe selection.

The LCD #117 kit includes a programmed PIC16F648A (18-pin DIP) or similar, a 4.7K resistor for the /RESET of the PIC, a 330 and 4.7K resistor for biasing the contrast of the interfacing LCD, a TIP41 NPN transistor as associated 330 Ohm resistor for controlling the intensity of the LED backlight, a small supply of 22 AWG solid wire (four colors) suitable for use on a solderless breadboard and schematics. This kit was designed for tinkerers using a solderless breadboard. A PCB is not provided.

Note that this kit does not include an LCD. I have a number which are available including the 20X4 Character LCD with Yellow - Green Back light shown above. I also include a 4.7 Ohm (0.5W) and 39 Ohm (3W) current limiting resistor which may be used to limit the back light LED current to a maximum of nominally 200 mA when using either a +5 VDC or a +12 VDC source, respectively.

The LCD #117 PIC processor is code protected and the source code is not provided.

I believe this to be the most versatile serial LCD interface available on the market, with a 64 byte receive buffer, the ability to interface with a variety of LCD geometries, EEPROM storage of the LCD geometry, a customized text screen, eight user defined characters, tab size and cursor style, the ability to display normal text and "big numbers", a rich plain language instruction set, five general purpose outputs and an interface with a speaker or similar to provide a "beep".

Note that baud rates are fixed. 19,200, 9600, 4800 and 2400 are available.



Introduction.

This design provides an interface between a 9600 baud (or similar) serial line from a Microchip PIC, Arduino, Parallax Basic Stamp, NetMedia BX24, PICAXE and similar and a character LCD having an HD44780 interface.

The serial interface is TTL. That is, the idle state is a TTL logic one, or near +5 VDC. This is often termed non-inverting or true. This provides direct compatibility with the UART associated with a PIC, SerOut on a Basic Stamp and Com3 on a BX24. When interfacing with a PC or similar where the logic is inverted, an inverter is required. This might be as simple as a single 2N3904 NPN transistor.

The baud rate is fixed at 19.2K, 9600, 4800 or 2400 and cannot be changed. My feeling is that to provide the ability to change the baud rate in firmware is bad design as it opens the possibility of the unit inadvertently assuming a baud rate which is not compatible with the interfacing circuitry.

The processor provides for variable backlight intensity. The backlight current is controlled by a TIP-41 transistor which is included with the kit. The maximum backlight intensity is controlled with a series limiting resistor.

The processor does not provide for variable contrast. Two fixed resistors, 4.7K and 330, are included in the kit to provide nominally 0.3 VDC for contrast. However, the user may wish to use a potentiometer.

The processor provides a 64 character buffer. However, delays of nominally 100 ms are required after sending a command which requires the LCD processor to write to it's EEPROM.

A source of +5 VDC with a minimum current of 10 mA is required for this design. This excludes backligght current. If the interfacing LCDs LED back light feature is used, the back light current must be limited to less than 250 mA.


LCD Commands.

A list of various text manipulation commands follows. Note that all commands are prefaced with a "?" and the commands are case sensitive.

?a - set cursor to home position.
?b - destructive backspace
?f - clear LCD and leave cursor at home position
?g - beep
?h - backspace
?i - forward cursor
?j - up cursor
?k - down cursor
?l - clear current line and leave cursor at the beginning of the line
?m - carriage return.  Position the cursor at the beginning of the current line.
?n - new line.  Advance to the beginning of the next line and clear this line.
?t - tab.  Advance the cursor one tab.

?? - display the character '?'.

Note that the "?g" causes a 50 ms burst of nominally 500 Hz on a processor output. The LCD #117 kit does not include the interfacing audible device.

The cursor may be set to any position using the x and y commands;

?y0
?x15
Note that the line number, follows the 'y' command and the column number, consisting of two digits, follows the 'x' command.

Thus, outputting the string;

    "?y1?x10Hello?n"
positions the cursor at column 10 of line 1 and then prints "Hello", followed by a newline which also clears the next line.

Note that the line and column numbers begins with 0. Thus, for a 4 X 20 LCD, valid lines are 0 - 3 and valid columns are 00 - 19.

Any of eight user defined characters may be displayed using the digits 0 - 7. Thus;

	"?5?2"
causes user defined character 5 followed by user character 2 to be displayed on the LCD. Defining the user characters is discussed below.

(New with the LCD #117). A user text screen may be displayed at any time using the command;

    "?*"
I ship this with the customized text message as simply all numbers and characters. This may be modified using the ?C command which is discussed below.

Big Number Mode (New with LCD #117). This capability is operational only when using a 20X4 LCD.




The LCD #117 design provides both three and four block wide characters. The big number mode is entered;

    "?>3"
or
    "?>4"
On receipt of either of the "?>3" or "?>4" commands, the processor will download to the LCD the special characters required to display the big numbers. These are probably different from any user defined characters which the user may have defined. Thus, don't display your user defined characters when displaying in the "big number" format.

The cursor is then located on the top row of the current column.

In the >3 mode, as each numeric digit is received, it will erase anything appearing in the three column wide by four high space and display the number in the big number format. In addition, it will clear the column to the right of the character. The cursor will then be located at the top row for display of the next digit. Note that for the three block wide mode, this is four columns to the right of the upper left of the previous character. Thus, each digit uses four columns, three for the display of the digit and one for the spacing between digits.

Display of the minus sign, colon and decimal point use two columns, one for the display of the symbol plus one space.

The >4 mode is similar, except that each digit is four wide plus one space.

There is no intelligent "wrapping" provision for the "big number" mode. Thus, if there are only two columns remaining before the end of the LCD and you attempt to display a "7", part of the "7" will appear on the right side of the LCD, and the rest on the beginning of the display.

The big number mode may be exited at any time:

    "?<"

This may be used to display ordinary text along with the "big number" characters. For example, in one of the photos, the message "4X4 Demo" appears. This might be done;

    "?<"  ' exit the big number mode
    "?y0?x164X4"  ' row 0, beginning at column 16 - 4X4
    "?y1?x16Demo" ' row 1, beginning at column 16 - Demo

Note that the "?< command simply exits the "big number" mode. It does not download the user defined characters that might be used for graphics.

If one later wishes to use the user defined characters;

    "?R"  ' restore the user defined characters.
Again, note that the characters associated with the display of the "big number" characters are not compatible with the user defined characters one might use for plotting and thus, "big numbers" and graphics type applications using specially defined characters cannot coexist on the display.

Configuration Commands.

A number of parameters are stored in the processors EEPROM. This includes the geometry of the LCD, the type of cursor, the number of spaces in a tab, the eight user defined characters, defining a custom splash screen of text, selection of the screen which is displayed on boot and the backlight intensity setting.

The default is a 20 X 4 LCD, a tab size of 4, a full blinking cursor (3), eight user defined characters consisting of a single horizontal line, two horizontal lines, etc., a backlight intensity setting of 40, a text screen consisting lower case letters "a-t", "A-T" and two rows of numbers (see photo). The default screen which is selected for bootup is the configuration screen which displays the geometry, tab size, specially defined characters, the backlight setting and the cursor type.

All of these parameters may be modified. Note that when the modifications are made, the new values are written to the processor's EEPROM and thus need only be modified once.

Note that after sending commands which cause the processor to save data to EEPROM, provide a 100 ms delay prior to sending additional characters. Otherwise the addtional characters may be lost.

Set LCD Geometry

Setting the geometry defines the configuration of the interfacing LCD.

?Gyxx
For example;
   "?G216"
indicates the LCD is a 2X16 configuration.

Note that appropriate configurations include 2X16, 2X20, 2X24, 2X40, 4X16 and 4X20.

The configuration is important for the processor to properly position the cursor after each text character is displayed and in executing such commands as backspace, up cursor, down cursor, new line, etc.

Set Tab

The tab size may be set;

	"?s5"
In this case, the tab size is set to five. Valid values of the tab are 1 - 8.

When this command is received by the processor, the new tab size is written to EEPROM and this value is used thereafter when executing the ?t command.

When executing the ?t command, the cursor is advanced, and any characters in its path are overwritten with a space. For example, if the cursor is in column 3 and the tab size is 5, the cursor will advance to column 5. Anything in columns 3 and 4 will be replaced with spaces.

Backlight Intensity

The intensity of an LED backlight on the associated LCD may be adjusted;

    "?B80"
Note that the digits following the "B" are two digit hexadecimal, ranging from 00 (back light off) to FF (back light full on). This command causes an output to change duty cycle over the range of 0 to 255/256. The output may be used to switch a power transistor which then controls the avarage backlight current.

Set Cursor Style

The style of the cursor may be set using the ?c command.

	"?c3"
where the number is in the range of 0-3. A 0 configures as no cursor, a 2 as a non blinking cursor and a 3 as a blinking cursor. As with the set geometry and set tab, the style of the cursor is saved to EEPROM.

User Defined Characters.

User defined characters may be defined using the ?D command;

	"?D300000000001f1f1f"
The number after the 'D' is the number associated with the user defined character, in this case user defined character 3. This is then followed by the eight data bytes expressed in two digit hexadecimal. Note that the hexadecimal letters must be lower case.

In this example, lines 0, 1, 2, 3 and 4 consist of no pixels and lines 5, 6 and 7 consist of all five pixels. Thus, when user defined character 3 is displayed using the command ?3, a character consisting of the lower three lines will be displayed.

Each user defined character is saved in EEPROM.

Custom Text Screen (New with the LCD #117).



The customized text screen may be an advertisement which is displayed on boot or a template which may be displayed at any time. It is set using the ?C command, followed by the row, followed by the twenty characters which are to appear on the row. For example, the following sequence defines the custom screen shown in the photo.

    "?C0abcdefghijklmnopqrst"
    "?C1ABCDEFGHIJKLMNOPQRST"
    "?C201234567890123456789"
    "?C398765432109876543210"

Note that this custom screen may be displayed at any time;

    "?*"

Boot Screen Selection (New with the LCD #117).

The screen which is displayed on boot may be specified using the ?S command followed by a number, 0, 1 or 2.

   "?S1"  ' display the configuration setting on boot
   "?S0"  ' display no screen on boot.
   "?S2"  ' display the user custom text screen on boot.

Direct Control of the LCD.

Commands may be directly passed to the LCD using the ?! command;

	"?!01"
In this example the command 01 is sent directly to the LCD which clears the LCD.

A word of caution. With all other commands the program keeps track of the current cursor position. This is not done with commands sent directly to the LCD using the ?! command. Thus, if the user configures the LCD such that the cursor is located at some point, subsequent line feeds and similar will not work correctly as the program does not know the current cursor location.

Clearly, if the ?! command is used to place the LCD in a mode such that the cursor is decremented with each character or the display itself is scrolled, the subsequent operation of the LCD which assumes an incrementing cursor and a fixed display will give unpredictable results.

General Purpose Outputs

The LCD #117 provides four general purpose TTL outputs. Any of these outputs, 4 - 7, may be brought high or low using the 'H' and 'L' commands.

	"?H4?L7"
The above brings output 4 high and output 7 low. Note that outputs 0, 1, 2 and 3 are not valid.

On power up, all outputs are at a high impedance (configured as inputs). As each output is addressed, it is taken out of the high impedance state. The initial high impedance state permits the user to use either pull up or pull down resistors to avoid "bounce" when the processor is powered.

The current (source or sink) by any output should be limited to 15 mA.


Assembly

Content of the Kit.

Please take a few seconds to acquaint yourself with the content of the kit.

It consists of;

1 	Programmed Microchip PIC16F648A (or similar) Processor (18-pin DIP).
1	4.7K Resistor for the /MCLR on terminal 4 of the processor
1 	4.7K Resistor for LCD contrast.
1	330 Ohm (Orange, Orange, Brown) for LCD contrast.

1   TIP-41 NPN Power transistor and 330 Ohm base resistor.

1	5V LED with integrated series limiting resistor for debugging.

1	Bundle of 22 awg solid wire suitable for use with a solder less breadboard.

Assembly. Figures. (pdf)

Wire the circuitry as shown in Fig #1,

Note that the programmed PIC is an 18-pin DIP device with terminals 1-9 on one side and terminals 10 (across from terminal 9) through 18 on the other side. Integrated circuits are descendants of vacuum tubes and the terminal assignment is in a circular counter clockwise fashion as viewed from the top.

The layout of the LCD terminals is illustrated on the extreme right of the figure. It has been my experience that most LCDs have either an array of 14 terminals arranged in a single line or 2 lines of 7 terminals. If the LCD has an LED back light there may also be terminals 15 and 16. However, occasionally, I have seen other arrangements and it is best to consult the LCD data sheet for the LCD terminal numbers.

Note that there is a 4.7K pull up resistor to +5 VDC on the /MCLR terminal (term 4 of the PIC processor). The processor may either be reset by applying power, or by momentarily grounding the /MCLR terminal.

Note the OP/TEST input on terminal 8 of the processor. For the moment, leave this input open.

Prior to applying +5 VDC and GRD to the circuit, carefully check that +5 VDC is on terminal 14 of the PIC and terminal 2 of the LCD. Carefully, check to verify ground is on terminal 5 of the PIC and terminal 1 of the LCD.

Apply power and verify the LCD displays the geometry of the LCD, the tab size, eight user defined characters and a blinking cursor. The unit is shipped with a 4 X 20 geometry, a tab size of 4, user defined characters of a single row of pixels, two rows, three rows, etc and a blinking cursor.

This screen message appears for about two seconds and the LCD is cleared and the cursor is positioned at the home position. The LCD is now awaiting the receipt of characters to display. Momentarily ground the /MCLR (term 4) on the PIC processor to reboot the processor and the message will again appear for two seconds.

If the message does appear, it verifies that both the processor and the LCD are operational and the associated wiring is correct.

Troubleshooting the LCD circuitry

If the screen message does not appear.

Assembly Continued.

Serial Communication.

Note that the LCD #117 processor is designed to interface with 9600 baud serial using TTL levels. When idle, the serial line is near +5 VDC. A start bit, is a TTL logic zero pulse for one bit time (1/9600 or about 104 usecs). This is then followed by each of the eight bits followed by a return to idle, a TTL logic one. This is often referred to as non-inverting.

If you are interfacing with a PIC processor having a UART, the output is non-inverting and is thus, directly compatible with the LCD #117.

For a Basic Stamp 2, this is implemented;

	SerOut 5, 84, ["Hello World?n"]
For a BX24 using COM3 this is implemented;
   Call DefineCom3(0, OutputPin, &H08)
   Call OpenSerialPort_3(9600)

However, with a PC COM Port or similar, a logic one is less than nominally -8 VDC and a logic zero is greater than +8 VDC. With newer laptops and and with COM1 of the BX24, these levels may be somewhat less, say, 0.0 for a logic one and +5 VDC for a logic zero and thus, an inversion and level shift is required to interface with the LCD #117. This is often performed by a MAX232, A simpler circuit using a single 2N3904 is illustrated in the lower left of Figure #1.

Sample Routines

Many of the features of the LCD #117 are illustrated in the following routines which was written for the Parallax Basic Stamp 2 and the BasicX BX-24. Note that the "beep" function may be tested using the test LED on terminal 6 of the PIC. Operation of the 'H' and 'L" output commands may be similarly tested using the test LED.

Parallax Basic Stamp 2 Example.


' LCD117_1.BS2  (Parallax Basic Stamp 2)
'

' Configured for 9600 baud, 8 bits, no parity.
'
' Basic Stamp 2		   		         LCD #117
'
' P0 (term 5) -----------------------------------> RX (term 7)
'
'
' Sets geometry of LCD as 4X20 and clears the LCD and writes a byte in decimal and in hex
' an integer, a word, a character to the LCD display.
'
' Defines, special characters 0 - 5 as no vertical lines, 1 vertical line, 2 vertical lines etc.  Displays an
' increasing bar and then a decreasing bar on line 3.
'
' Enters an infinite loop winking outputs 7 and 6.
'
' copyright, Peter H. Anderson, Baltimore, MD, Oct, '06

   BaudMode Con 84 	' 9600 baud, non-inverted

   N Var Byte
   I Var Byte
   WordVar Var Word
   ByteVar Var Byte

   NN Var Byte
   Remainder Var Byte
   Num_5 Var Byte


   Dir0 = 1	' make P0 an output
   High 0	' this is the steady state for non-inverted
   Pause 1000	' allow to stabilize

   SerOut 0, Baudmode, ["?G420"] ' configure LCD geometry
   Pause 200	' pause to allow LCD EEPROM to program

   SerOut 0, Baudmode, ["?B40"] ' set backlight to 40 hex
   Pause 200    ' pause to allow LCD EEPROM to program

   SerOut 0, Baudmode, ["?f"]  ' clear the LCD

   SerOut 0, Baudmode, ["     LCD #117?n"]  'note new line

   SerOut 0, Baudmode, ["www.phanderson.com?n"]

   SerOut 0, Baudmode, ["?0?1?2?3?4?5?6?7?n"]	' display special characters

   Pause 5000		' pause five secs to admire

   SerOut 0, Baudmode, ["?y1?x00"] ' cursor at line 1, col 0

   SerOut 0, Baudmode, ["?l?j?l?j?l?y1"]' clear lines 1, 2 and 3 and start at line 1
   					' note use of down cursor

   WordVar = 12345
   ByteVar = 123


   For N = 0 to 25
      SerOut 0, Baudmode, ["?x00?y1"]			' locate cursor to beginning of line 1
      SerOut 0, Baudmode, [Dec N, "?t", Hex N, "?t"]	' display N in Dec and Hex
      SerOut 0, Baudmode, [Dec ByteVar, "?n"]
      SerOut 0, Baudmode, [Dec WordVar, "?n"]	' display a word
      ByteVar = ByteVar + 1
      WordVar = WordVar + 1
      For I = 1 to 4
         SerOut 0, Baudmode, ["?g"] ' beep four times
         Pause 50
      Next
      Pause 500
   Next

   SerOut 0, Baudmode, ["?D00000000000000000"]		' define special characters
   Pause 200   ' delay to allow write to EEPROM

   SerOut 0, Baudmode, ["?D11010101010101010"]
   Pause 200

   SerOut 0, Baudmode, ["?D21818181818181818"]
   Pause 200

   SerOut 0, Baudmode, ["?D31c1c1c1c1c1c1c1c"]
   Pause 200

   SerOut 0, Baudmode, ["?D41e1e1e1e1e1e1e1e"]
   Pause 200

   SerOut 0, Baudmode, ["?D51f1f1f1f1f1f1f1f"]
   Pause 200

   SerOut 0, Baudmode, ["?c0"]		' no cursor
   Pause 200

   SerOut 0, Baudmode, ["?y3?x00?l"]	' cursor to beginning of line 3 and clear line

   For N = 0 to 25			' increasing bar
      SerOut 0, Baudmode, ["?y3?x00"]
      NN = 4 * N
      Num_5 = NN / 5
      Remainder = NN // 5
      For I = 1 to Num_5
         SerOut 0, Baudmode, 10,["?5"]
      Next
      SerOut 0, Baudmode, 10, ["?", Dec1 Remainder]
   Next

   Pause 1000
   For N = 0 to 25			' decreasing bar
      SerOut 0, Baudmode, ["?y3?x00?l"]
      NN = 4 * N
      NN = 100 - NN
      Num_5 = NN / 5
      Remainder = NN // 5
      For I = 1 to Num_5
         SerOut 0, Baudmode, 10, ["?5"]
      Next
      SerOut 0, Baudmode, 10, ["?", Dec1 Remainder]
   Next

   Do					' continually bring outputs 7 annd 6 high and low
      SerOut 0, Baudmode, ["?H7?L6"]
      Pause 500
      SerOut 0, Baudmode, ["?L7?H6"]
      Pause 500
   Loop


Basic Stamp 2 - Big Number Example

' {$STAMP BS2}
' {$PBASIC 2.5}
' LCD117_2.BS2  (Parallax Basic Stamp 2)
'
' Illustrates displaying quantities using the Big Number (3-wide) format.
'
' Continually calls a stub program which returns temperatures in the range
' of -99.9 to 999.9 and display on the LCD in the 3-wide big number format.
'
' Configured for 9600 baud, 8 bits, no parity.
'
' Basic Stamp 2                    LCD #117
'
' P0 (term 5) -----------------------------------> RX (term 7)
'
' Sets geometry of LCD as 4X20, sets backlight intensity to 40 hex and configures
' for no cursor.
'
' Note that PBASIC 2.5 is used.
'
' copyright, Peter H. Anderson, Baltimore, MD, Oct, '06

   BaudMode CON 84  ' 9600 baud, non-inverted

   N VAR Byte
   T_10 VAR Word
   TWhole VAR Byte
   TFract VAR Byte
   Digit VAR Byte

   DIR0 = 1  ' make P0 an output
   HIGH 0  ' this is the steady state for non-inverted
   PAUSE 1000  ' allow to stabilize

   SEROUT 0, Baudmode, ["?G420"] ' configure LCD geometry
   PAUSE 200  ' pause to allow LCD EEPROM to program

   SEROUT 0, Baudmode, ["?B40"] ' set backlight to 40 hex
   PAUSE 200    ' pause to allow LCD EEPROM to program

   SEROUT 0, Baudmode, ["?c0"] ' clear the cursor
   PAUSE 200

   SEROUT 0, Baudmode, ["?f"]  ' clear the LCD

'   SEROUT 0, Baudmode, ["?>3"]  'note new line
'   PAUSE 200    ' allow time for the new special characters to be downloaded.

AGN:
   FOR N = 0 TO 7 ' for seven different temperatures
      SEROUT 0, Baudmode, ["?f"] ' clear the LCD
      SEROUT 0, Baudmode, ["?>3"]' big num 3 format
      PAUSE 200    ' allow time for the new special characters to be downloaded.

      GOSUB MeasTemp

      IF T_10 >= $8000 THEN  ' if sign bit is one, its negative
         T_10 = -T_10
         TWhole = T_10 / 10  ' separate off whole and fractional parts
         TFract = T_10 // 10

         IF TWhole > 9 THEN ' -10 to -99
            SEROUT 0, Baudmode, ["-"]
            Digit = TWhole / 10
            SEROUT 0, Baudmode, [DEC1 Digit]
            Digit = TWhole // 10
            SEROUT 0, Baudmode, [DEC1 Digit]
         ELSE         ' -0.0 to - 9.9
            SEROUT 0, Baudmode, ["?y0?x04"]
            SEROUT 0, Baudmode, ["-"]
            Digit = TWhole
            SEROUT 0, Baudmode, [DEC1 Digit]
         ENDIF

      ELSE    ' its positive
         TWhole = T_10 / 10
         TFract = T_10 // 10
         IF TWhole > 99 THEN   ' 100.0 - 999.0
            Digit = TWhole / 100
            SEROUT 0, Baudmode, [DEC1 Digit]
            TWhole = TWhole // 100
            Digit = TWhole / 10
            SEROUT 0, Baudmode, [DEC1 Digit]
            Digit = TWhole // 10
            SEROUT 0, Baudmode, [DEC1 Digit]
         ELSEIF TWhole > 9 THEN ' 10.0 to 99.0
            SEROUT 0, Baudmode, ["?y0?x02"]
            Digit = TWhole / 10
            SEROUT 0, Baudmode, [DEC1 Digit]
            Digit = TWhole // 10
            SEROUT 0, Baudmode, [DEC1 Digit]
         ELSE
            SEROUT 0, Baudmode, ["?y0?x06"]
            Digit = TWhole
            SEROUT 0, Baudmode, [DEC1 Digit]
         ENDIF
      ENDIF
      ' now the fractional part
      SEROUT 0, Baudmode, ["."]

      SEROUT 0, Baudmode, [DEC1 TFract]

      SEROUT 0, Baudmode, ["?<"]  ' Display "Deg F" in normal text
      SEROUT 0, Baudmode, ["?y1?x17"]
      SEROUT 0, Baudmode, ["Deg"]
      SEROUT 0, Baudmode, ["?y2?x17"]
      SEROUT 0, Baudmode, [" F "]

      PAUSE 2500
   NEXT

   GOTO AGN

   MeasTemp:
   ' This is a stub which returns various values of a temerature T_10
   ' It is intended to illustrate examples from -99.9 to 999.0
      LOOKUP N, [-123, -42, -8, 1234, 723, 72, 2], T_10
                '-12.3, -4.2, -0.8, 123.4, 72.3, 7.2, 0.2
      RETURN


Sample Code - BasicX BX24

Download for BX24.

' LCD117.Bas  (BasicX BX24)
'
'
' Configured for 9600 baud, 8 bits, no parity.
'
'												     LCD #117
'   BX24 (term 12) -----------------------------------> RX (term 7)
'
'
' Opens BX24 terminal 12 as SerCom3, 9600, noninverted, 8 bits per byte, no parity. Sets geometry of LCD as 4X20
' and clears the LCD and writes a byte in decimal and in hex, an integer, a long, a character and a single to the
' LCD display.
'
' Defines, special characters 0 - 5 as no vertical lines, 1 vertical line, 2 vertical lines etc.  Displays an
' increasing bar and then a decreasing bar on line 3.
'
' Enters an infinite loop winking outputs 7 and 6.
'
' Compile with SerCom3.Bas
'
' copyright, Peter H. Anderson, Baltimore, MD, Dec, '03

Sub Main()

   Dim Num_5 as Byte, N as Byte, NN as Byte, J as Byte, Remainder as Byte
   Dim I as Integer, L as Long, F as Single
   Dim Str as String

   Call Sleep(3.0)

   Call SetupComPort(12, 9600, &H08)	' term 12, 9600 baud, inverted
   Str = "?G420"
   Call PutStr_3(Str)		      	' configure LCD as 4 X 20

   Str = "?Ba0"					' set backlight for LCDs having an LED backlight
   Call PutStr_3(Str)

   Str = "?f"
   Call PutStr_3(Str)			' clear the LCD and home the cursor

   Str = "     LCD #117?n"		' note new line
   Call PutStr_3(Str)

   Str = "www.phanderson.com?n"
   Call PutStr_3(Str)

   Str = "?0?1?2?3?4?5?6?7?n"		' display special characters
   Call PutStr_3(Str)

   Call Sleep(5.0)			' pause to admire

   Str = "?y1?x00"
   Call PutStr_3(Str)

   Str = "?l?j?l?j?l?y1"		' clear lines 1, 2 and 3 and start at line 1
   Call PutStr_3(Str)			' note use of down cursor

   L = 123456
   I = 12345
   F = 23.75

   For N = 0 to 25
      Str = "?x00?y1"			' locate cursor to beginning of line 1
      Call PutStr_3(Str)
      Call PutB_3(N)			'  display in decimal
      Str = "?t"
      Call PutStr_3(Str)
      Call PutHexB_3(N)			' display in hex
      Str = "?t"
      Call PutStr_3(Str)
      Call PutI_3(I+CInt(N))		' display an integer
      Str = "?n"
      Call PutStr_3(Str)
      Call PutL_3(L + CLng(N))		' display a long
      Str = "?t"
      Call PutStr_3(Str)
      Call PutByte_3(ASC("a") + N)	' display a character
      Str = "?t"
      Call PutStr_3(Str)
      Call PutS_3(F + CSng(N))		' display a single
      Str = "?g"
      Call PutStr_3(Str)		' beep
      Call Sleep(1.0)
   Next

   Str ="?D00000000000000000"		' define special characters
   Call PutStr_3(Str)
   Call Sleep(0.2)
   Str ="?D11010101010101010"
   Call PutStr_3(Str)
   Call Sleep(0.2)			' delay to allow write to EEPROM
   Str ="?D21818181818181818"
   Call PutStr_3(Str)
   Call Sleep(0.2)
   Str ="?D31c1c1c1c1c1c1c1c"
   Call PutStr_3(Str)
   Call Sleep(0.2)
   Str ="?D41e1e1e1e1e1e1e1e"
   Call PutStr_3(Str)
   Call Sleep(0.2)
   Str ="?D51f1f1f1f1f1f1f1f"
   Call PutStr_3(Str)
   Call Sleep(0.2)

   Str = "?c0"				' no cursor
   Call PutStr_3(Str)

   Str = "?y3?x00?l"			' cursor to beginning of line 3 and clear line
   Call PutStr_3(Str)

   For N = 0 to 25				' increasing bar
      Str = "?y3?x00"
      Call PutStr_3(Str)
      NN = 4 * N
      Num_5 = NN \ 5
      Remainder = NN Mod 5
      For J = 1 to Num_5
         Str = "?5"
         Call PutStr_3(Str)
      Next
      Str = "?" & CStr(Remainder)
      Call PutStr_3(Str)
   Next

   For N = 0 to 25			' decreasing bar
      Str = "?y3?x00?l"
      Call PutStr_3(Str)
      NN = 100 - 4 * N
      Num_5 = NN \ 5
      Remainder = NN Mod 5
      For J = 1 to Num_5
         Str = "?5"
         Call PutStr_3(Str)
      Next
      Str = "?" & CStr(Remainder)
      Call PutStr_3(Str)
   Next

   Do					' continually bring outputs 7 annd 6 high and low
      Str = "?H7?L6"
      Call PutStr_3(Str)
      Call Sleep(0.5)
      Str = "?L7?H6"
      Call PutStr_3(Str)
      Call Sleep(0.5)
   Loop

End Sub

PICAXE Sample Routines using the LCD #117-2400

Most of the features of the LCD #117 are illustrated in the following routines which were written for the PICAXE-18X. Note that the "beep" function may be tested using the test LED on terminal 6 of the PIC. Operation of the 'H' and 'L" output commands may be similarly tested using the test LED.

One important point. Normally, when idle the serial terminal is at a logic one. When a character is sent, the lead is brought low for 1/2400 secs (start bit) followed by the data bits. However, when the PICAXE is booted, the output is initially at a high impedance and is then brought to an output logic zero. Thus, prior to executing the first SerOut instruction, it is important to bring the output to a logic one and pause briefly.


' LCD117_1.Bas  LCD #117-2400, (PICAXE-18X)
'
' Illustrates many capabilities of the LCD #117-2400 LCD
'
' Congigures the interfacing LCD for 4X20 geometry.  This need only be done one time as
' this is saved in the LCD #117 EEPROM
'
' Clears the LCD using the "?f" command.
' Writes some text.  Note the new line function "?n"
' Displays the user defined characters using commands ?0, ?1, etc
' Moves cursor to line 1, col 00 using commands "?y1" and "?x00"
' Clears lines 1, 2 and 3 using "?l" command.  Note "?j" is used for down cursor.
'
' Positions cursor at line 1 and displays the values of N and Word in decimal and in Hexadecimal.
'
' Defines new user defined characters consisting of no vertical lines, 1 vertical line,
' etc through 5 vertical lines.
'
' A bar scaled to 0 through 25 is displayed on line 3.  This might be used to graphically
' display a quantity.
'
' The PWM duty cycle is then set to 25 steps over the range of 00 to 250 using the ?B command.
' The duty cycle is also displayed on the LCD.
'
' The program then continually sets the two general purpose outs to 10 and 01 using the ?H and
' ?L commands.
'
'
' Peter H Anderson, Baltimore, MD, Feb, '04

   Symbol N = B2
   Symbol OWord = W0
   Symbol OByte = B3


   ' These variables are used in Sub BarDemo
   Symbol NN = B8
   Symbol LeftOver = B9
   Symbol Num_5 = B10
   Symbol J = B11

   ' These variables are used in Sub SerOutByteHex
   Symbol X = B8

   ' Variables used in PWMDemo
   Symbol Duty = B9

   High 0		' Be sure Tx Pin is idle for some time
   Pause 5000		' wait for PICAXE LCD to boot


   SerOut 0, T2400, ("?G420")			' configure LCD as 4 X 20
   SerOut 0, T2400, ("?f")			' clear the LCD and home the cursor

   Pause 100
   SerOut 0, T2400, ( "    PICAXE LCD?n")	' note new line


   SerOut 0, T2400, ("www.phanderson.com?n")

   SerOut 0, T2400, ("?0?1?2?3?4?5?6?7?n")		' display special characters

   Pause 2000			' pause to admire

   SerOut 0, T2400, ("?y1?x00")						' position cursor at beginning of row 1

   SerOut 0, T2400, ("?l?j?l?j?l?y1")				' clear lines 1, 2 and 3 and start at line 1
   ' note the use of down cursor command

   OWord = 12345

   For N = 0 to 25
      SerOut 0, T2400, ("?x00?y1")	' locate cursor to beginning of line 1

      SerOut 0, T2400, (#N)		'  display in decimal
      SerOut 0, T2400, ("?t")

      OByte = N
      GoSub SerOutByteHex     		' display in hex
      SerOut 0, T2400, ("?t")


      SerOut 0, T2400, (#OWord, "?t")	' display a word in decimal

      GoSub SerOutWordHex			' and in hex
      SerOut 0, T2400, ("?n")

      OWord = OWord + 1

      SerOut 0, T2400, ("?g")		' beep
      Pause 1000
   Next

   SerOut 0, T2400, ("?D00000000000000000")		' define special characters
   Pause 200					' delay to allow EEPROM to program

   SerOut 0, T2400, ("?D11010101010101010")
   Pause 200

   SerOut 0, T2400, ("?D21818181818181818")
   Pause 200

   SerOut 0, T2400, ("?D31c1c1c1c1c1c1c1c")
   Pause 200

   SerOut 0, T2400, ("?D41e1e1e1e1e1e1e1e")
   Pause 200

   SerOut 0, T2400, ("?D51f1f1f1f1f1f1f1f")
   Pause 200


   SerOut 0, T2400, ("?c0")		' no cursor


   SerOut 0, T2400, ("?y3?x00?l")	' cursor to beginning of line 3 and clear line

   GoSub BarDemo

   Pause 200

   GoSub PWMDemo

   Pause 200


AGAIN:   					' continually bring outputs 5 annd 4 high and low
   SerOut 0, T2400, ("?H5?L4")
   SerOut 0, T2400, (".")
   Pause 500
   SerOut 0, T2400, ("?L5?H4")
   SerOut 0, T2400, ("!")
   Pause 500
   GoTo AGAIN

BarDemo:

   For N = 0 to 25				' increasing bar
      SerOut 0, T2400, ("?y3?x00")
      NN = 4 * N
      Num_5 = NN / 5
      LeftOver = NN % 5
      For J = 1 to Num_5
         SerOut 0, T2400, ("?5")
      Next
      LeftOver = LeftOver + 48		' convert to a character
      SerOut 0, T2400, ("?", LeftOver)
   Next

   For N = 0 to 25			' decreasing bar
      SerOut 0, T2400, ("?y3?x00?l")
      NN = 4 * N
      NN = 100 - NN
      Num_5 = NN / 5
      LeftOver = NN % 5
      For J = 1 to Num_5
         SerOut 0, T2400, ("?5")
      Next

      LeftOver = LeftOver + 48		' convert to a character
      SerOut 0, T2400, ("?", LeftOver)
   Next

   Return

PWMDemo:
    SerOut 0, T2400, ("?f")	' clear the LCD
    SerOut 0, T2400, ("  PWM Duty Demo?n")
    For N = 0 to 25
       Duty = 10 * N
       SerOut 0, T2400, ("?l")
       OByte = Duty
       GoSub SerOutByteHex	' display the PWM in hex

       SerOut 0, T2400, ("?B")	' backlight control
       GoSub SeroutByteHex
       Pause 200
    Next

    SerOut 0, T2400, ("?f")	' clear the LCD
    SerOut 0, T2400, ("?B00")	' set PWM to 0

    Return


SerOutByteHex:
    X = OByte / 16	' high nibble
    X = X + 48		' add the character '0'

    If X <= 57 Then SerOutByteHex_1
       X = X + 7	' it is alphabetic; A, B, C, D, E, F

SerOutByteHex_1:
    SerOut 0, T2400, (X)

    X = Obyte % 16	' low nibble
    X = X + 48		' add the character '0'

    If X <= 57 Then SerOutByteHex_2
       X = X + 7	' it is alphabetic; A, B, C, D, E, F

SerOutByteHex_2:
    SerOut 0, T2400, (X)

    Return

SerOutWordHex:

    OByte = OWord / 256
    GoSub SerOutByteHex
    OByte = OWord % 256
    GoSub SerOutByteHex

    Return


Big Number Capability.

' LCD117_2.BAS (2400 baud), (PICAXE-18X)
'
' Illustrates displaying quantities using the Big Number (3-wide) format.
'
' Continually calls a stub program which returns temperatures in the range
' of -99.9 to 999.9 and display on the LCD in the 3-wide big number format.
'
' Configured for 2400 baud, 8 bits, no parity.
'
' PICAXE-18X			                    LCD #117-2400
'
' Pin0 (term 6) -----------------------------------> RX (term 7)
'
' Sets geometry of LCD as 4X20, sets backlight intensity to 40 hex and configures
' for no cursor.
'
' Note that PICAXE Editor 5.0.0 was used in this development.
'
' copyright, Peter H. Anderson, Baltimore, MD, Oct, '06


   Symbol T_10 = W0
   Symbol TWhole = B2
   Symbol TFract = B3
   Symbol Digit = B4
   Symbol N = B5

   Symbol BaudMode = T2400

   HIGH 0  ' this is the steady state for non-inverted
   PAUSE 1000  ' allow to stabilize

   SEROUT 0, BaudMode, ("?G420") ' configure LCD geometry
   PAUSE 200  ' pause to allow LCD EEPROM to program

   SEROUT 0, BaudMode, ("?B40") ' set backlight to 40 hex
   PAUSE 200    ' pause to allow LCD EEPROM to program

   SEROUT 0, BaudMode, ("?c0") ' clear the cursor
   PAUSE 200

   SEROUT 0, BaudMode, ("?f")  ' clear the LCD

'   SEROUT 0, BaudMode, ("?>3")  'note new line
'   PAUSE 200    ' allow time for the new special characters to be downloaded.

AGN:
   FOR N = 0 TO 6 ' for seven different temperatures
      SEROUT 0, BaudMode, ("?f") ' clear the LCD
      SEROUT 0, BaudMode, ("?>3")' big num 3 format
      PAUSE 200    ' allow time for the new special characters to be downloaded.

      GOSUB MEasTemp

      IF T_10 >= $8000 THEN  ' if its negative
         T_10 = -T_10
         TWhole = T_10 / 10  ' separate off whole and fractional parts
         TFract = T_10 // 10

         IF TWhole > 9 THEN ' -10 to -99
            SEROUT 0, BaudMode, ("-")
            Digit = TWhole / 10
            SEROUT 0, BaudMode, (#Digit)
            Digit = TWhole // 10
            SEROUT 0, BaudMode, (#Digit)
         ELSE         ' -0.0 to - 9.9
            SEROUT 0, BaudMode, ("?y0?x04")
            SEROUT 0, BaudMode, ("-")
            Digit = TWhole
            SEROUT 0, BaudMode, (#Digit)
         ENDIF

      ELSE    ' its positive
         TWhole = T_10 / 10
         TFract = T_10 // 10
         IF TWhole > 99 THEN   ' 100.0 - 999.0
            Digit = TWhole / 100
            SEROUT 0, BaudMode, (#Digit)
            TWhole = TWhole // 100
            Digit = TWhole / 10
            SEROUT 0, BaudMode, (#Digit)
            Digit = TWhole // 10
            SEROUT 0, BaudMode, (#Digit)
         ELSEIF TWhole > 9 THEN ' 10.0 to 99.0
            SEROUT 0, BaudMode, ("?y0?x02")
            Digit = TWhole / 10
            SEROUT 0, BaudMode, (#Digit)
            Digit = TWhole // 10
            SEROUT 0, BaudMode, (#Digit)
         ELSE
            SEROUT 0, BaudMode, ("?y0?x06")
            Digit = TWhole
            SEROUT 0, BaudMode, (#Digit)
         ENDIF
      ENDIF
      ' now the fractional part
      SEROUT 0, BaudMode, (".")

      SEROUT 0, BaudMode, (#TFract)

      SEROUT 0, BaudMode, ("?<")  ' Display "Deg F" in normal text
      SEROUT 0, BaudMode, ("?y1?x17")
      SEROUT 0, BaudMode, ("Deg")
      SEROUT 0, BaudMode, ("?y2?x17")
      SEROUT 0, BaudMode, (" F ")

      PAUSE 2500
   NEXT

   GOTO AGN

   MeasTemp:
   ' This is a stub which returns various values of a temerature T_10
   ' It is intended to illustrate examples from -99.9 to 999.0
      LOOKUP N, ($ff85, $ffd6, $fff8, 1234, 723, 72, 2), T_10 ' negative numbers are stored in 2's compliment
                '-123,  -42,   -8,    1234, 723, 72, 2
                ' -12.3 -4.2   -0.8   123.4, 72.3 7.2, 0.2
      RETURN