• Keine Ergebnisse gefunden

Tastatur- und LC-Display-Ansteuerung mit PCF8574

Inter-IC-Bus-Komponenten

9.3 Tastatur- und LC-Display-Ansteuerung mit PCF8574

9.3.1 Philips 8-Bit-I/O-Erweiterung PCF8574

Beim PCF8574-Baustein handelt es sich um eine 8-Bit-I/O-Erweiterung f¨ur den I2C-Bus. Der Chip wird mit 5 V betrieben und liefert einen Strom von 20 mA je Ausgang. Hiermit k¨onnen bspw. LEDs direkt angesteuert werden.

Es stehen die zwei Varianten 8574 und 8574A zur Verf¨ugung, die sich durch unterschiedliche hartkodierte Adressmuster auszeichnen (vgl. Abbildung 9.2).

Die Adresse kann jeweils ¨uber drei Pins eingestellt werden, sodass insgesamt bis zu acht Bausteine eines Typs an einem (Unter-)Bus betrieben werden k¨onnen.

!

0

Adresse

1 0 0 A2 A1 A0 R/W

PCF 8574

!

0

Adresse

1 1 1 A2 A1 A0 R/W

PCF 8574A

Abb. 9.2. Adresseinstellungen der Bausteine PCF8574 und PCF8574A.

Die Ansteuerung ist denkbar einfach: Da der I2C-Bustreiber das Protokoll ab-handelt und die richtige Bausteinadresse mit passendem R/W-Bit jeder Nach-richt voranstellt, k¨onnen die Daten-Bytes direkt gesendet bzw. eingelesen wer-den (vgl. hierzu auch die Beispiele in Kapitel 8).

Dabei ist f¨ur diesen Baustein jeweils nur ein Byte zu transferieren, welches den PCF8574-Anschl¨ussen P0 bis P7 entspricht. Durch Lesen oder Schreiben eines Bytes wird direkt zwischen den ¨Ubertragungsmodi umgeschaltet. Die

¨Ubertragung erfolgt quasi-bidirektional – die Richtung muss also nicht ¨uber

168 9 Inter-IC-Bus-Komponenten

ein separates Register festgelegt werden.2 Die als Eing¨ange verwendeten Pins sollten vor dem Lesen auf HIGH gesetzt sein.

Neben den acht I/O-Leitungen stellt der PCF8574 zus¨atzlich eine Interruptlei-tung zur Verf¨ugung. Tritt an den Eing¨angen (im Lesemodus, d. h. nach einem Lesevorgang) eine steigende oder fallende Flanke auf, so wird ein Interrupt an LeitungINTausgel¨ost. Durch den n¨achsten Bausteinzugriff wird die Interrupt-schaltung wieder reaktiviert. F¨ur die Auswertung w¨are ein weiterer I/O-Port am Router notwendig. Da dies nicht zum Buskonzept passt, soll hier auf eine Auswertung der Interrupts verzichtet werden.

Als Beispiel wird in diesem Abschnitt die Ansteuerung eines Bedienpanels gezeigt. Der Quelltext ist im I2C-Beispielverzeichnis unter panel zu finden.

Das Panel besteht aus einer 4×4-Matrixtastatur und einer Adapterplatine zum Anschluss eines LC-Displays auf Basis eines Hitachi HD44780-Controllers (vgl.

Komponentenliste in Anhang E.2). Abbildung 9.3 zeigt beide Module.

Abb. 9.3. 4×4-Matrixtastaturmodul (Conrad) und LCD-Adapter (CC-Tools) mit Display.

Zur Stromversorgung ¨uber die mitgef¨uhrten 5 V des I2C-Anschlusses vgl. auch die Steckerbelegung entsprechend Abbildung 8.11 im vorangegangenen Kapi-tel.

2Um ¨Uberraschungen zu vermeiden ist beim Entwurf einer eigenen Schaltung zu ber¨ucksichtigen, dass die Ausg¨ange des PCF8574 nach dem Einschalten zun¨achst auf HIGH gelegt sind.

