![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
nun der Source Code für die OMICRO ' 03NE2004.bas by Josef Fenk josef.fenk@t-online.de Fr. 19.06.2020 ' belegt sind 820 Basic Bytes; 0 Sys Bytes; 1 RAM Bytes ' fuer LCD_2004 Board mit 4 Zeilen und 20 Spalten nach Arduino ' mit PCF8574T dessen Addresse h4e=b0100_1110 ' alle Ports geaendert auf diese Verdrahtung zwischen ' PCF8574 und LCD_2004 und alle Befehle folgerichtig angepasst ' bei lcd_init gegenber bisherigen OMICRO Programmcodes ' 8bit Modus statt h38 nun h30 eingebaut ' Vorlage basiert Org_DHarlos I2CLCD.BAS von 2006 ' im meinem Ordner O_MICRO//DH_DOWNL//I2CBUSR//PCF_8574/ ' -------------------------------------------------------------------------- ' LCD ueber I2C-Bus mittels Portexpander PCF8574T ansteuern ' In OCBASIC fuer Open-Micro, Open-Mini und Open-Midi ' --------------------------------------------------------------------------- ' hier die neue Belegung ' PCF8574 | LCD Belegung ' ---------------------------------------------------------------------- ' P0 4 | RS 4 -- Daten (1) oder Instruktion (0) uebermitteln ' P1 5 | R/W 5 -- Lesen (1) oder Schreiben (0) ' P2 6 | EN 6 -- Daten bei fallender Flanke (1 nach 0) uebernehmen ' P3 7 | LED_A 15-- Ansteuerung der Display Beleuchtung Anode ' P4 9 | DB4 11 \ ' P5 10 | DB5 12 \ die oberen 4 Bits ' P6 11 | DB6 13 / vom 8-Bit-Datenbus ' P7 12 | DB7 14 / ' --------------------------------------------------------------------------- ' PCF8574 Pin 12 11 10 09 07 06 05 04 ' PCF- Port P7 P6 P5 P4 P3 P2 P1 P0 ' LCD_2004 Port DB7 DB6 DB5 DB4 LED_A EN RW RS ' LCD_2004 Pins 14 13 12 11 15 6 5 4 INCLUDE "om.def" 'Definitionen fuer Open-Micro und Open-Mini 'INCLUDE "omid.def" 'Definitionen fuer Open-Midi DEFINE temp BYTE 'fuer LCD-Routinen ' --------------------------------------------------------------------------- PRINT "03NE2004.BAS" PrintSpc=ON End2Host=ON WHILE TRUE PRINT "nochmals" lcd_init 'I2C-Bus initalisieren, PCF anmelden,LCD initialisieren und loeschen Pause 1 '!!!ohne diese Pause wird LCD nicht beschrieben!!! ' 1. Zeile beschreiben lcd_writecmd &h80 'b1000_0000 Kommando "Set DD-RAM address" 'zum LCD senden lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" ' 2. Zeile beschreiben lcd_writecmd &hc0 'b1100_0000 Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" ' 3. Zeile beschreiben lcd_writecmd &h94 'b1001_0100 Set DD-RAM address" zum LCD senden lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" ' Pause 2 ' 4. Zeile beschreiben lcd_writecmd &hd4 'b1101_0100Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" i2c_stop Pause 100 WEND END ' --------------------------------------------------------------------------- ' Die LCD-Routinen sind angelehnt an die Struktur wie auf der C-Control 1.1 ' jedoch angepasst auf die vllig andere Verdrahtung dieser LCD Module ' --------------------------------------------------------------------------- PROCEDURE lcd_init 'I2C-Bus initialisieren i2c_init 'PCF ueber I2C-Bus aktivieren i2c_start 'hier unten !!! muss!!! die I2C-Addresse des benutzten Bausteins eingeben 'OMICRO Haupt I2C-Adresse PCF8574 h40==b0100_000 ==A2:A1:A0==0:0:0==0V 'diese LCD Module nach Arduino haben im Anlieferzustand folgende 'Addresse PCF8574T h4e==b0100_1110==b1000_1110==A2:A1:A0= jeweils 1==5V IF NOT i2c_write(&h4e) THEN 'diese Abfrage funktioniert nur bei OMICRO PRINT "NACK" : END 'nicht jedoch bei OMACRO END IF ' Belegung der LCD_2004 Pin/Ports zu PCF Pin/Ports ' PCF8574 Pin 12 11 10 09 07 06 05 04 ' PCF- Port P7 P6 P5 P4 P3 P2 P1 P0 ' LCD_2004 Port DB7 DB6 DB5 DB4 LED_A EN RW RS ' LCD_2004 Pins 14 13 12 11 15 6 5 4 ' Byte Wort High byte Low Byte ' RS=0==Command;RS=1==write character;RW immer auf 0== nur schreiben ' LED_A =1==schaltet LED ein, LED Stromaufnahme des Displays ca. 38 mA '8-Bit-Modus aktivieren lcd_writecmd &h30 '17.06.2020 neu,bisher alter stand &h38 '0b0011_1000 'statt h38 nun h30=0b0011_0000 eingebaut und 'funktioniert einwandfrei 'mit 8-Bit-Modus umschalten auf 4 Bit Modus i2c_write &b00101100 'data 0010= high byte;1100==LED_A EN RW RS i2c_write &b00101000 'EN auf low 'ab jetzt 4-Bit-Modus lcd_writecmd &h28 '2 Zeilen, 5x8 Font lcd_writecmd &h0c 'Display ein, Cursor aus, kein blinken lcd_cls 'LCD loeschen RETURN END PROCEDURE PROCEDURE lcd_cls lcd_writecmd &h02 '0000_0010 Cursor home / returm lcd_writecmd &h01 '0000_0001 Clear display 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 and &b11110000 or &b00001100) 'High-Nibble, EN auf high SYS i2c_write (temp and &b11110000 or &b00001000) 'High-Nibble, EN auf low SYS i2c_write (temp shl 4 or &b00001100) ' Low-Nibble, EN auf high SYS i2c_write (temp shl 4 or &b00001000) ' Low-Nibble, EN auf low RETURN END PROCEDURE PROCEDURE lcd_writechar (temp) SYS i2c_write (temp and &b11110000 or &b00001101) 'High-Nibble, EN auf high SYS i2c_write (temp and &b11110000 or &b00001001) 'High-Nibble, EN auf low SYS i2c_write (temp shl 4 or &b00001101) ' Low-Nibble, EN auf high SYS i2c_write (temp shl 4 or &b00001001) ' Low-Nibble, EN auf low RETURN END PROCEDURE ' -------------------------------------------------------------------------- ' Die I2C-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_i2c.pro" 'Addresse muss siehe oben eingetragen werden 'IF NOT i2c_write(&h4e) THEN ' PRINT "NACK" : END ' END IFbei A2:A1:A0==0:0:0 ' --------------------------------------------------------------------------- ' Die Firmware-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_fw.pro" und hier nun der Source Code für die OMACRO ' 1MAC2004.bas by Josef Fenk josef.fenk@t-online.de Fr. 19.06.2020 ' Source Code fuer OMACRO ' belegt sind 830 Basic Bytes; 0 Sys Bytes; 1 RAM Bytes ' funktioniert nun einwandfrei ' ' fuer LCD_2004 Board mit 4 Zeilen und 20 Spalten nach Arduino ' mit PCF8574T dessen Addresse h4e=b0100_1110 ' alle Ports geaendert auf diese Verdrahtung zwischen ' PCF8574 und LCD_2004 und alle Befehle folgerichtig angepasst ' bei lcd_init gegenber bisherigen OMICRO Programmcodes ' 8bit Modus statt h38 nun h30 eingebaut ' Code im LCD Teil entsprechend angepasst ' in OPTION//TOOLS//Basic Compiler//OCBASR.exe eingetragen ' Vorlage basiert Org_DHarlos I2CLCD.BAS von 2006 ' im meinem Ordner O_MICRO//DH_DOWNL//I2CBUSR//PCF_8574/ ' -------------------------------------------------------------------------- ' LCD ueber I2C-Bus mittels Portexpander PCF8574T ansteuern ' In OCBASIC fuer Open-MACRO ' --------------------------------------------------------------------------- ' hier die neue Belegung ' PCF8574 | LCD Belegung ' ---------------------------------------------------------------------- ' P0 4 | RS 4 -- Daten (1) oder Instruktion (0) uebermitteln ' P1 5 | R/W 5 -- Lesen (1) oder Schreiben (0) ' P2 6 | EN 6 -- Daten bei fallender Flanke (1 nach 0) uebernehmen ' P3 7 | LED_A 15-- Ansteuerung der Display Beleuchtung Anode ' P4 9 | DB4 11 \ ' P5 10 | DB5 12 \ die oberen 4 Bits ' P6 11 | DB6 13 / vom 8-Bit-Datenbus ' P7 12 | DB7 14 / ' --------------------------------------------------------------------------- ' PCF8574 Pin 12 11 10 09 07 06 05 04 ' PCF- Port P7 P6 P5 P4 P3 P2 P1 P0 ' LCD_2004 Port DB7 DB6 DB5 DB4 LED_A EN RW RS ' LCD_2004 Pins 14 13 12 11 15 6 5 4 INCLUDE "OMAC.DEF" 'Definitionen fuer OMACRO; Include Datei vom 20.4.2010 DEFINE temp BYTE 'fuer LCD-Routinen ' --------------------------------------------------------------------------- PRINT "03NE2004.BAS" PrintSpc=ON End2Host=ON WHILE TRUE PRINT "nochmals" lcd_init 'I2C-Bus initalisieren, PCF anmelden,LCD initialisieren und loeschen Pause 1 '!!!ohne diese Pause==> keine Anzeige, bitte beachten!!! ' 1. Zeile beschreiben lcd_writecmd &h80 'b1000_0000 Kommando "Set DD-RAM address" 'zum LCD senden lcd_writechar "L" lcd_writechar "C" lcd_writechar "D" lcd_writechar " " lcd_writechar "2" lcd_writechar "0" lcd_writechar "0" lcd_writechar "4" lcd_writechar " " lcd_writechar "2" lcd_writechar "0" lcd_writechar " " lcd_writechar "Z" lcd_writechar "e" lcd_writechar "i" lcd_writechar "c" lcd_writechar "h" lcd_writechar "e" lcd_writechar "n" lcd_writechar " " ' 2. Zeile beschreiben lcd_writecmd &hc0 'b1100_0000 Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "4" lcd_writechar " " lcd_writechar "S" lcd_writechar "p" lcd_writechar "a" lcd_writechar "l" lcd_writechar "t" lcd_writechar "e" lcd_writechar "n" lcd_writechar " " lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" ' 3. Zeile beschreiben lcd_writecmd &h94 'b1001_0100 Set DD-RAM address" zum LCD senden lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" ' Pause 2 ' 4. Zeile beschreiben lcd_writecmd &hd4 'b1101_0100Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" lcd_writechar "0" lcd_writechar "1" lcd_writechar "2" lcd_writechar "3" lcd_writechar "4" lcd_writechar "5" lcd_writechar "6" lcd_writechar "7" lcd_writechar "8" lcd_writechar "9" Pause 100 lcd_cls i2c_stop Pause 100 WEND END ' --------------------------------------------------------------------------- ' Die LCD-Routinen sind angelehnt an die Struktur wie auf der C-Control 1.1 ' jedoch angepasst auf die vllig andere Verdrahtung dieser LCD Module ' --------------------------------------------------------------------------- PROCEDURE lcd_init 'I2C-Bus initialisieren i2c_init 'PCF ueber I2C-Bus aktivieren i2c_start 'hier unten !!! muss!!! die I2C-Addresse des benutzten Bausteins eingeben 'OMICRO Haupt I2C-Adresse PCF8574 h40==b0100_000 ==A2:A1:A0==0:0:0==0V 'diese LCD Module nach Arduino haben im Anlieferzustand folgende 'Addresse PCF8574T h4e==b0100_1110==b1000_1110==A2:A1:A0= jeweils 1==5V '**** 20180913: neuer Code Teil, bei dem kein Fehler auftritt ************ IF i2c_write(&h4e)=0 THEN 'diese Abfrage funktioniert nur bei OMACRO PRINT "NACK" : END 'nicht jedoch bei OMICRO END IF ' Belegung der LCD_2004 Pin/Ports zu PCF Pin/Ports ' PCF8574 Pin 12 11 10 09 07 06 05 04 ' PCF- Port P7 P6 P5 P4 P3 P2 P1 P0 ' LCD_2004 Port DB7 DB6 DB5 DB4 LED_A EN RW RS ' LCD_2004 Pins 14 13 12 11 15 6 5 4 ' Byte Wort High byte Low Byte ' RS=0==Command;RS=1==write character;RW immer auf 0== nur schreiben ' LED_A =1==schaltet LED ein, LED Stromaufnahme des Displays ca. 38 mA '8-Bit-Modus aktivieren lcd_writecmd &h30 '17.06.2020 neu,bisher alter stand &h38 '0b0011_1000 'statt h38 nun h30=0b0011_0000 eingebaut und 'funktioniert einwandfrei 'mit 8-Bit-Modus umschalten auf 4 Bit Modus i2c_write &b00101100 'data 0010= high byte;1100==LED_A EN RW RS i2c_write &b00101000 'EN auf low 'ab jetzt 4-Bit-Modus lcd_writecmd &h28 '2 Zeilen, 5x8 Font lcd_writecmd &h0c 'Display ein, Cursor aus, kein blinken lcd_cls 'LCD loeschen RETURN END PROCEDURE PROCEDURE lcd_cls lcd_writecmd &h02 '0000_0010 Cursor home / returm lcd_writecmd &h01 '0000_0001 Clear display 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 and &b11110000 or &b00001100) 'High-Nibble, EN auf high SYS i2c_write (temp and &b11110000 or &b00001000) 'High-Nibble, EN auf low SYS i2c_write (temp shl 4 or &b00001100) ' Low-Nibble, EN auf high SYS i2c_write (temp shl 4 or &b00001000) ' Low-Nibble, EN auf low RETURN END PROCEDURE PROCEDURE lcd_writechar (temp) SYS i2c_write (temp and &b11110000 or &b00001101) 'High-Nibble, EN auf high SYS i2c_write (temp and &b11110000 or &b00001001) 'High-Nibble, EN auf low SYS i2c_write (temp shl 4 or &b00001101) ' Low-Nibble, EN auf high SYS i2c_write (temp shl 4 or &b00001001) ' Low-Nibble, EN auf low RETURN END PROCEDURE ' -------------------------------------------------------------------------- ' Die I2C-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_i2c.pro" 'Addresse muss siehe oben eingetragen werden 'IF NOT i2c_write(&h4e) THEN ' PRINT "NACK" : END 'END IFbei A2:A1:A0==0:0:0 ' --------------------------------------------------------------------------- ' Die Firmware-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_fw.pro" |
Antwort schreiben |