MikroForth LCD mit I2C
Verfasst: Mo 14. Jan 2013, 19:39
Heute möchte ich eine LCD-Ansteuerung über I2C vorstellen.
Die LCD-Anzeige ist dabei über ein bei Pollin erhältliches LCD-I2C Adaptermodul mit PCF8574P angeschlossen.
Es sind zwei neue Forth (A) Worte hinzugekommen.
swapnibble (b1b2 --- b2b1) tauscht unteres gegen oberes Halbbyte b1 b2
_zero (a1a2a3 --- a1a2a3) entfernt führende Nullen (a3,a2) durch Ersatz mit Leerzeichen (ASCII 32) a1,a2,a3 --> ASCII Zeichen
Forth Programm:
Forth-Wörter:
: lcdsend i2cstart 78 i2cwrite drop i2cwrite drop i2cstop ;
: lcdenable dup 64 or lcdsend 191 and lcdsend ;
: lcdcommand dup swapnibble 15 and dup lcdsend lcdenable 15 and dup lcdsend lcdenable ;
: lcddata dup swapnibble 15 and 16 or dup lcdsend lcdenable 15 and 16 or dup lcdsend lcdenable ;
: lcdinit 1 wait 3 1 do 3 dup lcdsend lcdenable loop 2 dup lcdsend lcdenable 40 lcdcommand 12 lcdcommand 6 lcdcommand ;
: lcdclear 1 lcdcommand ;
: lcdhome 2 lcdcommand ;
: blein 127 lcdsend ;
: blaus 128 lcdsend ;
: Ausgabe 3 1 do lcddata loop ;
: lcdnum 3 1 do 10 / 48 + swap loop drop _zero ;
: .S stackcount 40 lcddata 48 + lcddata 41 lcddata ;
: Locate 128 + swap 64 * 65 - + lcdcommand ;
Hauptprogramm:
: main blein lcdinit lcdclear lcdhome 255 0 do 1 5 locate i lcdnum ausgabe 2 14 locate .S loop 10 wait blaus end ;
Erlauterung der Befehle:
lcdsend (B -- ) sendet ein Byte zur LCD-Anzeige über I2C (78 ist in diesem Fall die Adresse des Adaptermoduls) kann geändert werden,
lcdenable (B -- ) sendet den Enableimpuls für die LCD-Anzeige über I2C (B - Byte vom vorherigem lcdsend),
lcdcommand (C -- ) splittet das Kommandobyte C in oberes und unteres Nipple auf und sendet es über I2C zur Anzeige (Kommandobyte siehe Datenblatt
der LCD-Anzeige R/S=0),
lcddata (D -- ) splittet das Datenbyte D in oberes und unteres Nipple auf und sendet es über I2C zur Anzeige (R/S=1),
lcdinit ( -- ) initialisiert die LCD Anzeige (in diesem Fall 4-Bitmodus, 2-zeilig, Curser-aus, Blinken-aus) aus Datenblatt der LCD ersichtlich,
lcdclear ( -- ) löscht die LCD-Anzeige,
lcdhome ( -- ) setz den Curser auf Zeile 1 Spalte 1,
blein ( -- ) schaltet die Hintergrundbeleuchtung ein,
blaus ( -- ) schaltet die Hintergrundbeleuchtung aus,
Ausgabe (abc -- ) gibt die obersten drei Byte vom Stack aus,
lcdnum (z -- A1A10A100) wandelt eine Zahl z (Byte) in 3 ASCII-Zeichen (3 Byte) um,
.S ( -- ) gibt die Stacktiefe in Form von (Z) aus,
locate (zs -- ) setzt den Curser auf Zeile,Spalte,
Hauptprogramm (main):
1. Hintergrundbeleuchtung einschalten
2: LCD initialisieren
3: LCD löschen
4. Curser auf Zeile 1, Spalte1 setzen
5. eine Schleife von 0 bis 255 beginnen
6. Curser auf Zeile 1 Spalte 5 setzen
7. Schleifenindex i holen
8. Schleifenindex in ASCII umwandeln, führende Nullen ausblenden
9. auf LCD ausgeben
10. Curser auf Zeile 2 Spalte 14 setzen
11. Stacktiefe ausgeben
12. Schleife wiederholen bis 255
13. 10 Sekunden warten
14. Hintergrundbeleuchtung ausschalten
15. Ende
Die Initialisierung der LCD-Anzeige funktioniert mit einem 2-zeiligen LCD sowie einem 1-zeiligen LCD (16 Zeichen).
Bei manchem 1-zeiligen LCD's müssen die Stellen 9 bis 16 mit 2 1 locate bis 2 8 locate addressiert werden.
Leider weiss ich nicht wie und ob ich hier eine Datei anhängen kann, dann könnte ich die entsprechende forthvok.vok anhängen.
Momentan kann ich sie per E-Mail versenden. Bitte bei mir melden. (dieterhaeussler@freenet.de)
Die LCD-Anzeige ist dabei über ein bei Pollin erhältliches LCD-I2C Adaptermodul mit PCF8574P angeschlossen.
Es sind zwei neue Forth (A) Worte hinzugekommen.
swapnibble (b1b2 --- b2b1) tauscht unteres gegen oberes Halbbyte b1 b2
_zero (a1a2a3 --- a1a2a3) entfernt führende Nullen (a3,a2) durch Ersatz mit Leerzeichen (ASCII 32) a1,a2,a3 --> ASCII Zeichen
Forth Programm:
Forth-Wörter:
: lcdsend i2cstart 78 i2cwrite drop i2cwrite drop i2cstop ;
: lcdenable dup 64 or lcdsend 191 and lcdsend ;
: lcdcommand dup swapnibble 15 and dup lcdsend lcdenable 15 and dup lcdsend lcdenable ;
: lcddata dup swapnibble 15 and 16 or dup lcdsend lcdenable 15 and 16 or dup lcdsend lcdenable ;
: lcdinit 1 wait 3 1 do 3 dup lcdsend lcdenable loop 2 dup lcdsend lcdenable 40 lcdcommand 12 lcdcommand 6 lcdcommand ;
: lcdclear 1 lcdcommand ;
: lcdhome 2 lcdcommand ;
: blein 127 lcdsend ;
: blaus 128 lcdsend ;
: Ausgabe 3 1 do lcddata loop ;
: lcdnum 3 1 do 10 / 48 + swap loop drop _zero ;
: .S stackcount 40 lcddata 48 + lcddata 41 lcddata ;
: Locate 128 + swap 64 * 65 - + lcdcommand ;
Hauptprogramm:
: main blein lcdinit lcdclear lcdhome 255 0 do 1 5 locate i lcdnum ausgabe 2 14 locate .S loop 10 wait blaus end ;
Erlauterung der Befehle:
lcdsend (B -- ) sendet ein Byte zur LCD-Anzeige über I2C (78 ist in diesem Fall die Adresse des Adaptermoduls) kann geändert werden,
lcdenable (B -- ) sendet den Enableimpuls für die LCD-Anzeige über I2C (B - Byte vom vorherigem lcdsend),
lcdcommand (C -- ) splittet das Kommandobyte C in oberes und unteres Nipple auf und sendet es über I2C zur Anzeige (Kommandobyte siehe Datenblatt
der LCD-Anzeige R/S=0),
lcddata (D -- ) splittet das Datenbyte D in oberes und unteres Nipple auf und sendet es über I2C zur Anzeige (R/S=1),
lcdinit ( -- ) initialisiert die LCD Anzeige (in diesem Fall 4-Bitmodus, 2-zeilig, Curser-aus, Blinken-aus) aus Datenblatt der LCD ersichtlich,
lcdclear ( -- ) löscht die LCD-Anzeige,
lcdhome ( -- ) setz den Curser auf Zeile 1 Spalte 1,
blein ( -- ) schaltet die Hintergrundbeleuchtung ein,
blaus ( -- ) schaltet die Hintergrundbeleuchtung aus,
Ausgabe (abc -- ) gibt die obersten drei Byte vom Stack aus,
lcdnum (z -- A1A10A100) wandelt eine Zahl z (Byte) in 3 ASCII-Zeichen (3 Byte) um,
.S ( -- ) gibt die Stacktiefe in Form von (Z) aus,
locate (zs -- ) setzt den Curser auf Zeile,Spalte,
Hauptprogramm (main):
1. Hintergrundbeleuchtung einschalten
2: LCD initialisieren
3: LCD löschen
4. Curser auf Zeile 1, Spalte1 setzen
5. eine Schleife von 0 bis 255 beginnen
6. Curser auf Zeile 1 Spalte 5 setzen
7. Schleifenindex i holen
8. Schleifenindex in ASCII umwandeln, führende Nullen ausblenden
9. auf LCD ausgeben
10. Curser auf Zeile 2 Spalte 14 setzen
11. Stacktiefe ausgeben
12. Schleife wiederholen bis 255
13. 10 Sekunden warten
14. Hintergrundbeleuchtung ausschalten
15. Ende
Die Initialisierung der LCD-Anzeige funktioniert mit einem 2-zeiligen LCD sowie einem 1-zeiligen LCD (16 Zeichen).
Bei manchem 1-zeiligen LCD's müssen die Stellen 9 bis 16 mit 2 1 locate bis 2 8 locate addressiert werden.
Leider weiss ich nicht wie und ob ich hier eine Datei anhängen kann, dann könnte ich die entsprechende forthvok.vok anhängen.
Momentan kann ich sie per E-Mail versenden. Bitte bei mir melden. (dieterhaeussler@freenet.de)