9.3.2 I2C-Tastaturmodul

Wenn am System eine USB-Schnittstelle vorhanden ist, so kann ¨ublicherweise auch eine USB-Tastatur verwendet werden. In Einzelf¨allen kann es jedoch vor-kommen, dass eine Eingabe dezentral aus einer Entfernung von mehr als f¨unf Metern vom Rechnersystem erfolgen soll. In diesem Fall ist die Integration eines Tastaturmoduls in das I2C-Buskonzept w¨unschenswert.

Die I2C-Bus-Tastatur kann eine 4×4-Matrix von 16 Tastern abfragen. Die drei Leitungen zur Konfiguration der Adresse sind auf Jumper herausgef¨uhrt. Eine Anordnung in Matrixform gem¨aß Abbildung 9.4 erfordert zwei separate Ab-frageschritte, bietet aber folgende Vorteile: W¨ahrend bei Belegung der Taster mit einem festen Potential von GND oder 5 V und dem Einlesen ¨uber I/O-Leitungen nur der Anschluss von acht Tastern m¨oglich w¨are, so k¨onnen durch diese Form der Abfrage bis zu 16 Taster ausgelesen werden.

16 32 64 128

1 2 4 8

P7 P0

PCF8574

1

5 6 7 8

2 3 4

9 0 C E

F1 F2

F4 F3

Abb. 9.4. Schaltplan eines PCF8574-Bausteins mit 16 angeschlossenen Tastern im C-Control-Modul I2C-Bus-Tastatur von Conrad. Die Wertigkeit der einzelnen Zeilen und Spalten ist ¨uber der Matrix und seitlich davon abgedruckt.

Die 5 V-Spannung, mit der ein Tastendruck ¨uber eine Datenleitung identifiziert wird, ist ¨uber eine andere I/O-Leitung zu generieren. Dann kann durch Anlegen einer Spannung auf P0–P3 in der Folge ¨uber P4–P7 gelesen werden, welche Zeile der Matrix momentan HIGH ist. Hierbei k¨onnen auch Taster in mehreren Zeilen gedr¨uckt sein. Durch Anlegen einer Spannung auf P4–P7 kann in einem zweiten Schritt die zugeh¨orige Spalte identifiziert werden.

9.3.3 Die Klasse IICKeyboard

Die KlasseIICKeyboardsoll Ger¨ate vom Typ I2C-Bus-Tastatur repr¨asentier-en. Da ein interruptgesteuertes Lesen nicht m¨oglich ist, muss zum Einlesen eine

170 9 Inter-IC-Bus-Komponenten

aktive Abfrage per sog.Pollingerfolgen. Die Tastatur besitzt keinen Puffer, um Zeichen zwischenzuspeichern. Nur durch eine rechtzeitige Abfrage k¨onnen alle Eingaben gelesen werden. Im Regelfall ist bekannt, wann eine Benutzereingabe erfolgen soll. Entsprechend kann eine blockierende Methode getKey() reali-siert werden, welche nach einem Tastendruck das zugeordnete ASCII-Zeichen zur¨uckgibt. Naheliegend aber nicht zwingend ist die R¨uckgabe der aufgedruck-ten Zeichen. Die Zuordnung zwischen Zahlenweraufgedruck-ten und Zeichen wird in einer Tabelle vom Typmap<int,char>abgelegt. Alskeydient die Summe der in bei-den Abfrageschritten gelesenen Zeilen- und Spaltenwerte. Um ein Prellen der Taster zu vermeiden, muss der bisherige Zahlenwert in jedem Abfrageintervall gespeichert werden. Als Membervariablen werden entsprechend ben¨otigt:

c h a r m _ b u f ; // r / w b u f f e r

u n s i g n e d c h a r m _ k e y _ v a l , m _ k e y _ v a l _ o l d ; // c u r r e n t a n d p r e v k e y v a l u e s map < u n s i g n e d char , u n s i g n e d char > m _ k e y m a p ; // value - c h a r p a i r s

