... Moment, habe da noch was gefunden, ist zwar in OCBASIC und nutzt Assembler-Routinen als I2C, aber das müßte an den CCRP5 mit E-I2C anzupassen sein.
Viel Erfolg!
Code:
' ---------------------------------------------------------------------------
' --- LCD-Display Ansteuerung über den I2C-Bus - für OCBASIC ----------------
' --- erstellt am 11.09.2005 von Jens Gürtler -------------------------------
' ---------------------------------------------------------------------------
' Hardware:
' I2C-Bus SCL an Port 5
' I2C_Bus SDA an Port 6
' 2 Zeilen LCD-Display mit I2C-Ansteuerung
' Software:
' Das Programm steuert ein 2 Zeilen LCD-Display über einen PCF8574 an. Wenn
' ein 1-Zeiliges oder 4-Zeiliges LCD-Display verwendet werden, dann muss die
' Display-Initialisierung dem Display entsprechend angepasst werden. Die
' I2C-Bus Routine arbeitet mit Assambler und ist damit sehr schnell. Es
' werden 40 Zeichen in ca. 0,1 Sekunden auf dem Display wiedergegeben. Der
' ACK vom "Slave" wird im Programm nicht ausgewertet. Wenn der PCF8574 nicht
' wie beschrieben mit dem Display verdrahtet ist, muss Bit1 bis Bit8
' entsprechend angepasst werden.
'--- PCF8574 Port Belegung an LCD-Display -----------------------------------
' Port1 = RS LCD-Display
' Port2 = R/W LCD-Display
' Port3 = Enabel LCD-Display
' Port4 = Hintergrundbeleuchtung LCD-Display
' Port5 = D4 LCD-Display
' Port6 = D5 LCD-Display
' Port7 = D6 LCD-Display
' Port8 = D7 LCD-Display
'--- ASSCII Zeichensatz - (in Dezimalzahlen) --------------------------------
' Sonderzeichen
' =32 !=33 "=34 #=35 $=36 %=37 &=38 '=39 (=40 )=41 *=42 +=43 ,=44
' -=45 .=46 :=58 ;=59 <=60 ==61 >=62 ?=63 @=64 [=91 ]=93 ^=94 _=95
' ä=225 ß=226 ö=239 ü=245
' Zahlen
' 0=48 1=49 2=50 3=51 4=52 5=53 6=54 7=55 8=56 9=57 /=47
' Großbuchstaben
' A=65 B=66 C=67 D=68 E=69 F=70 G=71 H=72 I=73 J=74 K=75 L=76 M=77
' N=78 O=79 P=80 Q=81 R=82 S=83 T=84 U=85 V=86 W=87 X=88 Y=89 Z=90
' Kleinbuchstaben
' a=97 b=98 c=99 d=100 e=101 f=102 g=103 h=104 i=105 j=106 k=107 l=108 m=109
' n=110 o=111 p=112 q=113 r=114 s=115 t=116 u=117 v=118 w=119 x=120 y=121 z=122
'--- LCD-Display Befehlssatz - (in Dezimalzahlen) ---------------------------
' Befehle
' 1 = CLS - Display löschen
' 12 = Cursor aus und blinken aus
' 13 = Cursor aus und blinken ein
' 14 = Cursor ein und blinken aus
' 15 = Cursor ein und blinken ein
' Cursor Position im Display
' 128 = Zeile 1, Position 1 >>> 147 = Zeile 1, Position 20
' 192 = Zeile 2, Position 1 >>> 211 = Zeile 2, Position 20
' ---------------------------------------------------------------------------
' --- Betriebssystem konfigurieren ------------------------------------------
include "om06.inc" ' Betriebssystem Daten laden
pullupa = &b00110000 ' Schaltet die internen Pull-Up-Widerstaende an
' Port 5 & 6 ein. Dadurch müssen keine Externen
' Widerstände an SDA und SCL angeschlossen werden.
' ---------------------------------------------------------------------------
' --- definition der Ports --------------------------------------------------
define SCL port[5] ' externe Pull-Up-Widerstaende sind nicht unbedingt
define SDA port[6] ' notwendig, wenn interne Pull-Ups aktiviert sind
' --- definition der Variablen ----------------------------------------------
define PCF_Daten byte[1] ' Datensatz der zum PCF8574 übertragen wird
define LCD_RS bit[1] ' PCF8574 Port1
define LCD_R_W bit[2] ' PCF8574 Port2
define LCD_Enabel bit[3] ' PCF8574 Port3
define LCD_Licht bit[4] ' PCF8574 Port4
define LCD_D4 bit[5] ' PCF8574 Port5
define LCD_D5 bit[6] ' PCF8574 Port6
define LCD_D6 bit[7] ' PCF8574 Port7
define LCD_D7 bit[8] ' PCF8574 Port8
' ---------------------------------------------------------------------------
define Daten byte[2] ' LCD-Display Zeichensatz und Cursor Position
define D_bit1 bit[9] ' Zeichensatz Bit1
define D_bit2 bit[10] ' Zeichensatz Bit2
define D_bit3 bit[11] ' Zeichensatz Bit3
define D_bit4 bit[12] ' Zeichensatz Bit4
define D_bit5 bit[13] ' Zeichensatz Bit5
define D_bit6 bit[14] ' Zeichensatz Bit6
define D_bit7 bit[15] ' Zeichensatz Bit7
define D_bit8 bit[16] ' Zeichensatz Bit8
' ---------------------------------------------------------------------------
define Adresse byte[3] ' I2C-Bus Adresse
define ACK byte[4] ' I2C-Bus "ACK" vom Slave
' --- Voreinstellung und Initialisierung ------------------------------------
gosub i2c_init ' Initialisirung I2C-Bus
Adresse = 64 ' I2C Adresse vom PCF8574
gosub Display_init ' LCD-Display Initialisieren
LCD_Licht = on ' Hintergrundbeleuchtung ein
Display_Befehl 12 ' Cursor aus und blinken aus
' ---------------------------------------------------------------------------
' ---------------------------------------------------------------------------
' --- Hauptprogramm ---------------------------------------------------------
' ---------------------------------------------------------------------------
#programm_anfang
Display_Befehl 1 ' CLS - Display löschen
pause 50 ' 1 Sekunde Pause
Display_Zeichen "I" ' Zeichen I auf das Display schreiben
Display_Zeichen "2" ' Zeichen 2 auf das Display schreiben
Display_Zeichen "C" ' Zeichen C auf das Display schreiben
Display_Zeichen "-" ' Zeichen - auf das Display schreiben
Display_Zeichen "B" ' Zeichen B auf das Display schreiben
Display_Zeichen "u" ' Zeichen u auf das Display schreiben
Display_Zeichen "s" ' Zeichen s auf das Display schreiben
Display_Zeichen " " ' Zeichen auf das Display schreiben
Display_Zeichen "L" ' Zeichen L auf das Display schreiben
Display_Zeichen "C" ' Zeichen C auf das Display schreiben
Display_Zeichen "D" ' Zeichen D auf das Display schreiben
Display_Zeichen "-" ' Zeichen - auf das Display schreiben
Display_Zeichen "D" ' Zeichen D auf das Display schreiben
Display_Zeichen "i" ' Zeichen i auf das Display schreiben
Display_Zeichen "s" ' Zeichen s auf das Display schreiben
Display_Zeichen "p" ' Zeichen p auf das Display schreiben
Display_Zeichen "l" ' Zeichen l auf das Display schreiben
Display_Zeichen "a" ' Zeichen a auf das Display schreiben
Display_Zeichen "y" ' Zeichen y auf das Display schreiben
' ---------------------------------------------------------------------------
Display_Befehl 192 ' Display auf Zeile 2 Position 0
Display_Zeichen "m" ' Zeichen m auf das Display schreiben
Display_Zeichen "i" ' Zeichen i auf das Display schreiben
Display_Zeichen "t" ' Zeichen t auf das Display schreiben
Display_Zeichen " " ' Zeichen auf das Display schreiben
Display_Zeichen "d" ' Zeichen d auf das Display schreiben
Display_Zeichen "e" ' Zeichen e auf das Display schreiben
Display_Zeichen "r" ' Zeichen r auf das Display schreiben
Display_Zeichen " " ' Zeichen auf das Display schreiben
Display_Zeichen "O" ' Zeichen O auf das Display schreiben
Display_Zeichen "p" ' Zeichen p auf das Display schreiben
Display_Zeichen "e" ' Zeichen e auf das Display schreiben
Display_Zeichen "n" ' Zeichen n auf das Display schreiben
Display_Zeichen "-" ' Zeichen - auf das Display schreiben
Display_Zeichen "M" ' Zeichen M auf das Display schreiben
Display_Zeichen "i" ' Zeichen i auf das Display schreiben
Display_Zeichen "c" ' Zeichen c auf das Display schreiben
Display_Zeichen "r" ' Zeichen r auf das Display schreiben
Display_Zeichen "o" ' Zeichen o auf das Display schreiben
pause 200 ' 4 Sekunden Pause
goto programm_anfang
' ---------------------------------------------------------------------------
end
' ---------------------------------------------------------------------------
' ---------------------------------------------------------------------------
' --- LCD-Display Routine ---------------------------------------------------
' ---------------------------------------------------------------------------
#Display_init
' --- Initialisierung für den 4-Bit Modus - 2 Zeilen, 5x7 Font --------------
' ---------------------------------------------------------------------------
' Befehl | RS | R/W | DB7 | DB6 | DB5 | DB4 | Bemerkung
' ---------------------------------------------------------------------------
' Fun. Set | 0 | 0 | 0 | 0 | 1 | 0 | 4-Bit Datenlänge einschalten
' ---------------------------------------------------------------------------
' Fun. Set | 0 | 0 | 0 | 0 | 1 | 0 | 4_Bit - 2-Zeiliges Display,
' | 0 | 0 | 1 | 0 | 0 | 0 | 5x7 Font
' ---------------------------------------------------------------------------
' Display | 0 | 0 | 0 | 0 | 0 | 0 | Display ein, Cursor ein,
' on/off | 0 | 0 | 1 | 1 | 1 | 1 | Cursor blinken
' ---------------------------------------------------------------------------
' Clear | 0 | 0 | 0 | 0 | 0 | 0 | Display löschen, Cursor auf
' Display | 0 | 0 | 0 | 0 | 0 | 1 | 1.Spalte von 1.Zeile
' ---------------------------------------------------------------------------
' Entry | 0 | 0 | 0 | 0 | 0 | 0 | Cursor Auto-Increment
' Mode Set | 0 | 0 | 0 | 1 | 1 | 0 |
' ---------------------------------------------------------------------------
Display_Befehl &b00000010 ' Enabel off und 4-Bit Datenlänge einschalten
Display_Befehl &b00101000 ' 4-Bit 2-Zeiliges Display
Display_Befehl &b00001111 ' Display ein, Cursor ein, blinken ein
Display_Befehl &b00000001 ' CLS - Display löschen
Display_Befehl &b00000110 ' Cursor Auto-Increment
return
' ---------------------------------------------------------------------------
#Display_Befehl ' Befehlsebene - Curser setzen
Daten = Pop ' Datenzuweisung vom Rechenstack
LCD_RS = off : LCD_R_W = off ' Register auf Befehlsebene setzen
goto Display_loop ' interner Sprungpunkt
' ---------------------------------------------------------------------------
#Display_Zeichen ' Zeichenebene - Daten anzeigen
Daten = Pop ' Datenzuweisung vom Rechenstack
LCD_RS = on : LCD_R_W = off ' Register auf Daten Anzeige setzen
' ---------------------------------------------------------------------------
#Display_loop ' Aufteilung von "Daten" in den 4-Bit Modus
gosub i2c_start ' I2C-Bus starten
ACK = i2c_write(adresse) ' Adresse senden, ACK empfangen
LCD_D4 = D_bit5 : LCD_D5 = D_bit6 : LCD_D6 = D_bit7 : LCD_D7 = D_bit8 ' Daten Zuweisung
gosub Display_Pulse ' I2C Pulse und Daten übertragen
LCD_D4 = D_bit1 : LCD_D5 = D_bit2 : LCD_D6 = D_bit3 : LCD_D7 = D_bit4 ' Daten Zuweisung
gosub Display_Pulse ' I2C Pulse und Daten übertragen
gosub i2c_stop ' I2C-Bus stoppen
return
' ---------------------------------------------------------------------------
#Display_Pulse ' I2C Pulse und Daten übertragen
LCD_Enabel = on ' Enable = High
ACK = i2c_write(PCF_Daten) ' PCF8574 Einstellung zum Display senden, ACK empfangen
LCD_Enabel = off ' Enable = Low
ACK = i2c_write(PCF_Daten) ' PCF8574 Eindtellung zum Display senden, ACK empfangen
return
' ---------------------------------------------------------------------------
' ---------------------------------------------------------------------------
' --- I2C-Routinen fuer 100 kHz Bustakt einbinden ---------------------------
' ---------------------------------------------------------------------------
include "om_i2c.inc"
Gruß Dirk
Lesezeichen