![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
> Hallo Robby! > > Anbei dass Listing meiner LCD-Display Ansteuerung. Du musst nur die Ports vom PCF anpassen, dann kannst Du die Routine auch für Deine Zwecke verwenden. > > Viel Erfolg... > LG Jens > > > ' --------------------------------------------------------------------------- > ' --- 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 "om.def" ' Betriebssystem Daten der Open-Micro laden > 'include "omid.def" ' Betriebssystem Daten der Open-Midi laden > ' --------------------------------------------------------------------------- > > ' --- 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 > define iii byte[5] ' Index für die Tabele > ' --- 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 > ' --------------------------------------------------------------------------- > > > ' --------------------------------------------------------------------------- > ' Die I2C-Routinen einbinden > ' --------------------------------------------------------------------------- > INCLUDE "om_i2c.pro" > > ' --------------------------------------------------------------------------- > ' Die Firmware-Routinen einbinden > ' --------------------------------------------------------------------------- > INCLUDE "om_fw.pro" Hallo Jens, erst mal vielen lieben Dank für die superschnelle Hilfe. Aber leider will es nicht funktionieren, irdendwas mache ich noch falsch. Technisch ist das LCD i.O. - an der C-Micro läuft es. An deinem Proggi habe ich die Ports entspechend dem Datenblatt geändert : ' --- definition der Variablen ---------------------------------------------- define PCF_Daten byte[1] ' Datensatz der zum PCF8574 übertragen wird define LCD_RS bit[6] ' PCF8574 Port6 org bit1 define LCD_R_W bit[5] ' PCF8574 Port5 org bit2 define LCD_Enabel bit[7] ' PCF8574 Port7 org bit3 define LCD_Licht bit[8] ' PCF8574 Port8 org bit4 define LCD_D4 bit[1] ' PCF8574 Port1 org bit5 define LCD_D5 bit[2] ' PCF8574 Port2 org bit6 define LCD_D6 bit[3] ' PCF8574 Port3 org bit7 define LCD_D7 bit[4] ' PCF8574 Port4 org bit8 Die Adresse 64 stimmt, es sind alle Jumper gesteckt. In der OM_I2C.pro habe ich die Ports geändert : ' --- Portdefinitionen ------------------------------------------------------ DEFINE SCL bPTB0 'PTB0 = PORT[9] DEFINE SDA bPTB1 'PTB1 = PORT[10] DEFINE I2CPORT PTA 'PORTA = BYTEPORT[1] DEFINE I2CDDR DDRA 'DDRA = BYTEPORT[1] Das Einzige was sich tut, im Terminalproggi kommen wirre Zeichen und [I/O_ERR] an. SCL und SDA sind high ( 4,51 Volt) und es tut sich da auch nichts, oder mein Messgerät ist zu lahm. Irgendwie verliere ich wohl dabei noch meine letzten 3 Haare :-) . Grüße, Robby und vielen Dank noch mal. |
Antwort schreiben |