Die Erstellung der Eintr¨age in m keymap wird in der Initialisierungsroutine vorgenommen. ¨Uber das Makro POLL CYCLE wird die Periodendauer f¨ur ein Polling-Intervall in Mikrosekunden festgelegt. Die ¨uberschaubare API bein-haltet lediglich die folgenden Funktionen:

IICKeyboard(IICBus& bus, int addr, string name);

Erzeugung eines Objektes vom TypIICKeyboard unter Angabe der Re-ferenz auf das Objektbus, der I2C-Adresse addr und einer Bezeichnung name.

void init();

Vorbelegung der Tabellem keymapmit Paaren der Form<wert,zeichen>.

char getKey();

Bestimmung eines Schl¨ussels aus aktiver Zeile und Spalte. Als R¨uckgabewert dient das inm keymapzugeordnete Zeichen.

9.3.4 I2C-LC-Display

Vielen Embedded-Systemen fehlt die M¨oglichkeit, ¨uber VGA einen Bildschirm anzuschließen. Weiterhin ist abh¨angig von der verwendeten Embedded-Linux-Distribution u. U. generell keine grafische Anzeige m¨oglich. Oft ist aber zumin-dest eine (dezentrale) Textausgabe w¨unschenswert, wie sie durch den Aufbau eines Terminals aus Anzeige und Tastatur m¨oglich wird. Eine Eingliederung in das I2C-Konzept erscheint deshalb sinnvoll. Ein LC-Display3bietet zumindest die M¨oglichkeit, einfache Daten wie bspw. den System- oder Anwendungssta-tus auszugeben.

LC-Displays k¨onnen als zeichenorientierte (alphanumerische) oder grafi-sche Anzeigen ausgef¨uhrt sein, wobei die grafigrafi-schen Varianten teurer und

3Engl.Liquid Crystal Display, Fl¨ussigkristallanzeige.

aufw¨andiger in der Ansteuerung sind. Im Hinblick auf diese Nachteile gra-fischer LCDs und auf die begrenzte Bandbreite des I2C-Busses scheint ein alphanumerisches LC-Display die bessere L¨osung. Bei dieser Form der Anzei-ge ist ein Zeichensatz fest im Speicher des Display-Controllers hinterlegt. In der Regel stehen ein, zwei oder vier Zeilen mit jeweils 16 bis 20 Zeichen zur Verf¨ugung.

Weiterhin ist anzumerken, dass fast alle LC-Displays von einem Hitachi-HD44780-Controller oder einem kompatiblen Derivat angesteuert werden. Die-ser Baustein hat sich als Quasi-Standard durchgesetzt.

9.3.5 LC-Display-Treiberbaustein HD44780

Der HD447804 besitzt einen 80 Zeichen großen Textpuffer und wird ¨uber ein paralleles Interface angesteuert. Je nach verwendetem Modus werden vier oder acht Datenleitungen und drei Steuerleitungen ben¨otigt. W¨ahrend die Ansteue-rung im 8-Bit-Modus etwas einfacher ist, kommt der Betrieb im 4-Bit-Modus mit nur sieben I/O-Pins aus – f¨ur viele Anwendungen ist dies ein großer Vor-teil. Am PCF8574 stehen insgesamt nur acht Bit zur Verf¨ugung, sodass die Wahl auf den 4-Bit-Modus f¨allt. Das letzte zur Verf¨ugung stehende Bit kann zur Ansteuerung einer Hintergrundbeleuchtung verwendet werden.

RS R/W D7 D6 D5 D4 D3 D2 D1 D0¯ Beschreibung

0 0 0 0 0 0 0 0 0 1 Clear Display

0 0 0 0 0 0 0 0 1 * Return Home

0 0 0 0 0 0 0 1 I/D S Entry Mode Set

0 0 0 0 0 0 1 D C B Display On/Off

0 0 0 0 0 1 S/C R/L * * Cursor and Display shift

