1: LCD User-Interface Terminal
BASIC Stamp I Application Notes
Introduction.
This application note presents a program in PBASIC that
enables the BASIC Stamp to operate as a simple user-interface terminal.
Background.
Many systems use a central host computer to control
remote functions. At various locations, users communicate with the
main system via small terminals that display system status and accept
inputs. The BASIC Stamp’s ease of programming and built-in support
for serial communications make it a good candidate for such user-
interface applications.
The liquid-crystal display (LCD) used in this project is based on the
popular Hitachi 44780 controller IC. These chips are at the heart of
LCD’s ranging in size from two lines of four characters (2x4) to 2x40.
How it works.
When power is first applied, the BASIC program
initializes the LCD. It sets the display to print from left to right, and
enables an underline cursor. To eliminate any stray characters, the
program clears the screen.
After initialization, the program enters a loop waiting for the arrival of
a character via the 2400-baud RS-232 interface. When a character
arrives, it is checked against a short list of special characters (backspace,
control-C, and return). If it is not one of these, the program prints it on
the display, and re-enters the waiting-for-data loop.
If a backspace is received, the program moves the LCD cursor back one
1
SWITCHES 0–3
(C) 1992 Parallax, Inc.
+5V
Vin
1k
DB4
DB5
DB6
DB7
RS
E
PC
0
1
2
3
4
5
6
7
GND
11
12
13
14
4
6
PIC16C56
BASIC STAMP
Schematic to accompany program
EEPROM
Vdd Vo Vss R/W DB0 DB1 DB2 DB3
2
+5
3
1
5
7
8
9
10
10k
1k
SERIAL OUT
SERIAL IN
22k
10k
(contrast)
TERMINAL
.
BAS
.
Parallax, Inc. • BASIC Stamp Programming Manual 1.9
•
Page 71
BASIC Stamp I Application Notes
1: LCD User-Interface Terminal
space, prints a blank (space) character to blot out the character that was
there, and then moves back again. The second move-back step is
necessary because the LCD automatically advances the cursor.
If a control-C is received, the program issues a clear instruction to the
LCD, which responds by filling the screen with blanks, and returning
the cursor to the leftmost position.
If a return character is received, the program interprets the message as
a query requiring a response from the user. It enters a loop waiting for
the user to press one of the four pushbuttons. When he does, the
program sends the character (“0” through “3”) representing the button
number back to the host system. It then re-enters its waiting loop.
Because of all this processing, the user interface cannot receive charac-
ters sent rapidly at the full baud rate. The host program must put a little
breathing space between characters; perhaps a 3-millisecond delay. If
you reduce the baud rate to 300 baud and set the host terminal to 1.5 or
2 stop bits, you may avoid the need to program a delay.
At the beginning of the program, during the initialization of the LCD,
you may have noticed that several instructions are repeated, instead of
being enclosed in for/next loops. This is not an oversight. Watching the
downloading bar graph indicated that the repeated instructions actu-
ally resulted in a more compact program from the Stamp’s point of
view. Keep an eye on that graph when running programs; it a good
relative indication of how much program space you’ve used. The
terminal program occupies about two-thirds of the Stamp’s EEPROM.
From an electronic standpoint, the circuit employs a couple of tricks.
The first involves the RS-232 communication. The Stamp’s processor, a
PIC 16C56, is equipped with hefty static-protection diodes on its input/
output pins. When the Stamp receives RS-232 data, which typically
swings between -12 and +12 volts (V), these diodes serve to limit the
voltage actually seen by the PIC’s internal circuitry to 0 and +5V. The
22k resistor limits the current through the diodes to prevent damage.
Sending serial output without an external driver circuit exploits an-
other loophole in the RS-232 standard. While most RS-232 devices
Page 72
•
BASIC Stamp Programming Manual 1.9 • Parallax, Inc.
1: LCD User-Interface Terminal
BASIC Stamp I Application Notes
expect the signal to swing between at least -3 and +3V, most will accept
the 0 and +5V output of the PIC without problems.
This setup is less noise-immune than circuits that play by the RS-232
rules. If you add a line driver/receiver such as a Maxim MAX232,
remember that these devices also invert the signals. You’ll have to
change the baud/mode parameter in the instructions serin and serout
to T2400, where T stands for true signal polarity. If industrial-strength
noise immunity is required, or the interface will be at the end of a mile-
long stretch of wire, use an RS-422 driver/receiver. This will require the
same changes to serin and serout.
Another trick allows the sharing of input/output pins between the LCD
and the pushbuttons. What happens if the user presses the buttons
while the LCD is receiving data? Nothing. The Stamp can sink enough
current to prevent the 1k pullup resistors from affecting the state of its
active output lines. And when the Stamp is receiving input from the
switches, the LCD is disabled, so its data lines are in a high-impedance
state that’s the next best thing to not being there. These facts allow the
LCD and the switches to share the data lines without interference.
Finally, note that the resistors are shown on the data side of the
switches, not on the +5V side. This is an inexpensive precaution against
damage or interference due to electrostatic discharge from the user’s
fingertips. It’s not an especially effective precaution, but the price is
right.
Program listing.
These programs may be downloaded from our Internet
ftp site at ftp.parallaxinc.com. The ftp site may be reached directly or
through our web site at http://www.parallaxinc.com.
' PROGRAM: Terminal.bas
' The Stamp serves as a user-interface terminal. It accepts text via RS-232 from a
' host, and provides a way for the user to respond to queries via four pushbuttons.
Symbol S_in
Symbol S_out
Symbol E
Symbol RS
Symbol keys
Symbol char
=
=
=
=
=
=
6
7
5
4
b0
b3
' Serial data input pin
' Serial data output pin
' Enable pin, 1 = enabled
' Register select pin, 0 = instruction
' Variable holding # of key pressed.
' Character sent to LCD.
1
Parallax, Inc. • BASIC Stamp Programming Manual 1.9
•
Page 73
BASIC Stamp I Application Notes
Symbol
Symbol
Symbol
Symbol
Sw_0
Sw_1
Sw_2
Sw_3
=
=
=
=
pin0
pin1
pin2
pin3
' User input switches
' multiplexed w/LCD data lines.
1: LCD User-Interface Terminal
' Set up the Stamp’s I/O lines and initialize the LCD.
begin:
let pins = 0
' Clear the output lines
let dirs = %01111111
' One input, 7 outputs.
pause 200
' Wait 200 ms for LCD to reset.
' Initialize the LCD in accordance with Hitachi’s instructions for 4-bit interface.
i_LCD: let pins = %00000011
' Set to 8-bit operation.
pulsout E,1
' Send data three times
pause 10
' to initialize LCD.
pulsout E,1
pause 10
pulsout E,1
pause 10
let pins = %00000010
' Set to 4-bit operation.
pulsout E,1
' Send above data three times.
pulsout E,1
pulsout E,1
let char = 14
' Set up LCD in accordance with
gosub wr_LCD
' Hitachi instruction manual.
let char = 6
' Turn on cursor and enable
gosub wr_LCD
' left-to-right printing.
let char = 1
' Clear the display.
gosub wr_LCD
high
RS
' Prepare to send characters.
' Main program loop: receive data, check for backspace, and display data on LCD.
main:
serin S_in,N2400,char
' Main terminal loop.
goto bksp
out:
gosub wr_LCD
goto main
' Write the ASCII character in b3 to LCD.
wr_LCD: let pins = pins & %00010000
let b2 = char/16
let pins = pins | b2
pulsout E,1
let b2 = char & %00001111
let pins = pins & %00010000
let pins = pins | b2
pulsout E,1
return
'
'
'
'
'
'
'
Put high nibble of b3 into b2.
OR the contents of b2 into pins.
Blip enable pin.
Put low nibble of b3 into b2.
Clear 4-bit data bus.
OR the contents of b2 into pins.
Blip enable.
' Backspace, rub out character by printing a blank.
Page 74
•
BASIC Stamp Programming Manual 1.9 • Parallax, Inc.
1: LCD User-Interface Terminal
bksp:
BASIC Stamp I Application Notes
if char > 13 then out
if char = 3 then clear
if char = 13 then cret
if char <> 8 then main
gosub back
let char = 32
gosub wr_LCD
gosub back
goto main
' Not a bksp or cr? Output character.
' Ctl-C clears LCD screen.
' Carriage return.
' Reject other non-printables.
' Send a blank to display
' Back up to counter LCD’s auto-
' increment.
' Get ready for another transmission.
' Change to instruction register.
' Move cursor left.
' Write instruction to LCD.
' Put RS back in character mode.
back:
low RS
let char = 16
gosub wr_LCD
high RS
return
low RS
let b3 = 1
gosub wr_LCD
high RS
goto main
1
clear:
' Change to instruction register.
' Clear the display.
' Write instruction to LCD.
' Put RS back in character mode.
' If a carriage return is received, wait for switch input from the user. The host
' program (on the other computer) should cooperate by waiting for a reply before
' sending more data.
cret:
let dirs = %01110000
' Change LCD data lines to input.
loop:
let keys = 0
if Sw_0 = 1 then xmit
' Add one for each skipped key.
let keys = keys + 1
if Sw_1 = 1 then xmit
let keys = keys + 1
if Sw_2 = 1 then xmit
let keys = keys + 1
if Sw_3 = 1 then xmit
goto loop
xmit:
serout S_out,N2400,(#keys,10,13)
let dirs = %01111111
' Restore I/O pins to original state.
goto main
Parallax, Inc. • BASIC Stamp Programming Manual 1.9
•
Page 75