Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: I2C LCD Kategorie: Programmierung Basic (von Jens - 28.10.2005 17:48)
 Als Antwort auf Re: I2C LCD von Remy - 28.10.2005 16:55
Jens nutzt:  CC1-M-Unit V1.1, Micro, Open-Micro, Open-Mini
Hallo Remy

> Ich benutze den C-Control-1 M-Unit und M2-Unit und das Programm CCBasic

Jo, da kann ich Dir vielleicht weiterhelfen. Das nachfolgende Programm wurde für die Open-Micro geschrieben (es wird allso bei Dir nicht laufen). Als Compiler habe ich OCBAS (von Dietmar Harlos) verwendet. CCBasic und OCBasic sind 100% Syntaxkompatibel, nur das OCBasic wesendlich mehr kann (mehr Infos dazu findest Du auf der Info-Seite der OM - wenn es Dich interessiert).

Das Programm kann Dir aber zeigen wie es ganz einfach funktionieren kann, ohne das man einen großen "Ahnungsschein" haben muss. Mit Byte[1] wird die Pinbelegung des PCF8574 festgelegt. Du brauchst allso nur die die Bits 1 bis 8 an Deinen PDF8574 anpassen - fertig. (Die jetzige Pinbelegung entspricht dem I2C-Bus-Modul von CCTools.) Byte[2] habe ich auch in einzelne Bits zerlegt und kann so den "4-Bit-Modus" vom Display ganz einfach dem I2C-Bus zuweisen. Wenn Du deine I2C-Bus-Routine (an stelle der jetzigen) einbindest, sollte das Programm bei Dir auch laufen.

Diese Variante ist mit sicherheit nicht die eleganteste, aber ich hoffe Du kannst so die Zusammenhänge erkennen...

JG 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 "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"




 Antwort schreiben

Bisherige Antworten: