Welkom bij WeetHet!


Managed Web Hosting by Liquid Web

Jouw IP adres:
18.217.60.167
     
 
Pagina printen
- kies Landscape
Zoeken in de
WeetHet pagina's
WeetHet is being updated! - Current articles will slowly move to www.tweaking4all.com
Voor uitstekende webhosting welke zowel betrouwbaar als betaalbaar is adviseren wij: LiquidWeb

Op deze pagina ...

De nu volgende serie pagina's gaan over de Parallax (OEM) Basic Stamp II microcontroller.

Aansturen van Hitachi 44780 gebaseerde LCD display's.

Tip: voor Mitsubishi 50530 gebaseerde LCD zie het Optrex 50652N artikel.

In dit artikel zal ik proberen uit te leggen hoe je een LCD display met de (OEM) Basic Stamp II aan kunt sturen, gebaseerd op een oud LCD scherm uit een Ericsson DBC661 telefoon of eigenlijk elke 44780 gebaseerde LCD. Voor sturing van zo een display met de PC zie de LCD Project pagina.

Foto's van het LCD in actie kun je hier bekijken.

De gebruikte LCD's zijn van het type OPTREX DMC2034 en DMC50400 welke 4 x 20 (4 lijnen, 30 karakters) hebben.
Dit artikel kan ook (in het engels) worden gedownload als een MS Word document.

Vergeet niet de verantwoordelijkheidsverklaring te lezen!
Parallax: Basic Stamp II

Overzicht

  1. Hoe verbind ik het LCD display met mijn OEM Basic Stamp 2
  2. Besturen - Sturen van karakters
  3. Besturen - Sturen van stuurcode's (instructies)
  4. Besturen - Initialiseren van het display
  5. Layout van de OPTREX DMC2034 en DMC50400
  6. Voorbeeld code: LCDDEMO1.BS2
  7. Voorbeeld code: WATCHDOG.BS2
  8. Voorbeeld code: WATCHDOG2.BS
  9. 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:

LCD Display pin LCD Functionaliteit OEM Basic Stamp 2 pin
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:

OEM Basic Stamp 2 pin
LCD Display pin
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:

Binaire waarde Doel / Toepassing
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:

Stap Actie Code (=binaire waarde)
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:

LCD print connector LCD functie
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:

Pin BasicStamp 2 pin LCD connector pin
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.

 

 


Je bent nu al op de nederlandstalige pagina's Click here to switch to the English pages