' I2C_2X08.BAS = 2 Zeilen x 8 Zeichen; belegt sind 610 Basic Bytes; 0 Sys Bytes; 4 RAM Bytes ' LCD -Modul C0802-04 Fa. Pollin BestNr. 120622 ' abgeaendert von J Fenk Mi.09.01.13; Vorlage war Org_DHarlos EXTLCD.BAS ' -------------------------------------------------------------------------- ' LCD ueber I2C-Bus mittels Portexpander PCF8574 ansteuern ' In OCBASIC fuer Open-Micro, Open-Mini und Open-Midi von Dietmar Harlos. ' --------------------------------------------------------------------------- ' Das LCD ist mit dem PCF auf die gleiche Weise verbunden wie auf dem ' I2C-LCD von Conrad Electronic (Bestellnr. 198330). Eine kleine Platine ' fuer das LCD u. dem PCF8574 mit Verbindung an PTA4 (PORT[5], SCL) und ' PTA5 (PORT[6], SDA) der Open-Micro wurde auf einem Stueck Lochrasterplatine ' aufgebaut. ' ' PCF8574 | LCD Belegung ' ---------------------------------------------------------------------- ' P0 4 | DB4 11 \ ' P1 5 | DB5 12 \ die oberen 4 Bits ' P2 6 | DB6 13 / vom 8-Bit-Datenbus ' P3 7 | DB7 14 / ' P4 9 | R/W 5 -- Lesen (1) oder Schreiben (0) ' P5 10 | RS 4 -- Daten (1) oder Instruktion (0) uebermitteln ' P6 11 | EN 6 -- Daten bei fallender Flanke (1 nach 0) uebernehmen ' P7 12 | EN2 -- reserviert fuer 2. Enable-Leitung einiger LCDs ' --------------------------------------------------------------------------- INCLUDE "OMAC.DEF" 'OMACRO Include Datei vom 20.4.2010 'INCLUDE "om.def" 'Definitionen fuer Open-Micro und Open-Mini 'INCLUDE "omid.def" 'Definitionen fuer Open-Midi DEFINE a,b,c BYTE 'ein paar Variablen DEFINE temp BYTE 'fuer LCD-Routinen ' --------------------------------------------------------------------------- PRINT "I2C_2X08.BAS" PrintSpc=ON End2Host=ON lcd_cls lcd_init 'I2C-Bus initalisieren, PCF anmelden, lcd_cls ' LCD loeschen PAUSE 1 ' LCD initialisieren und loeschen ' 1. Zeile beschreiben lcd_writecmd &h80 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "I" '1 lcd_writechar "2" '2 lcd_writechar "C" '3 lcd_writechar "_" '4 lcd_writechar "2" '5 lcd_writechar "x" '6 lcd_writechar "0" '7 lcd_writechar "8" '8 ' 2. Zeile beschreiben lcd_writecmd &hc0 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "C" '1 lcd_writechar "0" '2 lcd_writechar "8" '3 lcd_writechar "0" '4 lcd_writechar "2" '5 lcd_writechar "-" '6 lcd_writechar "0" '7 lcd_writechar "4" '8 Pause 255 Pause 255 WHILE TRUE lcd_init 'I2C-Bus initalisieren, PCF anmelden, PAUSE 1 ' LCD initialisieren und loeschen FOR c=0 TO 255 STEP 16 ' ' 1. Zeile beschreiben lcd_writecmd &h80 'Kommando "Set DD-RAM address" zum LCD senden FOR a=c TO c+7 'da bei mir nur 8 Zeichen statt 20 muss 7 statt 19 eingetragen werden lcd_writechar a 'ein Zeichen zum LCD senden; es wird die Ordnungszahl NUmmer des ASCIIZeichens geschickt Print "Z1_a=";a 'fuer die Zahl 0 muss also ASCII = 48 gesendet werden Pause 25 NEXT a ' 2. Zeile beschreiben lcd_writecmd &hc0 'Kommando "Set DD-RAM address" zum LCD senden FOR a=c+8 TO c+15 ' da bei mir nur 8 Zeichen muss 8 statt 20 und c+15 statt 39 eingetragen werden lcd_writechar a 'ein Zeichen zum LCD senden Print "Z2_a=";a IF a=255 THEN GOTO Weiter ELSE ENDIF Pause 25 NEXT a NEXT c #Weiter Pause 255 i2c_stop 'schliesslich PCF vom I2C-Bus abmelden WEND END ' --------------------------------------------------------------------------- ' Die LCD-Routinen haben die gleiche Struktur wie auf der C-Control 1.1 ' --------------------------------------------------------------------------- PROCEDURE lcd_init 'Vorgeschriebene Verzoegerung fuer das LCD PAUSE 2 'I2C-Bus initialisieren i2c_init 'PCF ueber I2C-Bus aktivieren i2c_start IF NOT i2c_write(&h40) THEN 'I2C-Adresse vom PCF8574 PRINT "NACK" : END END IF '8-Bit-Modus aktivieren lcd_writecmd &h38 'mit 8-Bit-Command in 4-Bit-Modus umschalten i2c_write &b01000010 'EN auf high i2c_write &b00000010 'EN auf low 'ab jetzt 4-Bit-Modus lcd_writecmd &h28 lcd_writecmd &h0c 'LCD loeschen lcd_cls RETURN END PROCEDURE PROCEDURE lcd_cls lcd_writecmd &h02 lcd_writecmd &h01 RETURN END PROCEDURE ' Im folgenden wird die Assemblerroutine i2c_write per SYS- statt mit dem ' GOSUB-Befehl aufgerufen. Das spart einen Stackeintrag auf dem Aufruf-, ' bzw. GOSUB-Stack und ist etwas schneller. PROCEDURE lcd_writecmd (temp) SYS i2c_write (temp shr 4 or &b01000000) 'High-Nibble, EN auf high SYS i2c_write (temp shr 4 ) 'High-Nibble, EN auf low SYS i2c_write (temp and &h0f or &b01000000) ' Low-Nibble, EN auf high SYS i2c_write (temp and &h0f ) ' Low-Nibble, EN auf low RETURN END PROCEDURE PROCEDURE lcd_writechar (temp) SYS i2c_write (temp shr 4 or &b01100000) 'High-Nibble, EN auf high SYS i2c_write (temp shr 4 or &b00100000) 'High-Nibble, EN auf low SYS i2c_write (temp and &h0f or &b01100000) ' Low-Nibble, EN auf high SYS i2c_write (temp and &h0f or &b00100000) ' Low-Nibble, EN auf low RETURN END PROCEDURE ' --------------------------------------------------------------------------- ' Die I2C-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_i2c.pro" ' --------------------------------------------------------------------------- ' Die Firmware-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_fw.pro"