0 0 0 0 1 DL N F * * Function Set

0 0 0 1 CG Address Set CG RAM Address

0 0 1 DD Address Set DD RAM Address

0 1 BF Address Counter Read Busy Flag and Address

1 0 Write Data Write Data to CG or DD RAM

1 1 Read Data Read Data from CG or DD RAM

Tabelle 9.1. Befehlssatz des HD44780 (* Don’t Care).

An das Display k¨onnen entweder Befehle zur Konfiguration oder Zeichen zur Darstellung gesendet werden. ¨Uber das Signal RS wird festgelegt, ob das Kommando- oder das Datenregister angesprochen wird. Es ist zudem m¨oglich, selbstdefinierte Zeichen in einem speziellen Speicher des HD44780 abzulegen.5

4 Vgl. Datenblatt unter<embedded-linux-dir>/datasheets/.

5 Dies geschieht mithilfe desCharacter Graphics Ram (CG-RAM).

172 9 Inter-IC-Bus-Komponenten

Von dieser M¨oglichkeit soll hier jedoch kein Gebrauch gemacht werden. Statt-dessen wird als Zielspeicher nur das Display Data Ram (DD-RAM) beschrie-ben, dessen Inhalt direkt auf dem Display abgebildet wird. Ob die eingehenden Daten in das CG-RAM oder in das DD-RAM fließen, h¨angt davon ab, welcher Befehl zuletzt ausgef¨uhrt wurde: Setze CG-RAM oderSetze DD-RAM. Der Adressz¨ahler wird nach der ¨Ubertragung eines Zeichens vom HD44780 au-tomatisch inkrementiert, sodass hintereinander geschriebene Zeichen auf dem Display nebeneinander stehen. Die Cursorposition kann aber auch bspw. f¨ur einen Zeilenwechsel direkt gesetzt werden. Weiterhin ist es m¨oglich, Zeichen vom Display oder Inhalte der Zeichenmaske aus dem CG-RAM zur¨uckzulesen.

Diese Funktionalit¨at wird aber eher selten ben¨otigt. Tabelle 9.1 gibt eine

¨Ubersicht ¨uber den Befehlssatz des HD44780, Tabelle 9.2 liefert die Bedeu-tung der Parameter.

Bit 0 1

I/D Cursorposition dekrementieren Cursorposition inkrementieren S Anzeige steht still Anzeige mitbewegen

D Anzeige aus Anzeige an

B Cursor blinkt nicht Cursor blinkt

C Cursor aus Cursor an

S/C Cursor in Richtung R/L bewegen Anzeige in Richtung R/L bewegen R/L Bewegung nach links Bewegung nach rechts

DL 4-Bit-Modus 8-Bit-Modus

N Anzeige einzeilig Anzeige zweizeilig

F 5×8-Dot-Matrix 5×10-Dot-Matrix

BF Display bereit Display besch¨aftigt Tabelle 9.2. Bedeutung der Parameter.

Wenn das Display gerade einen Befehl verarbeitet und noch nicht bereit f¨ur ein weiteres Kommando ist, so ist das Busy-Flag BF gesetzt. Eine ¨Uberpr¨ufung des Flags ist sinnvoll, um die Ansteuerungsdauer so kurz wie m¨oglich zu hal-ten. Alternativ kann zwischen zwei Zugriffen eine kurze Zeit pausiert werden, bevor der n¨achste Befehl abgesetzt wird. Eine gewisse Latenz wird bereits durch die ¨Ubertragungszeiten auf dem I2C-Bus erreicht, sodass die Wartezei-ten eher bei direktem Anschluss an einen Mikrocontroller relevant werden. Bei der Befehlsabfolge f¨ur die Initialisierung gilt dies allerdings nicht – hier sind generell l¨angere Wartezeiten einzuhalten. Eine Abfrage des Busy-Flags ist zu diesem Zeitpunkt noch nicht m¨oglich. Im 4-Bit-Modus werden Kommandos und Zeichen in die zwei H¨alften eines Bytes, das High- und das Low-Nibble, zerlegt und nacheinander ¨ubertragen. ¨Uber eine steigende Flanke an der En-able-Leitung wird dem Display mitgeteilt, wann die Daten auf D4–D7 korrekt anliegen und ¨ubernommen werden sollen.

