On this page ...
This serie of pages on this website will help you on your way with
the Parallax
(OEM) Basic Stamp II microcontroller.
Controlling a Hitachi 44780 based
LCD display.
Tip: for Mitsubishi
50530 based displays, read the Optrex
50652N article.
In this article I'll try to explain to you how to
control a LCD display with your (OEM) Basic Stamp II using an old
LCD panel from an Ericsson DBC661 phone or any 44780 based LCD for
that matter. For control using a PC see the LCD
Project page.
The LCD panels I used are the OPTREX DMC2034 and DMC50400
which I got out two defect Ericsson phones. These are 4 x 20 (4
lines, 20 characters) panels.
This article can be
downloaded as a MS Word document.
Pictures of the LCD
in action can be found here.
Don't forget the Disclaimer!
|
|
Overview
- How to connect the LCD panel to
your OEM Basic Stamp 2
- Getting Control - Sending characters
- Getting Control - Sending
instructions
- Getting Control - Initializing the
display
- Layout of the OPTREX DMC2034 and
DMC50400
- Example code: LCDDEMO1.BS2
- Example code: WATCHDOG.BS2
- Example code: WATCHDOG2.BS
- My mini-BOE (Board of Education)
How to connect
the LCD to you Basic Stamp II
Below you will find two tables, both containing identical
data, except the first one is the proper way to display the connection.
The second table is for the impatient and more experienced user showing
what to connect to what.
Make these connections:
1
|
Ground |
Vss (= GND) |
2
|
+5 Volt |
Vdd (= regulated +5V) |
3
|
Vee (LCD contrast) |
Vss (= GND) |
4
|
RS (Register Select) |
pin 4 |
5
|
R/W (Read/Write) |
Vss (= GND) |
6
|
E (Edge Enable) |
pin 5 |
7
|
DB0 (databit 0) |
not connected |
8
|
DB1 (databit 1) |
not connected |
9
|
DB2 (databit 2) |
not connected |
10
|
DB3 (databit 3) |
not connected |
11
|
DB4 (databit 4) |
pin 0 |
12
|
DB5 (databit 5) |
pin 1 |
13
|
DB6 (databit 6) |
pin 2 |
14
|
DB7 (databit 7) |
pin 3 |
The quick and dirty notation for the impatient (like
myself):
Vss (GND)
|
1 (GND), 3 (Vee), 5 (R/W)
|
Vdd (+5V)
|
2 (+5V)
|
pin 0
|
11 (DB4)
|
pin 1
|
12 (DB5)
|
pin 2
|
13 (DB6)
|
pin 3
|
14 (DB7)
|
pin 4
|
4 (RS)
|
pin 5
|
6 (E)
|
Note: the pin out is based on Jon's LCDDEMO1.BAS.
However this did not work for me due to two little mistakes in the LCD
connections (however: without it it would have taken me ages!).
- LCD_Pin4 and LCD_Pin14 should not be connected to
the same pin on the Basic Stamp.
- The data transmitted from the Basic Stamp using P0
P3 will not work, since P3 is not connected.
- DB0
DB3 do not need to be connected to GND
to work properly.
To make the ports work properly we need a little Pbasic
code:
Init: DirL = %00111111 ' set (lower 8) pins 0-5 as outputs
Outs = $0000 ' clear the pins
Getting Control
- Sending text
OK, so now we hooked to LCD up to our Basic Stamp 2.
How do we control a parallel controlled LCD panel by using only 6 wires?
The answer is actually pretty simple (thanks to Jon's
work): the LCD panel can be controlled using 8-bits or 4-bits. 4-bit mode
is working identical to 8-bit mode mode, however we transmit the upper
4 bits and the lower 4 bits in sequence instead of 8 bits parallel.
Practical example:
Say we would like to send the character 'A' which is
in binary code:
0100 0001 (hexadecimal $41, decimal 65).
First we send the upper 4 bits called a nibble (now
this will be confusing when you start with it, but you'll get used to
it). Second we send the lower 4 bits.
The upper 4 bits are in fact the first 4 bits in our binary representation:
0100 !!
The lower 4 bits are in fact the last 4 bits in our binary representation.
So this is what we send:
0100
0001
Which will result in a character 'A' on your LCD display.
This all sounds pretty hard to do, but be assured. The
Basic Stamp 2 has some neat routines that will help us with this task.
Let's say that a character uses the space of one byte
(=8 bits) and we define a variable for that purpose. In Pbasic that would
like this:
char VAR Byte ' character sent to LCD
Here we define the variable ('var'-statement)
called 'char' of type 'Byte'.
Pbasic offers a nice function for the byte: HIGHNIB (high nibble) and
LOWNIB (lower nibble). The statement shown below will return the upper
4-bits of the character:
OutA = char.HIGHNIB ' output high nibble
Similar, the next statement will output the lower 4
bits:
OutA = char.LOWNIB ' output lower nibble
To get read/write activity we just need to add a little
additional code to get a pulse to the 'E'-pin of the LCD panel, which
we connected to pin5 of the Basic Stamp 2, after sending the nibble. Once
more Pbasic shows it's power. Sending a simple 'high' (=1) to pin5 is
done with this little piece of:
PULSOUT 5, 1 ' strobe the Edge Enable line
To get the LCD to know that we are sending data (not
a instruction) we must raise the 'RS'-pin of the LCD high as well. Since
we leave RS high, you might wonder why we keep doing it, but that soon
will be clear once we implement a routine for sending instructions.
Setting RS high involves setting pin4 of the Basic Stamp 2 to high:
HIGH 4 ' goto write-character mode
That's it for sending characters. However that's not
enough to get the display operational. See the next paragraph for sending
instructions.
Below you will find the gosub-routine for sending characters:
' =-=-=-=-=-=-=-=-=-=-=-=
' Write ASCII char to LCD
' =-=-=-=-=-=-=-=-=-=-=-=
LCDwr:
OutA = char.HIGHNIB ' output high nibble
PULSOUT 5, 1 ' strobe the Enable line
OutA = char.LOWNIB ' output low nibble
PULSOUT 5, 1
HIGH 4 ' return to character mode
RETURN
Getting Control
- Sending instructions
Sending instructions is basically the same as sending
characters. The only difference is that pin4 (RS of the LCD) should be
LOW instead of HIGH. The LCD panel uses this to distinct between text
and instructions.
The only difference therefore is to set RS low:
LOW 4 ' enter command mode
Next step is to send the actual instruction. The instruction
however is basically a character, so we can use our 'LCDsendchar'
routine to send the instruction.
Our gosub-routine could look like this:
' =-=-=-=-=-=-=-=-=-=-=-=-
' Write instruction to LCD
' =-=-=-=-=-=-=-=-=-=-=-=-
LCDcmd: LOW RS ' enter command mode
LCDsendchar ' then write the character
What instructions are supported you might wonder.
Take a look at this table:
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
Clear display and return cursor to home position. |
0
|
0
|
0
|
0
|
0
|
0
|
1
|
X
|
Return cursor to home position.
The value of X does not matter. |
0
|
0
|
0
|
0
|
0
|
1
|
D
|
S
|
Entry mode.
Set cursor move directions and whether or not display can scroll.
D=1: cursor moves to the right
D=0: cursor moves to the left
S=1: scroll the cursor in the direction set by D when
the cursor is at the edge of the display. |
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
On/Off control.
D=1: display ON
D=0: display OFF
C=1: cursor (underscore) ON
C=0: cursor (underscore) OFF
B=1: blinking cursor ON
B=0: blinking cursor OFF |
0
|
0
|
0
|
1
|
S
|
R
|
X
|
X
|
Cursor/Shift control.
Move cursor or scroll display without changing display data.
S=1: scroll display
S=0: move cursor
R=1: to the right
R=0: to the left
The value of X does not matter. |
0
|
0
|
1
|
D
|
B
|
F
|
X
|
X
|
Function Settings.
Set interfacing data length, mode and font.
D=1: 8-bit interface
D=0: 4-bit interface
N=1: 1/16 duty (>1 line mode)
N=0: 1/8 or 1/11 duty (1 line mode)
F=1: 5x11 matrix font
F=0: 5x8 matrix font |
0
|
1
|
A
|
A
|
A
|
A
|
A
|
A
|
Set character RAM address.
For defining custom characters. |
1
|
A
|
A
|
A
|
A
|
A
|
A
|
A
|
Set display RAM address.
Used for quick repositioning cursor.
On 2 line models 1LAAAAAA L can be used to identify line.
Note: 4 line models have only 2 lines. Lines 1 and 3 are 1 single
line, and lines 2 and 4 are a single line!
AAAAAA can be interpreted as a 6 bit column number.
|
So now we can control the display a bit more
To keep your code readable, you might want to define some constants for
this purpose:
' LCD control characters
'
ClrLCD CON %00000001 ' clear the LCD
CrsrHm CON $00000010 ' move cursor to home position
CrsrLf CON $00010000 ' move cursor left
CrsrRt CON $00010100 ' move cursor right
DispLf CON $00011000 ' shift displayed chars left
DispRt CON $00011100 ' shift displayed chars right
DDRam CON $10000000 ' Display Data RAM control
So how do we use the instructions?
Well, having defined some constants, an gosub-routines
for writing characters and one instructions, things should work pretty
easy.
Practical example:
Let's clear the display:
Char = ClrLCD
GOSUB LCDcmd
Or let's move the cursor to the left:
Char = CrsrLf
GOSUB LCDcmd
You might think that's it, but it isn't. Before we can
do ANYTHING with the LCD display, we need to initialize it.
Generic Control
- Initializing the LCD
The gosub-routines we just defined are very useful for
this particular task: initializing the LCD display.
We need to keep in mind that the display must be initialized
in 4-bit mode. Using the reference manual of Hitachi, this should be the
way to do it:
1
|
Power ON |
-
|
2
|
Set 8-bit mode (yes) |
00000011
|
3
|
Set 8-bit mode (yes) |
00000011
|
4
|
Set 8-bit mode (yes) |
00000011
|
5
|
Set 4-bit mode |
00000010
|
6
|
Set duty mode* |
00101100
|
7
|
Display/Cursor/Blink OFF* |
00000000
|
8
|
Display/Cursor/Blink ON* |
00001111
|
9
|
Set input mode* |
00000110
|
* = Use instructions table to
customize to your needs
So what does the initialization look like in basic?
LCDini:
pause 50 ' 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
The official LCD FAQ and Hitachi documentation
mention al lot about the execution timing. Using the Basic Stamp 2 that
appears not be an issue.
OPTREX DMC2034
and DMC50400 - A 4x20 LCD layout
I used both these Optrex 4x20 LCD display-types, which
both use the Hitachi 44780 controller. The pin-layout of this display
is basic for all Hitachi-based LCD displays. The character layout of the
display is pretty basic for all 4x20 displays.
For 4x20 LCD's you will generally find two types of
layout, more recent displays support the layout you find below.
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
30
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
39
|
40
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
50
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
59
|
60
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
70
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
79
|
When filling the character positions, starting in the
upper left corner, the display will be filled starting in the upper left
corner and end in the lower right corner.
Older 4x20 LCD displays, like the Optrex I'm using,
have different line layout:
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
40
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
49
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
59
|
20
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
30
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
39
|
60
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
70
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
..
|
79
|
Notice that the lines 1 and 3 follow each other. Line
2 is followed by line 4. So basically when filling all character positions,
the lines will be filed in this order: line 1, line 3, line 2 and finally
line 4.
This makes it a bit harder to control the position of
the cursor on the LCD display. You can take a look at this gosub-routine
I wrote (see Example 3 for a demo) which uses the cursor repositioning
functionality of the display:
' ============================
' Write char at position (X,Y)
' ============================
' Usage:
' X=10 ' horizontal position or column (X)
' Y=2 ' vertical position or line (Y)
' char="A" ' character to write
' GOSUB LCDpos ' position cursor and write char
'
LCDpos:
char2=char ' Save char
char=CrsrHm ' Set cursor to home location
GOSUB LCDcmd
counter=%00000000 ' Reset counter (=position 0)
IF Y=1 THEN done ' 4x20: row1 starts at position 0
IF Y=2 THEN pos_row2
IF Y=3 THEN pos_row3
IF Y=4 THEN pos_row4
pos_row2: ' 4x20: row2 starts at position 64
counter=%01000000
GOTO position
pos_row3: ' 4x20: row3 starts at position 20
counter=%00010100
GOTO position
pos_row4: ' 4x20: row4 starts at position 84
counter=%01010100
GOTO position
position:
counter=counter+X-1 ' Add X to Y position minus 1 (pos 1 = 0)
char=%10000000+counter
GOSUB LCDcmd
done: char=char2 ' restore old char
GOSUB LCDwr ' and write it
RETURN
Hitachi 44780 Pin layout
Hitachi based LCD display have a very common connector
to the outer world:
1
|
GND |
2
|
+5 Volt |
3
|
Vee (LCD Drive) |
4
|
RS (Register Select) |
5
|
R/W (Read/Write) |
6
|
E (Edge Enabled) |
7
|
DB0 (data bit 0) |
8
|
DB1 (data bit 1) |
9
|
DB2 (data bit 2) |
10
|
DB3 (data bit 3) |
11
|
DB4 (data bit 4) |
12
|
DB5 (data bit 5) |
13
|
DB6 (data bit 6) |
14
|
DB7 (data bit 7) |
Example 1:
LCDDEMO1.BS2
This is an adapted version of Jon Williams (http://members.aol.com/jonwms)
his LCDDEMO1.BS2. It basically initializes the LCD display and sends a
text to the display over and over again (download here):
' -----[ Constants ]-------------------------------------------------------
' Ports used
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
' -----[ Variables ]-------------------------------------------------------
'
char VAR Byte ' character sent to LCD
index VAR Byte ' loop counter
' -----[ EEPROM Data ]-----------------------------------------------------
'
Msg DATA "BASIC Stamp 2 LCD in action" ' preload message
' -----[ 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
' -----[ Main Code ]-------------------------------------------------------
'
Start:
FOR index = 0 TO 39
READ Msg + index, char ' get character from memory
GOSUB LCDwr ' write it to the LCD
NEXT
PAUSE 1000 ' wait 2 seconds
char = ClrLCD ' clear the LCD
GOSUB LCDcmd
PAUSE 500
GOTO Start ' do it all over
' -----[ 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
Example 2: WATCHDOG.BS2
In this example a gauge is running up
and down using a routine to reposition the cursor on the display.
' -----[ Constants ]-------------------------------------------------------
' Ports used
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
' -----[ Variables ]-------------------------------------------------------
'
char VAR Byte ' character sent to LCD
char2 VAR Byte ' Duplicate character store
index VAR Byte ' loop counter
counter VAR Byte ' 2nd counter
X VAR Byte ' X position
Y VAR Byte ' Y position
'-----[ Initialization ]--------------------------------------------------
'
Init: DirL = %00111111 ' set pins 0-5 as outputs
Outs = $0000 ' clear the pins
'=================================
' STANDARD HITACHI 44780 4-BIT INIT
' =================================
LCDinit: pause 500 ' Wait for LCD 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=%00001100 ' 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
PAUSE 500
'-----[ Main Code ]-------------------------------------------------------
'
Start:
Y=2
FOR X=6 TO 15
char="0"+X-6
GOSUB LCDPos
NEXT
start2:
Y=1
char=255
FOR X=6 to 15
GOSUB LCDPos
pause 50
NEXT
char=" "
FOR X=6 to 15
GOSUB LCDPos
pause 50
NEXT
goto start2
'-----[ Subroutines ]----------------------------------------------------- ' ============================
' Write char at position (X,Y)
' ============================
' Usage:
' X=10 ' horizontal position or column (X)
' Y=2 ' vertikal position or line (Y)
' char="A" ' character to write
' GOSUB LCDpos ' position cursor and write char
' (note: this is the SLOW version! look at the next example for a better way!)
LCDpos:
char2=char ' Save char
char=CrsrHm ' Set cursor to home location
GOSUB LCDcmd
counter=0 ' Reset counter
IF Y=1 THEN position
IF Y=2 THEN pos_row2
IF Y=3 THEN pos_row3
IF Y=4 THEN pos_row4 pos_
row2: ' 4x20: row2 starts at position 40
counter=40
GOTO position
pos_row3: ' 4x20: row3 starts at position 20
counter=20
GOTO position
pos_row4: ' 4x20: row4 starts at position 60
counter=60
GOTO position
position: ' 4x20: row1 starts at position 0
counter=counter+X-1 ' Add X to Y position minus 1 (pos 1 = 0)
IF counter=0 THEN done ' work around the loop for pos (0,0)
for index=1 to counter ' move cursor x steps to the right
char=CrsrRt
GOSUB LCDcmd
NEXT
done:
char=char2 ' restore old char
GOSUB LCDwr ' and write it
RETURN
'=======================
' 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
Example 3: WATCHDOG2.BS
This example is similar to the previous example with
the difference to be found in the positioning routine, which is considerably
faster in this demo.
' -----[ Constants ]-------------------------------------------------------
' ports used
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
' -----[ Variables ]-------------------------------------------------------
'
char VAR Byte ' character sent to LCD
char2 VAR Byte ' Duplicate character store
index VAR Byte ' loop counter
counter VAR Byte ' 2nd counter
X VAR Byte ' X position
Y VAR Byte ' Y position
' -----[ Initialization ]--------------------------------------------------
'
Init: DirL = %00111111 ' set pins 0-5 as outputs
Outs = $0000 ' clear the pins
' =================================
' STANDARD HITACHI 44780 4-BIT INIT
' =================================
LCDinit: pause 500 ' Wait for LCD 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=%00001100 ' 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
PAUSE 500
' -----[ Main Code ]-------------------------------------------------------
'
Start:
Y=2
FOR X=6 TO 15
char="0"+X-6
GOSUB LCDPos
NEXT
start2:
Y=4
char=255
FOR X=6 to 15
GOSUB LCDPos
pause 50
NEXT
char=" "
FOR X=6 to 15
GOSUB LCDPos
pause 50
NEXT
goto start2
' -----[ Subroutines ]-----------------------------------------------------
' ============================
' Write char at position (X,Y)
' ============================
' Usage:
' X=10 ' horizontal position or column (X)
' Y=2 ' vertical position or line (Y)
' char="A" ' character to write
' GOSUB LCDpos ' position cursor and write char
' (this is the faster version - compared to example 2
LCDpos:
char2=char ' Save char
char=CrsrHm ' Set cursor to home location
GOSUB LCDcmd
counter=%00000000 ' Reset counter (=position 0)
IF Y=1 THEN done
IF Y=2 THEN pos_row2
IF Y=3 THEN pos_row3
IF Y=4 THEN pos_row4
pos_row2: ' 4x20: row2 starts at position 64
counter=%01000000
GOTO position
pos_row3: ' 4x20: row3 starts at position 20
counter=%00010100
GOTO position
pos_row4: ' 4x20: row4 starts at position 84
counter=%01010100
GOTO position
position: ' 4x20: row1 starts at position 0
counter=counter+X-1 ' Add X to Y position minus 1 (pos 1 = 0)
char=%10000000+counter
GOSUB LCDcmd
done:
char=char2 ' restore old char
GOSUB LCDwr ' and write it
RETURN
' =======================
' 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
My mini BOE - Board
Of Education
Here you will find what I did to create a so called
BOE (Board Of Education) for purposes like this (LCD testing).
BOM - Bill Of Materials
1x DIL 40 chip socket
1x Experimentation board
Some soldering stuff and some wire
First I mounted a regular chip-socket (DIL-40) which
I cut into two pieces. This will be used as a mount connector for the
OEM Basic Stamp 2 board.
Next I soldered to other part of the DIL-40 (only 8
pins of them) upside down on the board, so it would function as a socket
kind of thing. This socket I have numbered the pins of: pin 1 to 8 and
wired them to the OEM Basic Stamp 2 socket.
Next I wired the connections of the LCD panel to a connector
that fit's the socket I created for the LCD hookup;
1
|
Vss (GND) |
1, 3, 5
|
2
|
Vdd (+5V) |
2
|
3
|
Pin 0 (DB4) |
11
|
4
|
Pin 1 (DB5) |
12
|
5
|
Pin 2 (DB6) |
13
|
6
|
Pin 3 (DB7) |
14
|
7
|
Pin 4 (RS) |
4
|
8
|
Pin 5 (E) |
6
|
Pictures of this BOE can be found here.
|