Op deze pagina ...
Overzicht
- Hoe verbind ik het LCD display
met mijn OEM Basic Stamp 2
- Besturen - Sturen van karakters
- Besturen - Sturen van
stuurcode's (instructies)
- Besturen - Initialiseren van het
display
- Layout van de OPTREX DMC2034 en
DMC50400
- Voorbeeld code: LCDDEMO1.BS2
- Voorbeeld code: WATCHDOG.BS2
- Voorbeeld code: WATCHDOG2.BS
- Mijn mini-BOE (Board of Education)
Hoe verbind
ik het LCD met de Basic Stamp II
Hieronder zie je hoe je dat moet doen. Ik heb daarvoor
2 tabellen gemaakt, tabel 1 met de correcte weergave van gegevens en tabel
2 voor de ongeduldigen onders ons (net als ik dus).
Maak de volgende verbindingen:
1
|
Aarde |
Vss (= Aarde) |
2
|
+5 Volt |
Vdd (= regulated +5V) |
3
|
Vee (LCD contrast) |
Vss (= Aarde) |
4
|
RS (Register Select) |
pin 4 |
5
|
R/W (Read/Write) |
Vss (= Aarde) |
6
|
E (Edge Enable) |
pin 5 |
7
|
DB0 (databit 0) |
niet verbonden |
8
|
DB1 (databit 1) |
niet verbonden |
9
|
DB2 (databit 2) |
niet verbonden |
10
|
DB3 (databit 3) |
niet verbonden |
11
|
DB4 (databit 4) |
pin 0 |
12
|
DB5 (databit 5) |
pin 1 |
13
|
DB6 (databit 6) |
pin 2 |
14
|
DB7 (databit 7) |
pin 3 |
De snelle manier voor de ongeduldigen onder ons:
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)
|
Merk op: de pin out is gebaseerd op Jon
z'n LCDDEMO1.BAS. Het oorspronkelijke schema van Jon werkt echter niet
(maar heeft me wel heel goed op weg geholpen) en wel om de volgende redenen:
- LCD_Pin4 en LCD_Pin14 zijn in zijn schema met elkaar
verbonden aan dezelfde pin op de Basic Stamp.
- De verstuurde data transmitted van de Basic Stamp
gebruikt P0 t/m P3, maar de data van P3 zal nooit aankomen - hij is
immers helemaal niet aangesloten.
- DB0
DB3 mogen niet aan aarde zitten (bij de
Optrex LCD's).
In PBasic kunnen we de poorten (P0 ... P5) als volgt
activeren voor output:
Init: DirL = %00111111 ' set (lower 8) pins 0-5 as outputs
Outs = $0000 ' clear the pins
Besturen -
Tekst sturen
OK, het display zit nu aan onze Basic Stamp 2. Hoe besturen
we nu de parallel aangestuurde lijnen naar het LCD scherm met maar 6 lijnen?
Het antwoord is eigenlijk eenvoudig (met dank aan Jon):
het LCD scherm kan met 8- of 4-bits aangestuurd worden. 4-bit mode werkt
hetzelfde als de 8-bit mode mode, met het verschil dat we de 8-bits in
2 stappen van 4-bits versturen. Eerst sturen de 4 hoge bits, dan de 4
lage bits.
Praktisch voorbeeld:
Stel we willen de letter 'A' sturen. Dat is in binaire
code:
0100 0001 (hexadecimaal $41, decimaal 65).
Als eerste moeten we de bovenste 4 bits (4 bits = nibble,
8 bits = byte) sturen (ik weet dat het wat verwarrend kan werken, maar
daar wen je vanzelf aan), gevolgd door de 4 lage bits.
De 4 hoge bits zijn in feite de eerste (!) 4 bits in ons binaire getal:
0100 !!
De 4 lage bits zijn de 4 laatste bits. We sturen dus:
0100
0001
Dit resulteerd in een 'A' op het LCD display.
Dit ziet er allemaal erg moeilijk uit maar met behulp
van wat gosub-routines lossen we dit eenvoudig op.
Stel een karakter neemt een byte in beslag (=8 bits)
en we hebben daarvoor een variable gedefinieerd. In Pbasic ziet dat er
als volgt uit:
char VAR Byte ' character sent to LCD
Hier definieren we de variable ('var'-statement)
genaamd 'char' van het type 'Byte'.
Pbasic heeft wat leuke hulpmiddelen voor het werken met bytes: HIGHNIB
(high nibble) en LOWNIB (lower nibble). Het volgende commando levert de
4 hoge bits van de byte op:
OutA = char.HIGHNIB ' output high nibble
Soortgelijk zien we dat voor de 4 lage bits:
OutA = char.LOWNIB ' output lower nibble
Om het display nu te laten weten dat we iets verstuurd
hebben zullen we de 'E'-pin van het LCD display kort hoog moeten maken.
We hebben deze aan pin5 van de Basic Stamp 2 gemaakt. Hier zien we weer
een sterke kan van PBasic. Het simpelweg sturen van een 'hoog' (=1) naar
pin5 doet men als volgt:
PULSOUT 5, 1 ' strobe the Edge Enable line
Om aan te geven aan het display dat we data sturen,
en niet een instructie (!), zullen we de 'RS'-pin van het display hoog
moeten zetten. Het verschil met de vorige pin is dat we deze nu hoog laten.
Waarom we dat doen zien we straks. In PBasic ziet dat er als volgt uit:
HIGH 4 ' goto write-character mode
Dat is alles wat we moeten doen om een enkele karakter
naar biten te sturen. Om nu een hoop geheugen en vooral type werk te besparen
hebben we een kleine subroutine gemaakt.
Hier vind je de gosub-routine voor het versturen van
karakters:
' =-=-=-=-=-=-=-=-=-=-=-=
' 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
Besturen
- Sturen van stuurcode's (instructies)
Het sturen van instructies is eigenlijk hetzelfde als
het sturen van een karakter met als verschil dat we nu pin4 (RS van het
display) LAAG moeten brengen i.p.v. HOOG. Het LCD display gebruikt dit
om onderscheid te maken tussen karakter (tekst) en stuurcode (instructie).
Het LAAG zetten van de RS-pin is ook weer simpel:
LOW 4 ' enter command mode
Nu we weten hoe we een instructie kunnen versturen,
zullen we natuurlijk moeten weten WAT voor instructies we kunnen versturen.
Met behulp van de volgende gosub-routine kunnen we dat doen:
' =-=-=-=-=-=-=-=-=-=-=-=-
' Write instruction to LCD
' =-=-=-=-=-=-=-=-=-=-=-=-
LCDcmd: LOW RS ' enter command mode
LCDsendchar ' then write the character
De beschikbare instructies vind je hier:
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
Scherm wissen en de cursor links bovenaan zetten. |
0
|
0
|
0
|
0
|
0
|
0
|
1
|
X
|
Zet de cursor links bovenaan .
De waarde van X is niet relevant. |
0
|
0
|
0
|
0
|
0
|
1
|
D
|
S
|
Invoer mode.
Stel de cursor bewegingsrichting en of het display mag verschuiven
hier in.
D=1: cursor beweegt naar rechts
D=0: cursor beweegt naar links
S=1: verschuif het scherm in richting 'D' als de cursor de rand van
het scherm raakt (0=niet verschuiven) |
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
Aan/Uit controle.
D=1: display AAN
D=0: display UIT
C=1: cursor AAN
C=0: cursor UIT
B=1: knipperen cursor AAN
B=0: knipperen cursor UIT |
0
|
0
|
0
|
1
|
S
|
R
|
X
|
X
|
Cursor/Schuif Controle.
Verplaats de cursor of scroll het display zonder display data te veranderen.
S=1: scroll display
S=0: verplaats cursor
R=1: rechts
R=0: links
De waarde van X is niet relevant. |
0
|
0
|
1
|
D
|
B
|
F
|
X
|
X
|
Functie Instelling.
Instellen van de interface data lengte, mode en lettertype.
D=1: 8-bit interface
D=0: 4-bit interface
N=1: 1/16 duty (>1 regel mode)
N=0: 1/8 of 1/11 duty (1 regel mode)
F=1: 5x11 matrix font
F=0: 5x8 matrix font |
0
|
1
|
A
|
A
|
A
|
A
|
A
|
A
|
Selecteer karakter RAM adres.
Voor definieren van eigen karakters. |
1
|
A
|
A
|
A
|
A
|
A
|
A
|
A
|
Selecteer display RAM adres.
Voor het snel verplaatsen van de cursor.
Bij een 2 regel display kan in 1LAAAAAA L gebruikt worden
om regel nummer aan te geven.
Merk op: 4 regel displays hebben in feite maar 2 regels. Regel 1 en
3 vormen een regel en regel 2 en 4 vormen een regel.
AAAAAA kan eventueel gezien worden als een 6 bit kolom nummer.
|
We weten nu wat meer over controle van het display
Om de code leesbaar te houden zou je wat constanten kunnen voordefinieren:
' 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
Hoe gebruiken we nou deze instructies?
Uitgaande van de voor gedefinieerd waarde wordt dat
relatief eenvoudig:
Praktisch voorbeeld:
Scherm wissen:
Char = ClrLCD
GOSUB LCDcmd
Cursor 1 stap naar links verplaatsen:
Char = CrsrLf
GOSUB LCDcmd
Nu zou je kunnen denken dat je er bent, niets is minder
waar. Het display moet namelijk na het aanzetten geinitialiseerd worden.
Besturen - Initialiseren
van het LCD display
De gosub-routines die we hiervoor gedefineerd hebben
zijn nu erg handig voor het initialiseren van het LCD display.
Vergeet niet dat we in 4-bit mode moeten werken. Gebaseerd
op de handleiding van Hitachi, zou dit in de volgende stappen gedaan moeten
worden:
1
|
Stroom AAN |
-
|
2
|
Set 8-bit mode (ja) |
00000011
|
3
|
Set 8-bit mode (ja) |
00000011
|
4
|
Set 8-bit mode (ja) |
00000011
|
5
|
Set 4-bit mode |
00000010
|
6
|
Set duty mode* |
00101100
|
7
|
Display/Cursor/Knipperen UIT* |
00000000
|
8
|
Display/Cursor/Knipperen AAN* |
00001111
|
9
|
Set invoer mode* |
00000110
|
* = Gebruik bovenstaande tabel
voor eigen aanvullingen
Hoe ziet dit er nou in PBasic uit?
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
Zowel de LCD FAQ als de handleiding van
Hitachi spreekt veel over de uitvoer tijd: bij de Basic Stamp maakt dit
blijkbaar niets uit.
OPTREX DMC2034
en DMC50400 - Een 4x20 LCD layout
Ik heb gebruik gemaakt van de Optrex 4x20 LCD display-types,
met beiden een Hitachi 44780 controller. De pin-layout van dergelijke
display is standaard voor alle Hitachi-gebaseerde LCD displays. Dat geldt
ook voor de LCD karakter layout.
Voor 4x20 LCD's zie je in het algemeen 2 soorten layouts,
de recentere display hebben het volgende display layout:
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
|
Als je karakters blijft sturen, start links boven in
de hoek, dan wordt alles netjes in aangegeven volgorde gevuld en eindig
je rechts onder.
Oudere 4x20 LCD displays, zoals mijn Optrex werken net
even anders:
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
|
Merk op dat hier de lijnen 1 en 3 een enkele regel vormen.
Zo vormen de regels 2 en 4 ook een enkele regel. Bij het vullen van het
scherm wordt dus eerst regel 1, dan regel 3, dan regel 2 en uiteindelijk
regel 4 gevuld.
Een voorbeeld hoe je daar mee om kunt gaan zie je hier
(zie ook de demo's):
' ============================
' 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
Pin layout Hitachi 44780
Hitachi gebaseerde LCD display hebben een standaard
aansluiting naar de buyitenwereld:
1
|
GND / Aarde |
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) |
Voorbeeld
1: LCDDEMO1.BS2
Dit is een aanpassing op de code van Jon Williams (http://members.aol.com/jonwms)
zijn LCDDEMO1.BS2. Het initialiseerd het display en stuurt (herhaaldelijk)
een tekst naar het display (download hier):
' -----[ 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
Voorbeeld
2: WATCHDOG.BS2
In dit voorbeeld laat ik een balkje op-en-neer
lopen, een aardige demo hoe je de cursor kunt sturen (de volgende demo
doet dat veel beter).
' -----[ 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
Voorbeeld
3: WATCHDOG2.BS
Dit voorbeelddoet hetzelfde als het voorgaande voorbeel
maar door beter sturing van de cursor positie is deze beter en vooral
sneller.
' -----[ 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
Mijn mini BOE -
Board Of Education
Hier zie je hoe ik de zogenaamde mini BOE (Board Of
Education) gebouwd heb voor test doeleinden.
Onderdelen
1x DIL 40 chip voetje
1x Experimenteer board
Soldeertin en wat draad
Als eerste heb ik het IC-voetje over de lengte doorgezaagd
zodat ik een mooi voetje had voor het plaatsen van het OEM Basic Stamp
2 printje.
De tweede helft heb ik gebruikt om een stekker te maken
voor de aansluitingen van het display. Ik heb deze aan de onderkant van
het printje gesoldeerd zodat de pinnen aan de andere kant van het experimeteerboard
uitsteekt. Deze pinnen heb ik vervolgens genummerd (8 in totaal) en aan
de connector voor de OEM Basic Stamp 2 gemaakt en wel als volgt:
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
|
Op de foto pagina
kun je een afbeelding zien van hoe het e.e.a. eruit ziet.
|