F¨ur eine Initialisierung des Displays im 4-Bit-Modus m¨ussen folgende Schritte durchgef¨uhrt werden:

1. Nach dem Einschalten 15 ms warten 2. Schreibe0x30an das Kommandoregister 3. Warte 5 ms

4. Schreibe nochmals0x30an das Kommandoregister 5. Warte weitere 100µs

6. Schreibe nochmals0x30an das Kommandoregister 7. Schreibe0x20(4-Bit-Modus, zweizeilig, 5×8 Punkte)

Das dreimalige Schreiben von0x30f¨uhrt einen internen Reset durch. Erst nach diesem Reset kann der Modus gewechselt werden. Wie bereits angedeutet, kann das Busy-Flag in der Initialisierungsphase noch nicht abgefragt werden. Aus diesem Grund sind die Pausen unbedingt einzuhalten.

9.3.6 Die Klasse IICDisplay

Die KlasseIICDisplay implementiert als Unterklasse vonIICBase Zugriffs-methoden f¨ur ein LC-Display, welches ¨uber einen I2C-I/O-Expander vom Typ PCF8574 angeschlossen ist. Bei dem hier verwendeten Interface6 ist das Dis-play gem¨aß Tabelle 9.3 mit dem PCF8574 verbunden.

PCF8574 PCF 7 PCF 6 PCF 5 PCF 4 PCF 3 PCF 2 PCF 1 PCF 0 Stiftleiste D7 D6 D5 D4 LCD Light Enable RW RS Tabelle 9.3.Schnittstellenbelegung zwischen PCF8574 und LC-Display bei Verwen-dung des PCF-LCD-Interface von CC-Tools.

Die Datenpins D0–D3 werden im 4-Bit-Modus nicht ben¨otigt und bleiben frei. Platinen anderer Hersteller haben u. U. eine abweichende Belegung (vgl.

bspw. das LCD-I2C-Interface von Conrad). Die Zuordnung wird daher in IICDisplay.hf¨ur den jeweiligen Fall definiert:

// d e f i n e c o n n e c t i o n P C F 8 5 7 4 < - > L C D h e r e

# d e f i n e L C D _ B A C K L I G H T 0 x08

# d e f i n e L C D _ E N A B L E 0 x04

# d e f i n e L E D _ R W 0 x02

# d e f i n e L E D _ R S 0 x01

# d e f i n e L E D _ D A T A _ S H I F T 4

6 PCF-LCD-Interface von CC-Tools, vgl. Komponentenliste in Tabelle E.2.

174 9 Inter-IC-Bus-Komponenten

Die einzige Bedingung f¨ur die Anwendbarkeit der Definitionen ist eine zu-sammenh¨angende und aufsteigende Belegung der Datenpins D4–D7. ¨Uber das Makro LED DATA SHIFT wird die Anzahl der Bits angegeben, um welche sich der Beginn der Datenleitung D4 des Displays gegen¨uber PCF0 verschiebt. Alle anderen Makros enthalten die Wertigkeit der zugeh¨origen Pins des PCF8574.

Je nach Typ des Displays unterscheiden sich Gr¨oße und Adressierung des Dis-playspeichers. Ein Aufz¨ahlungstyp definiert m¨ogliche Dimensionen der Zei-chenmatrix:

e n u m i i c _ d i s p _ t y p e { S I Z E _ 2 x 1 6 ,

S I Z E _ 4 x 1 6 , S I Z E _ 2 x 2 0 , S I Z E _ 4 x 2 0 };

Der passende Wert muss dem Konstruktor zus¨atzlich zu den Basisparametern

¨ubergeben werden. F¨ur die Ablage des Displaytyps, des Beleuchtungs- und An-zeigestatus’ sowie f¨ur die Bereitstellung eines Schreibpuffers f¨ur Anwendung und I2C-Schnittstelle sind f¨ur die Klasse IICDisplay folgende Membervaria-blen notwendig:

i i c _ d i s p _ t y p e m _ d i s p t y p e ; // d i s p l a y t y p e ( d i m e n s i o n s ) c h a r m _ b a c k l i g h t ; // b a c k l i g h t s t a t u s

c h a r m _ d i s p _ c o n t r o l ; // d i s p l a y s t a t u s

c h a r m _ d i s p _ b u f [ D I S P B U F L E N G T H ]; // d i s p l a y c h a r a c t e r b u f f e r

c h a r m _ b u f ; // i2c - rw - b u f f e r

s t r u c t t i m e s p e c m _ t s _ f r e e z e _ e n d ; // e n d of f r e e z e t i m e

// ( no c l e a r () , p u t C h a r () a n d s e t D i s p l a y () o p e r a t i o n s w h i l e f r e e z e )

In der Variablen m ts freeze end wird ein Zeitpunkt angegeben, nach wel-chem der Displayinhalt fr¨uhestens wieder ge¨andert werden darf. Bis zu diesem Zeitpunkt bleibt das Display ”eingefroren“. Die f¨ur den Anwender relevanten Zugriffsmethoden sind in der folgenden API aufgelistet. Selten ben¨otigte Dis-playfunktionen wurden nicht implementiert – die Klasse ist bei Bedarf um diese zu erweitern (ein Beispiel ist die Verschieberichtung inEntry Mode Set).

IICDisplay(IICBus& bus, int addr, string name,iic disp type dtype);

Erzeugt ein Objekt vom Typ IICDisplay unter Angabe einer Referenz auf das Bus-Objekt bus, der I2C-Adresse addr, einer Bezeichnung name und des Displaytypsdtype.

void clear();

L¨oscht den Display-Inhalt und setzt den Cursor auf die Home-Position zur¨uck.

void putChar(char ch);

Schreibt ein einzelnes Zeichenchan die aktuelle Cursorposition.

void setCursorPos(int row, int col);

Setzt den Cursor in Zeile rowund Spaltecol, wobei die obere linke Ecke durch(0,0)repr¨asentiert wird.

void setCursorMode(bool curs, bool blink);

Stellt den Cursor an bzw. aus(curs)oder versetzt ihn in den Blinkmodus (blink).

void setDisplay(bool disp);

Aktiviert oder deaktiviert die Anzeige des Displays, die Speicherinhal-te bleiben erhalSpeicherinhal-ten. Mit dem AbschalSpeicherinhal-ten w¨ahrend eines Aufrufs von putChar() l¨asst sich die schrittweise Darstellung einzelner Zeichen ver-meiden.

void setBacklight(bool bl);

Stellt die Hintergrundbeleuchtung an oder aus.

char* getBuf();

¨Uber diese Funktion wird ein Zeiger angefordert, um Daten im Display-puffer abzulegen. Zu beachten ist, dass beim Schreiben in den Puffer der zul¨assige Bereich vonDISPBUFLENGTHnicht ¨uberschrieben wird.

void printBuf();

Schreibt alle im Puffer m disp buf enthaltenen Zeichen an die aktuelle Cursorposition. Ein Zeilenendezeichen\nbricht die Zeichenkette an dieser Stelle ab.

void freeze(unsigned int time ms);

Friert das Display f¨ur eine bestimmte Zeit time msin Millisekunden ein, indem die Befehleclear(),putChar()undsetDisplay()f¨ur diese Dau-er ignoriDau-ert wDau-erden. Eine m¨ogliche Anwendung ist bspw. die Ausgabe von Warnmeldungen w¨ahrend einer fortlaufenden Messwertausgabe. Ei-ne Warnmeldung kann hiermit h¨oher priorisiert werden und wird nicht sofort wieder ¨uberschrieben.

Auf die Implementierung der einzelnen Ansteuerungsroutinen soll hier nicht n¨aher eingegangen werden. Der folgende Quelltext zeigt aber Grundlagen der Kommunikation mit dem Display. Das Senden eines Kommandos oder Zeichens erfolgt hierbei immer in zwei Schritten (vgl. auch die MethodeputChar(), aus welcher das Snippet entnommen ist):

m _ b u f = ( ch & 0 xF0 ) > > (4 - L E D _ D A T A _ S H I F T ) ; // HB : f o u r u p p e r b i t s m _ b u f |= L E D _ R S ; // s e t w r i t e

m _ b u f |= m _ b a c k l i g h t ; w r i t e D a t a (& m_buf , 1) ; t r i g g e r _ e n a b l e () ;

m _ b u f = ( ch & 0 x0F ) < < L E D _ D A T A _ S H I F T ; // LB : f o u r l o w e r b i t s m _ b u f |= L E D _ R S ; // s e t w r i t e

m _ b u f |= m _ b a c k l i g h t ; w r i t e D a t a (& m_buf , 1) ; t r i g g e r _ e n a b l e () ;

176 9 Inter-IC-Bus-Komponenten

Zuerst wird dasHigh-Nibble7des zu sendenden Display-Daten-Bytes geschrie-ben. Daf¨ur sind die untersten vier Bit zu l¨oschen und die restlichen vier Da-tenbits an die richtige Position zu verschieben. In diesem Fall liegen sie mit LED DATA SHIFT= 4 bereits an der richtigen Stelle. Nachdemm bufdie zu sen-denden Display-Daten enth¨alt, werden nun zus¨atzliche Steuerbits wie bspw.

LED RSgesetzt. Weiterhin wird der aktuelle Zustand der Hintergrundbeleuch-tung addiert, da dieser durch den Schreibzugriff nicht ver¨andert werden soll.

Das vollst¨andige PCF8574-Daten-Byte kann nun an den Ausg¨angen angelegt und durch Ausl¨osen einer steigenden Flanke anENABLE¨ubernommen werden.

Analog erfolgt in einem zweiten Schritt das Senden desLow-Nibbles. Der ein-zige Unterschied ist, dass die unteren vier Datenbits von D0 ausgehend in entgegengesetzter Richtung korrigiert werden m¨ussen.

9.3.7 Die Klasse IICIOExpander

Nachdem nun die Klassen IICKeyboard und IICDisplay erkl¨art wurden, wird im folgenden Text eine weitere Klasse zur generischen Verwendung der PCF8574-Bausteine vorgestellt. F¨ur eigene I/O-Entwicklungen auf Basis eines PCF8574 stehtIICIOExpandermit folgender API zur Verf¨ugung:

IICIOExpander(IICBus& bus, int addr, string name);

Erzeugt ein Objekt vom TypIICIOExpanderunter Angabe einer Referenz auf das Bus-Objekt bus, der I2C-Adresse addr und einer Bezeichnung name.

int setPort(char data);

Schreibt die indataangegebenen Daten in das I/O-Register.

int setPortOn(char pins);

Setzt die inpins markierten Ausg¨ange auf logisch 1.

int setPortOff(char pins);

Setzt die inpins markierten Ausg¨ange auf logisch 0.

int getPort();

Liefert im niederwertigen Byte den Zustand des kompletten I/O-Registers zur¨uck.

int getPin(char pin);

Gibt den Zustand eines einzelnen Pinspinzur¨uck (pinist im Bereich 0..7 anzugeben).

Falls keine anderen R¨uckgabewerte spezifiziert wurden, so liefern die Funk-tionen die Anzahl der geschriebenen oder gelesenen Daten-Bytes zur¨uck, im Fehlerfall −1. Das Beispielio expanderzeigt die Verwendung dieser Klasse.

7Mit Nibble werden vier Bit bezeichnet, in diesem Fall die vier mit der h¨ochsten Wertigkeit im Daten-Byte.