<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=0%3A0%3A0%3AFFFF%3A194%3A175%3A222%3A211</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=0%3A0%3A0%3AFFFF%3A194%3A175%3A222%3A211"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/0:0:0:FFFF:194:175:222:211"/>
	<updated>2026-04-10T18:05:31Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Porterweiterungen&amp;diff=74738</id>
		<title>Porterweiterungen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Porterweiterungen&amp;diff=74738"/>
		<updated>2013-03-21T14:02:48Z</updated>

		<summary type="html">&lt;p&gt;0:0:0:FFFF:194:175:222:211: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Frank Link (Der Platinenshop)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vor einiger Zeit habe ich mit Hilfe des Forums eine Ansteuerungsplatine für einen Motorpotentiometer entwickelt. Zum Einsatz kam ein ATMEGA8, da ich kein entsprechendes IC zur Ansteuerung des Motors verwenden wollte, habe ich mehrere Ausgänge eines Ports parallel geschaltet.&lt;br /&gt;
&lt;br /&gt;
Leider blieben dann nur noch fünf Digitalausgänge übrig um weitere Funktionen anzusteuern.&lt;br /&gt;
&lt;br /&gt;
Da ich immer mehr Anfragen hatte die zusätzliche Ein- und Ausgänge sowie analoge Messmöglichkeiten betrafen, habe ich mich dazu entschlossen, ein Set von kleinen Platinen zu entwickeln, dass es ermöglicht mit maximal 4 Ports zusätzliche Funktionen zu schaffen.&lt;br /&gt;
&lt;br /&gt;
Eine Liste von Features:&lt;br /&gt;
&lt;br /&gt;
* die Ansteuerung erfolgt über Software SPI&lt;br /&gt;
* freie Portbelegung&lt;br /&gt;
* Entwicklungsumgebung AVR Studio 4&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Die Hardware besteht aus mehreren kleine Platinen in der Größenordnung 60 x 40 mm.&lt;br /&gt;
Auf den Platinen befinden sich alle notwendigen Bauteile. Die Platinen sind so aufgebaut, dass sie kaskadiert werden können.&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC595 (Ausgang) ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Porterweiterung_74HC595.png|thumb|right|250px|Platinengröße: 70 &amp;amp;times; 35 mm]]&lt;br /&gt;
&lt;br /&gt;
Diese Platine besteht aus zwei 74HC595 die kaskadiert 16 digitale Ausgänge zur Verfügung stellt. Die Gesamtlast für einen Baustein beträgt ca. 70mA.&lt;br /&gt;
&lt;br /&gt;
Die Platine wurde auf Grund eins Tipps von  Peter Dannegger (PeDa) zusätzlich mit einem über den Mikrocontroller steuerbaren /OE versehen. Durch den Pullup-Widerstand am /OE befindet sich der 74HC595 nach eine Reset in einem definierten Zustand.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stecker JP1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit JP1 kann /OE über den Pullup-Widerstand auf High gezogen und damit das 74HC595 in den Tristate-Modus versetzt werden. In diesem Fall muss /OE durch den Mikrocontroller bei der Initialisierung auf low gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann /OE direkt auf GND gelegt werden. In diesem Fall braucht PIN 3 von JP2 nicht beschaltet zu werden.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Brücke&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
| PIN 1 / 2&lt;br /&gt;
| /OE auf GND&lt;br /&gt;
|-&lt;br /&gt;
| PIN 2 / 3&lt;br /&gt;
| /OE über Pullup&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stecker JP2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Über JP2 erfolgt die Verbindung zum Mikrocontroller oder zu einer weiteren Porterweiterung.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Pinbelegung&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PIN 1&lt;br /&gt;
|CLK&lt;br /&gt;
|-&lt;br /&gt;
|PIN 2&lt;br /&gt;
|RCLK&lt;br /&gt;
|-&lt;br /&gt;
|PIN 3&lt;br /&gt;
|/OE&lt;br /&gt;
|-&lt;br /&gt;
|PIN 4&lt;br /&gt;
|SERIN&lt;br /&gt;
|-&lt;br /&gt;
|PIN 5&lt;br /&gt;
|SEROUT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Soll eine weitere Porterweiterung kaskadiert werden, ist darauf zu achten, dass  PIN 1 und PIN 2 direkt mit den entsprechenden Anschlüssen der folgenden Platine verbunden werden müssen. Für PIN 3 falls /OE über den Pullup-Widerstand angeschlossen ist gilt das selbe.&lt;br /&gt;
&lt;br /&gt;
PIN 4 wird wenn es sich um die erste Platine in der Kaskade handelt mit dem entsprechenden PORT des Mikrocontrollers verbunden. &lt;br /&gt;
&lt;br /&gt;
PIN 5 wird innerhalb einer Kaskade immer mit PIN 4 der nächsten folgenden Porterweiterung verbunden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stecker JP3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Pinbelegung&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PIN 1&lt;br /&gt;
|Vcc&lt;br /&gt;
|-&lt;br /&gt;
|PIN 2&lt;br /&gt;
|GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC595 (LCD) ===&lt;br /&gt;
&lt;br /&gt;
Diese Platine besteht aus einem 74HC595 über das ein HD44780 kompatibles LCD angesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Porterweiterung_74HC595_lcd.png|thumb|right|250px|Platinengröße: 60 &amp;amp;times; 35 mm]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bestückungshinweis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Trimmer sollte idealerweise von der Lötseite bestückt werden, damit der Kontrast jederzeit geregelt werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stecker JP1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit JP1 kann /OE über den Pullup-Widerstand auf High gezogen und damit das 74HC595 in den Tristate-Modus versetzt werden. In diesem Fall muss /OE durch den Mikrocontroller bei der Initialisierung auf low gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann /OE direkt auf GND gelegt werden. In diesem Fall braucht PIN 3 von JP2 nicht beschaltet werden.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Brücke&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
| PIN 1 / 2&lt;br /&gt;
| /OE auf GND&lt;br /&gt;
|-&lt;br /&gt;
| PIN 2 / 3&lt;br /&gt;
| /OE über Pullup&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stecker JP2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Über JP2 erfolgt die Verbindung zum Mikrocontroller oder zu einer weiteren Porterweiterung.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Pinbelegung&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PIN 1&lt;br /&gt;
|CLK&lt;br /&gt;
|-&lt;br /&gt;
|PIN 2&lt;br /&gt;
|RCLK&lt;br /&gt;
|-&lt;br /&gt;
|PIN 3&lt;br /&gt;
|/OE&lt;br /&gt;
|-&lt;br /&gt;
|PIN 4&lt;br /&gt;
|SERIN&lt;br /&gt;
|-&lt;br /&gt;
|PIN 5&lt;br /&gt;
|SEROUT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Solle eine weitere Porterweiterung kaskadiert werden, ist darauf zu achten, dass  PIN 1 und PIN 2 direkt mit den entsprechenden Anschlüssen der folgenden Platine verbunden werden müssen. Für PIN 3 falls /OE über den Pullup-Widerstand angeschlossen ist gilt das selbe.&lt;br /&gt;
&lt;br /&gt;
PIN 4 wird wenn es sich um die erste Platine in der Kaskade handelt mit dem entsprechenden PORT des Mikrocontrollers verbunden. &lt;br /&gt;
&lt;br /&gt;
PIN 5 wird innerhalb einer Kaskade immer mit PIN 4 der nächsten folgenden Porterweiterung verbunden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stecker JP3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Pinbelegung&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PIN 1&lt;br /&gt;
|Vcc&lt;br /&gt;
|-&lt;br /&gt;
|PIN 2&lt;br /&gt;
|GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Über den Trimmer kann der Kontrast des Displays eingestellt werden.&lt;br /&gt;
Falls vorhanden, kann die Hintergrundbeleuchtung des Displays über den Mikrocontroller ein und ausgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC589 (Eingang) ===&lt;br /&gt;
&lt;br /&gt;
in Planung&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung ADC ===&lt;br /&gt;
&lt;br /&gt;
in Planung&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung DAC ===&lt;br /&gt;
&lt;br /&gt;
in Planung&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Porterweiterung über 74HC595 (Ausgang) ===&lt;br /&gt;
&lt;br /&gt;
==== Datei com74hc595.h ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;#ifndef _COM74HC595_H_&lt;br /&gt;
#define _COM74HC595_H_&lt;br /&gt;
&lt;br /&gt;
// Anzahl der über Software-SPI anzusteuernde 74HC595 Bausteine&lt;br /&gt;
#define COM74HC595_SIZE 1&lt;br /&gt;
&lt;br /&gt;
// Anzahl der Bits über alle Bausteine&lt;br /&gt;
#define COM74HC595_BYTES COM74HC595_SIZE * 8&lt;br /&gt;
&lt;br /&gt;
// PORT am Mikrokontroller über den der Software SPI erfolgen soll&lt;br /&gt;
#define PORT_COM74HC595         PORTB&lt;br /&gt;
#define PORT_SER 		PB0		// 74HC595 PIN 14&lt;br /&gt;
#define PORT_SCK 		PB1		// 74HC595 PIN 11&lt;br /&gt;
#define PORT_RCK 		PB2		// 74HC595 PIN 12&lt;br /&gt;
#define PORT_OE 		PB3		// 74HC595 PIN 13&lt;br /&gt;
&lt;br /&gt;
#define DDR_COM74HC595          DDRB&lt;br /&gt;
#define DDR_SER 		DDB0	        // 74HC595 PIN 14&lt;br /&gt;
#define DDR_SCK 		DDB1	        // 74HC595 PIN 11&lt;br /&gt;
#define DDR_RCK 		DDB2	        // 74HC595 PIN 12&lt;br /&gt;
#define DDR_OE 			DDB3	        // 74HC595 PIN 13&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Falls eine Steuerung über /OE PIN 13 des 74HC595 gewünscht ist,&lt;br /&gt;
muss PIN 13 per Pullup Widerstand gesetzt werden, dass sorgt&lt;br /&gt;
dafür, dass der 74HC595 nach einem Reset in einem definierten&lt;br /&gt;
Zustand gesetzt werden kann.&lt;br /&gt;
Der 74HC595 wird in der Initialisierungsroutine mit 0x00 initialisiert.&lt;br /&gt;
Dadurch, dass /OE über den Pullup-Widerstand auf HIGH gezogen wurde,&lt;br /&gt;
befindet sich der 74HC595 im Tristate-Modus. Wird jetzt /OE auf LOW &lt;br /&gt;
gezogen, steht der gesetzte Zustand an den Ports an.&lt;br /&gt;
*/&lt;br /&gt;
#define WITH_OE&lt;br /&gt;
&lt;br /&gt;
// globales Array zur Speicherung der Bitmuster&lt;br /&gt;
extern unsigned char com74hc595[];&lt;br /&gt;
&lt;br /&gt;
// Initialisierung der Ports im Mikrocontroller&lt;br /&gt;
extern void com74hc595_init(void);&lt;br /&gt;
&lt;br /&gt;
// Ausgabe der Bitmuster an die 74HC595&lt;br /&gt;
extern void com74hc595_out(void);&lt;br /&gt;
&lt;br /&gt;
// setzen eines einzelnen Bits innerhalb des Arrays&lt;br /&gt;
extern void com74hc595_setBit( unsigned char BitNumber );&lt;br /&gt;
&lt;br /&gt;
// zurücksetzen eines einzelnen Bits innerhalb des Arrays&lt;br /&gt;
extern void com74hc595_unsetBit( unsigned char BitNumber );&lt;br /&gt;
&lt;br /&gt;
// setzen eines ganzen Ports&lt;br /&gt;
extern void com74hc595_setPort( unsigned char Port, unsigned char Bits );&lt;br /&gt;
&lt;br /&gt;
// zurücksetzen eines ganzen Ports&lt;br /&gt;
extern void com74hc595_unsetPort( unsigned char Port );&lt;br /&gt;
&lt;br /&gt;
// setzt alle Bits auf logisch 1&lt;br /&gt;
extern void com74hc595_setall(void);&lt;br /&gt;
&lt;br /&gt;
// setzt alle Bits auf logisch 0&lt;br /&gt;
extern void com74hc595_unsetall(void);&lt;br /&gt;
&lt;br /&gt;
#endif /* _COM74HC595_H_ */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datei (com74hc595.c) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;com74hc595.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Array fuer die Daten&lt;br /&gt;
unsigned char com74hc595[ COM74HC595_SIZE ];&lt;br /&gt;
&lt;br /&gt;
void com74hc595_setBit( unsigned char BitNumber)&lt;br /&gt;
{&lt;br /&gt;
	unsigned char Port = BitNumber &amp;gt;&amp;gt; 3;&lt;br /&gt;
	unsigned char Bit = BitNumber &amp;amp; 7;&lt;br /&gt;
	com74hc595[ Port ] |= (1 &amp;lt;&amp;lt; ( Bit ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_unsetBit( unsigned char BitNumber)&lt;br /&gt;
{&lt;br /&gt;
	unsigned char Port = BitNumber &amp;gt;&amp;gt; 3;&lt;br /&gt;
	unsigned char Bit = BitNumber &amp;amp; 7;&lt;br /&gt;
	com74hc595[ Port ] &amp;amp;= ~(1 &amp;lt;&amp;lt; ( Bit ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Com74hc595_setall(void)&lt;br /&gt;
{&lt;br /&gt;
	for ( int i = 0; i &amp;lt; COM74HC595_BYTES; i++ )&lt;br /&gt;
	{&lt;br /&gt;
		com74hc595_setBit( i );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_unsetall(void)&lt;br /&gt;
{&lt;br /&gt;
	for ( int i = 0; i &amp;lt; COM74HC595_BYTES; i++ )&lt;br /&gt;
	{&lt;br /&gt;
		com74hc595_unsetBit( i );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_setPort( unsigned char Port, unsigned char Bits )&lt;br /&gt;
{&lt;br /&gt;
	com74hc595[ Port ] = Bits;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_unsetPort( unsigned char Port )&lt;br /&gt;
{&lt;br /&gt;
	com74hc595[ Port ] = 0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void com74hc595_init()&lt;br /&gt;
{&lt;br /&gt;
        /* Verwendete Ports auf OUT */&lt;br /&gt;
	DDR_com74hc595 |= ( 1 &amp;lt;&amp;lt; DDR_SER);&lt;br /&gt;
	DDR_com74hc595 |= ( 1 &amp;lt;&amp;lt; DDR_SCK);&lt;br /&gt;
	DDR_com74hc595 |= ( 1 &amp;lt;&amp;lt; DDR_RCK);&lt;br /&gt;
&lt;br /&gt;
#ifdef WITH_OE&lt;br /&gt;
	DDR_com74hc595 |= ( 1 &amp;lt;&amp;lt; DDR_OE);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
        /* SER auf definierten Level LOW */&lt;br /&gt;
	PORT_com74hc595 &amp;amp;= ~(1&amp;lt;&amp;lt;PORT_SER);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* SCR und RCK auf definierten Level HIGH */&lt;br /&gt;
	PORT_com74hc595 |= (1&amp;lt;&amp;lt;PORT_SCK);&lt;br /&gt;
	PORT_com74hc595 |= (1&amp;lt;&amp;lt;PORT_RCK);&lt;br /&gt;
&lt;br /&gt;
#ifdef WITH_OE&lt;br /&gt;
	PORT_com74hc595 |= (1&amp;lt;&amp;lt;PORT_OE);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	com74hc595_unsetall();&lt;br /&gt;
	com74hc595_out();     &lt;br /&gt;
&lt;br /&gt;
#ifdef WITH_OE&lt;br /&gt;
	PORT_com74hc595 &amp;amp;= ~(1&amp;lt;&amp;lt;PORT_OE);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_out()&lt;br /&gt;
{&lt;br /&gt;
    unsigned char anz = COM74HC595_SIZE;&lt;br /&gt;
    unsigned char* serp = com74hc595 + COM74HC595_SIZE;&lt;br /&gt;
&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        unsigned char bits;&lt;br /&gt;
        unsigned char data = *--serp;&lt;br /&gt;
&lt;br /&gt;
        /* 8 Bits pro Byte rausschieben */&lt;br /&gt;
        for (bits = 8; bits &amp;gt; 0; bits--)&lt;br /&gt;
        {&lt;br /&gt;
	    PORT_COM74HC595 &amp;amp;= ~(1&amp;lt;&amp;lt;PORT_SER);&lt;br /&gt;
            if (data &amp;amp; 0x80)&lt;br /&gt;
            {&lt;br /&gt;
		PORT_COM74HC595 |= (1&amp;lt;&amp;lt;PORT_SER);&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            data &amp;lt;&amp;lt;= 1;&lt;br /&gt;
            /* Strobe an SCK schiebt Daten im Gaensemarsch */&lt;br /&gt;
            /* um 1 Position weiter durch alle Schieberegister */&lt;br /&gt;
	    PORT_COM74HC595 &amp;amp;= ~(1&amp;lt;&amp;lt;PORT_SCK);&lt;br /&gt;
	    PORT_COM74HC595 |= (1&amp;lt;&amp;lt;PORT_SCK);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    while (--anz &amp;gt; 0);&lt;br /&gt;
&lt;br /&gt;
    /* Strobe an RCK bringt die Daten von den Schieberegistern in die Latches */&lt;br /&gt;
    PORT_COM74HC595 &amp;amp;= ~(1&amp;lt;&amp;lt;PORT_RCK);&lt;br /&gt;
    PORT_COM74HC595 |= (1&amp;lt;&amp;lt;PORT_RCK);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datei (main.c) ====&lt;br /&gt;
&lt;br /&gt;
Einfaches Lauflicht über alle Ports&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;com74hc595.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    com74hc595_init();&lt;br /&gt;
 &lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        for ( int i = 0; i &amp;lt; com74hc595_BYTES; i++ )&lt;br /&gt;
	{&lt;br /&gt;
	    com74hc595_setBit( i );&lt;br /&gt;
	    com74hc595_out();&lt;br /&gt;
            _delay_ms( 2000 );&lt;br /&gt;
&lt;br /&gt;
	    com74hc595_unsetBit( i );&lt;br /&gt;
	    com74hc595_out();&lt;br /&gt;
            _delay_ms( 2000 );&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC595 (LCD) ===&lt;br /&gt;
&lt;br /&gt;
==== LCD - Befehlssatz ====&lt;br /&gt;
&lt;br /&gt;
Da ich in dieser Bibliothek und auf der Platine den PIN R/W des LCD-Bus auf GND gelegt habe, spielt er hier keine Rolle. Er wird deshalb auch nicht betrachtet.&lt;br /&gt;
&lt;br /&gt;
Bevor ein Kommando an das LCD übergeben werden kann, muss sichergestellt sein, dass RS auf logisch 0 steht. Nur dann interpretiert das LCD das folgende Byte als Kommando.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Legende:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* 1 = high-Pegel&lt;br /&gt;
* 0 = low-Pegel&lt;br /&gt;
* x = beliebiger Pegel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039; Display löschen bzw. zurücksetzen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Displayinhalt wird gelöscht und der Cursor auf die erste Position in der ersten Zeile gesetzt.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cursor auf Startposition setzen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Cursor wird auf die Startposition gesetzt. Falls der Displayinhalt geshiftet wurde, wird auch der Shift zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cursor-Richtung und Display-Shift&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl legt die Bewegungsrichtung des Cursors und den Display-Shift  fest. Shift bedeutet, dass der gesamte Inhalt des Displays um eine Position verschoben wird.&lt;br /&gt;
&lt;br /&gt;
*C = 0: Bewegung nach links&lt;br /&gt;
*C = 1: Bewegung nach rechts&lt;br /&gt;
&lt;br /&gt;
*S = 0: kein Shift&lt;br /&gt;
*S = 1: Display-Inhalt wird geshiftet&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!C&lt;br /&gt;
!S&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Display-Zustand&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl kann das Display ein- oder ausgeschaltet, der Cursor angezeigt und der Cursor blinkend dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
*P = 0: Display aus&lt;br /&gt;
*P = 1: Display an&lt;br /&gt;
&lt;br /&gt;
*C = 0: Cursor aus&lt;br /&gt;
*C = 1: Cursor an&lt;br /&gt;
&lt;br /&gt;
*B = 0: ständig sichtbarer Cursor&lt;br /&gt;
*B = 1: blinkender Cursor&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!P&lt;br /&gt;
!C&lt;br /&gt;
!B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cursor-Funktion&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl wird festgelegt, ob beim Schreiben eines Zeichens der Cursor bewegt werden soll, oder ob der Display-Inhalt geshiftet werden soll  und, in welche Richtung geshiftet werden soll &lt;br /&gt;
&lt;br /&gt;
*M = 0: Cursor bewegen&lt;br /&gt;
*M = 1: Display shiften&lt;br /&gt;
&lt;br /&gt;
*S = 0: nach links shiften&lt;br /&gt;
*S = 1: nach rechts shiften&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!M&lt;br /&gt;
!S&lt;br /&gt;
!x&lt;br /&gt;
!x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Display-Einstellungen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann festgelegt werden, ob die Kommunikation mit dem LCD im 4 Bit oder 8 Bit Modus erfolgen soll.&lt;br /&gt;
&lt;br /&gt;
*B = 0: 4-Bit-Bus&lt;br /&gt;
*B = 1: 8-Bit-Bus&lt;br /&gt;
&lt;br /&gt;
*N = 0: 1 Zeile&lt;br /&gt;
*N = 1: 2 Zeilen&lt;br /&gt;
&lt;br /&gt;
*F = 0: 5 × 7 Punkte&lt;br /&gt;
*F = 1: 5 × 10 Punkte&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!B&lt;br /&gt;
!N&lt;br /&gt;
!F&lt;br /&gt;
!x&lt;br /&gt;
!x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Adresse im Zeichensatztabelle setzen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl, kann ein eigenes Zeichen in die Zeichensatztabelle des LCD-Controllers eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!A5&lt;br /&gt;
!A4&lt;br /&gt;
!A3&lt;br /&gt;
!A2&lt;br /&gt;
!A1&lt;br /&gt;
!A0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Adresse im Datenspeicher setzen&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird festgelegt, dass beim Schreiben in das Datenregister mit dem nächsten Befehl an der angegebenen Adresse in den Speicher der geschrieben wird, in dem der Display-Inhalt abgelegt ist.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!A6&lt;br /&gt;
!A5&lt;br /&gt;
!A4&lt;br /&gt;
!A3&lt;br /&gt;
!A2&lt;br /&gt;
!A1&lt;br /&gt;
!A0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Speicher beschreiben&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die anliegenden Daten werden in den zuletzt ausgewählten Speicher geschrieben.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!RS&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
!D7&lt;br /&gt;
!D6&lt;br /&gt;
!D5&lt;br /&gt;
!D4&lt;br /&gt;
!D3&lt;br /&gt;
!D2&lt;br /&gt;
!D1&lt;br /&gt;
!D0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Datei com74hc595_lcd.h ====&lt;br /&gt;
&lt;br /&gt;
Um mit diesen Routinen arbeiten zu können, ist es notwendig, die Bibliothek Porterweiterung über 74HC595 (Ausgang) funktionsfähig vorliegen zu haben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Einige Routinen sind derzeit nur als Prototypen deklariert. Stand: 25.05.2008&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// gibt die Daten über die Standardfunktionen an das LCD weiter&lt;br /&gt;
extern void com74hc595_lcd_nibble( unsigned char d );&lt;br /&gt;
&lt;br /&gt;
// sendet ein Byte in zwei Nibble&lt;br /&gt;
extern void com74hc595_lcd_Byte( unsigned char d );&lt;br /&gt;
&lt;br /&gt;
// sendet ein Kommando an das LCD&lt;br /&gt;
extern void com74hc595_lcd_command(unsigned char d);&lt;br /&gt;
&lt;br /&gt;
// erzeugt den Enable-Puls&lt;br /&gt;
extern void com74hc595_lcd_enable(void);&lt;br /&gt;
&lt;br /&gt;
// übergibt ein einzelnes Zeichen an das LCD&lt;br /&gt;
extern void com74hc595_lcd_data(unsigned char d);&lt;br /&gt;
&lt;br /&gt;
// übergibt eine Zeichenkette an das LCD&lt;br /&gt;
extern void com74hc595_lcd_string(char *data);&lt;br /&gt;
&lt;br /&gt;
// Initialisierung des LCD&lt;br /&gt;
extern void com74hc595_lcd_init(void);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Das LCD wird gelöscht&lt;br /&gt;
extern void com74hc595_lcd_clear(void);&lt;br /&gt;
&lt;br /&gt;
// Der Cursor wird auf Position 0,0 gesetzt&lt;br /&gt;
extern void com74hc595_lcd_home(void);&lt;br /&gt;
&lt;br /&gt;
// Der Cursor wird auf eine konkrete Position gesetzt&lt;br /&gt;
extern void com74hc595_set_cursor(uint8_t x, uint8_t y);&lt;br /&gt;
&lt;br /&gt;
// Hintergrundbeleuchtung einschalten&lt;br /&gt;
extern void com74hc595_lcd_light_on(void);&lt;br /&gt;
&lt;br /&gt;
// Hintergrundbeleuchtung ausschalten&lt;br /&gt;
extern void com74hc595_lcd_light_off(void);&lt;br /&gt;
&lt;br /&gt;
// LCD einschalten&lt;br /&gt;
extern void com74hc595_lcd_on(void);&lt;br /&gt;
&lt;br /&gt;
// LCD ausschalten&lt;br /&gt;
extern void com74hc595_lcd_off(void);&lt;br /&gt;
&lt;br /&gt;
// LCD Cursor einschalten&lt;br /&gt;
extern void com74hc595_cursor_on(void);&lt;br /&gt;
&lt;br /&gt;
// LCD Cursor ausschalten&lt;br /&gt;
extern void com74hc595_cursor_off(void);&lt;br /&gt;
&lt;br /&gt;
// LCD Cursor blinken einschalten&lt;br /&gt;
extern void com74hc595_cursor_flash_on(void);&lt;br /&gt;
&lt;br /&gt;
// LCD Cursor blinken ausschalten&lt;br /&gt;
extern void com74hc595_cursor_flash_off(void);&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU	3686400&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
#ifndef _LCD_H_&lt;br /&gt;
#define _LCD_H_&lt;br /&gt;
&lt;br /&gt;
// LCD Befehle&lt;br /&gt;
 &lt;br /&gt;
#define CLEAR_DISPLAY 0x01&lt;br /&gt;
#define CURSOR_HOME   0x02&lt;br /&gt;
#define LCD_ON        0x0C&lt;br /&gt;
#define CURSOR_ON     0x0A&lt;br /&gt;
#define CURSOR_FLASH  0x09&lt;br /&gt;
&lt;br /&gt;
#define ON  0x01&lt;br /&gt;
#define OFF 0x00&lt;br /&gt;
 &lt;br /&gt;
// Pinbelegung für das LCD, an verwendete Pins anpassen&lt;br /&gt;
 &lt;br /&gt;
#define LCD_PORT	0&lt;br /&gt;
#define LCD_B4		0	// LCD PIN 4 -&amp;gt; 74HC595 PIN 15&lt;br /&gt;
#define LCD_B5		1	// LCD PIN 5 -&amp;gt; 74HC595 PIN 1&lt;br /&gt;
#define LCD_B6		2	// LCD PIN 6 -&amp;gt; 74HC595 PIN 2&lt;br /&gt;
#define LCD_B7		3	// LCD PIN 7 -&amp;gt; 74HC595 PIN 3&lt;br /&gt;
#define LCD_RS		4  	// LCD PIN 4 -&amp;gt; 74HC595 PIN 4&lt;br /&gt;
#define LCD_EN          5	// LCD PIN 6 -&amp;gt; 74HC595 PIN 5&lt;br /&gt;
#define LCD_LIGHT	6       //           -&amp;gt; 74HC595 PIN 6   &lt;br /&gt;
#define LCD_RW      	        // LCD PIN 5 -&amp;gt; auf GND gelegt&lt;br /&gt;
&lt;br /&gt;
extern unsigned char BackLightState;&lt;br /&gt;
extern unsigned char LCDLightState;&lt;br /&gt;
&lt;br /&gt;
#endif /* _LCD_H_ */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datei com74hc595_lcd.c ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;com74hc595.h&amp;quot;&lt;br /&gt;
#include &amp;quot;com74hc595_lcd.h&amp;quot;&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
unsigned char BackLightState = OFF;&lt;br /&gt;
&lt;br /&gt;
void com74hc595_lcd_data( unsigned char d )&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_setBit( LCD_RS );	&lt;br /&gt;
	com74hc595_lcd_Byte( d );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_lcd_nibble( unsigned char d )&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_unsetBit( LCD_B4 );&lt;br /&gt;
	com74hc595_unsetBit( LCD_B5 );&lt;br /&gt;
	com74hc595_unsetBit( LCD_B6 );&lt;br /&gt;
	com74hc595_unsetBit( LCD_B7 );&lt;br /&gt;
	&lt;br /&gt;
	if ( d &amp;amp; 1&amp;lt;&amp;lt;4 ) com74hc595_setBit( LCD_B4 );&lt;br /&gt;
	if ( d &amp;amp; 1&amp;lt;&amp;lt;5 ) com74hc595_setBit( LCD_B5 );&lt;br /&gt;
	if ( d &amp;amp; 1&amp;lt;&amp;lt;6 ) com74hc595_setBit( LCD_B6 );&lt;br /&gt;
	if ( d &amp;amp; 1&amp;lt;&amp;lt;7 ) com74hc595_setBit( LCD_B7 );&lt;br /&gt;
&lt;br /&gt;
	if ( BackLightState == ON ) com74hc595_unsetBit( LCD_LIGHT );&lt;br /&gt;
	if ( BackLightState == OFF ) com74hc595_setBit( LCD_LIGHT );&lt;br /&gt;
&lt;br /&gt;
	com74hc595_out();&lt;br /&gt;
&lt;br /&gt;
   	com74hc595_lcd_enable();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_lcd_Byte( unsigned char d )&lt;br /&gt;
{&lt;br /&gt;
 	com74hc595_lcd_nibble( d );&lt;br /&gt;
	com74hc595_lcd_nibble( d&amp;lt;&amp;lt;4 );&lt;br /&gt;
  	_delay_us( 45 );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_lcd_command( unsigned char d )&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_unsetBit( LCD_RS );	&lt;br /&gt;
  	com74hc595_lcd_Byte( d );&lt;br /&gt;
  	switch( d )&lt;br /&gt;
	{&lt;br /&gt;
    	    case 1:&lt;br /&gt;
    	    case 2:&lt;br /&gt;
    	    case 3: _delay_ms( 2 );&lt;br /&gt;
  	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_lcd_enable(void)&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_setBit( LCD_EN );&lt;br /&gt;
	com74hc595_out();&lt;br /&gt;
    _delay_us(20);                  &lt;br /&gt;
	com74hc595_unsetBit( LCD_EN );&lt;br /&gt;
	com74hc595_out();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_lcd_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Hintergrundbeleuchtung wird abgeschaltet&lt;br /&gt;
	com74hc595_lcd_light_off();&lt;br /&gt;
&lt;br /&gt;
	// warte, damit sich der Kontroller des LCD initialisieren kann&lt;br /&gt;
	_delay_ms( 15 );&lt;br /&gt;
&lt;br /&gt;
   	// muss 3mal hintereinander gesendet werden zur Initialisierung&lt;br /&gt;
   	com74hc595_lcd_nibble(0x30);&lt;br /&gt;
   	_delay_ms(5);&lt;br /&gt;
   	com74hc595_lcd_nibble(0x30);&lt;br /&gt;
   	_delay_us(100);&lt;br /&gt;
   	com74hc595_lcd_nibble(0x30);&lt;br /&gt;
   	_delay_us(100);&lt;br /&gt;
 &lt;br /&gt;
   	// 4 bit mode&lt;br /&gt;
	com74hc595_lcd_nibble(0x20);	&lt;br /&gt;
  	_delay_us( 100 );			    // wait &amp;gt;100æs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   	// 4Bit / 2 Zeilen / 5x7&lt;br /&gt;
   	com74hc595_lcd_command( 0x28 );&lt;br /&gt;
&lt;br /&gt;
	// Display aus&lt;br /&gt;
   	com74hc595_lcd_command( 0x08 ); &lt;br /&gt;
&lt;br /&gt;
	// Display löschen&lt;br /&gt;
   	com74hc595_lcd_clear();&lt;br /&gt;
&lt;br /&gt;
   	// inkrement / kein Scrollen&lt;br /&gt;
   	com74hc595_lcd_command( 0x06 );&lt;br /&gt;
&lt;br /&gt;
  	// Display ein / Cursor aus / kein Blinken&lt;br /&gt;
   	com74hc595_lcd_command( 0x0C ); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_lcd_light_on(void)&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_setBit( LCD_LIGHT );&lt;br /&gt;
	com74hc595_out();&lt;br /&gt;
	BackLightState = ON;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_lcd_light_off(void)&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_unsetBit( LCD_LIGHT );&lt;br /&gt;
	com74hc595_out();&lt;br /&gt;
	BackLightState = OFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void com74hc595_lcd_clear(void)&lt;br /&gt;
{&lt;br /&gt;
        com74hc595_lcd_command( CLEAR_DISPLAY );&lt;br /&gt;
        _delay_ms(5);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_lcd_home(void)&lt;br /&gt;
{&lt;br /&gt;
        com74hc595_lcd_command( CURSOR_HOME );&lt;br /&gt;
        _delay_ms(5);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_set_cursor(uint8_t x, uint8_t y)&lt;br /&gt;
{&lt;br /&gt;
        uint8_t tmp = 0x00;&lt;br /&gt;
 &lt;br /&gt;
        switch (y) &lt;br /&gt;
        {&lt;br /&gt;
            case 1: tmp=0x80+0x00+x; break;    // 1. Zeile&lt;br /&gt;
            case 2: tmp=0x80+0x40+x; break;    // 2. Zeile&lt;br /&gt;
            case 3: tmp=0x80+0x10+x; break;    // 3. Zeile&lt;br /&gt;
            case 4: tmp=0x80+0x50+x; break;    // 4. Zeile&lt;br /&gt;
        }&lt;br /&gt;
        com74hc595_lcd_command(tmp);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void com74hc595_lcd_string(char *data)&lt;br /&gt;
{&lt;br /&gt;
        while(*data) &lt;br /&gt;
	{&lt;br /&gt;
            com74hc595_lcd_data(*data);&lt;br /&gt;
            data++;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datei main.c ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;quot;com74hc595.h&amp;quot;&lt;br /&gt;
#include &amp;quot;com74hc595_LCD.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	com74hc595_init();&lt;br /&gt;
    com74hc595_lcd_init();&lt;br /&gt;
&lt;br /&gt;
    com74hc595_lcd_light_on();&lt;br /&gt;
&lt;br /&gt;
    com74hc595_lcd_data(&#039;T&#039;);&lt;br /&gt;
    com74hc595_lcd_data(&#039;e&#039;);&lt;br /&gt;
    com74hc595_lcd_data(&#039;s&#039;);&lt;br /&gt;
    com74hc595_lcd_data(&#039;t&#039;);&lt;br /&gt;
    com74hc595_set_cursor(0,2);&lt;br /&gt;
 &lt;br /&gt;
    com74hc595_lcd_string(&amp;quot;Hello World!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC589 (Eingang) ===&lt;br /&gt;
=== Porterweiterung ADC ===&lt;br /&gt;
=== Porterweiterung DAC ===&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
Die Downloads der Software enthalten lediglich die Bibliotheksfunktionen. Die entsprechenden Demos werden hier veröffentlicht und können durch Copy und Paste in die jeweilige main.c übernommen werde.&lt;br /&gt;
&lt;br /&gt;
Das Platinenlayout wurde mit SprintLayout erstellt und im PDF-Format gespeichert. Alle Platinen wurden einseitig layoutet. Dadurch müssen Brücken auf der Platine gelegt werden. &lt;br /&gt;
&lt;br /&gt;
Ich habe lange darüber nachgedacht, ob dies Sinn macht. Aber, wenn eine möglichst breite Masse an Personen diese Platinen in eigener Regie erstellen können soll, ist einseitig die beste Lösung.&lt;br /&gt;
&lt;br /&gt;
Um das im PDF hinterlegte Layout zu drucken, ist darauf zu achten, dass&lt;br /&gt;
alle Skalierungen im PDF-Reader ausgeschaltet sind (Seitenanpassung:&lt;br /&gt;
keine). Wird diese Einstellung nicht gewählt, wird das Layout um die&lt;br /&gt;
entsprechende angegebene Skalierung verkleinert!&lt;br /&gt;
&lt;br /&gt;
Die private Nutzung der Sourcecode und der Platinenlayouts ist ausdrücklich gestattet. Eine gewerbliche Nutzung bitte ich mit mir abzustimmen.&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC595 (Ausgang) ===&lt;br /&gt;
&lt;br /&gt;
* Sourcecode: [[Media:Porterweiterung_74HC595.zip|Porterweiterung_74HC595.zip]]&lt;br /&gt;
* Platinenlayout: [[Media:Porterweiterung_74HC595.pdf|Porterweiterung_74HC595.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC595 (LCD) ===&lt;br /&gt;
&lt;br /&gt;
* Sourcecode: [[Media:Porterweiterung_74HC595_lcd.zip|Porterweiterung_74HC595_lcd.zip]]&lt;br /&gt;
* Platinenlayout: [[Media:Porterweiterung_74HC595_lcd.pdf|Porterweiterung_74HC595_lcd.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung über 74HC589 (Eingang) ===&lt;br /&gt;
* Sourcecode: &lt;br /&gt;
* Platinenlayout:&lt;br /&gt;
&lt;br /&gt;
=== Porterweiterung ADC ===&lt;br /&gt;
* Sourcecode: &lt;br /&gt;
* Platinenlayout: &lt;br /&gt;
=== Porterweiterung DAC ===&lt;br /&gt;
* Sourcecode: &lt;br /&gt;
* Platinenlayout:&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Diskussion zu diesem Projekt: http://www.mikrocontroller.net/topic/100684&lt;br /&gt;
&lt;br /&gt;
* Allgemeines zu Porterweiterung : [[Erweiterung von digitalen IO-Ports]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Category:Portexpander]]&lt;/div&gt;</summary>
		<author><name>0:0:0:FFFF:194:175:222:211</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=74737</id>
		<title>Erweiterung von digitalen IO-Ports</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=74737"/>
		<updated>2013-03-21T14:00:48Z</updated>

		<summary type="html">&lt;p&gt;0:0:0:FFFF:194:175:222:211: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für einfache Steueraufgaben werden oft Referenzspannungen benötigt, die man nur relativ langsam oder gar nicht ändern muss. Dafür sollen gfs. keine Chips und weitere Pins am Controller verwendet werden. Um die Zahl der Ports zu erweitern, können folgende Schaltungen eingesetzt werden:&lt;br /&gt;
&lt;br /&gt;
== Schieberegister ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 1.png|thumb|right|320px|Multiplex-PWM als Port-Erweiterung für FPGAs]]&lt;br /&gt;
Die nebenstehende Schaltung besteht aus einem Schieberegister, das mit einem schnellen Taktsignal getrieben wird. Es erzeugt 4 unabhängige digitale Signale, die sich infolge der Dämpfungsglieder nicht schnell mitändern können. Auf diese Weise werden multiplexte PWM-Ausgänge geschaffen, die mit einem 1/4-tel der Taktfrequenz arbeiten. Die Fehlschaltungen, die beim Durchtakten eines neuen Schaltmusters entstehen, können bei der PWM-Generation im FPGA berücksichtigt werden. Um sie als echte digitale Ausgänge nutzen zu können, kann ein Buffer nachgeschaltet werden, der auch als Leistungstreiber agieren kann.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mit Latch==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 2.png|thumb|right|320px|Stabile Zusatzports mit Latch]]&lt;br /&gt;
Ist ein reiner digitaler Ausgang benötigt, der nicht zittern darf, sollte ein Latch eingesetzt werden, das dann mit nur einem der künstlich erzeugten Bits getaktet werden muss. Dazu muessen doppelt soviele Befehlssequenzen ausgegeben werden, wobei das Latch-enable eine 0/1 sehen muss. Es sollte ein Latch mit Schmitt-Trigger-Eingängen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
{Absatz}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Artikel zur PWM-Glättung: [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
&lt;br /&gt;
* Porterweiterung mit SPI : [[Porterweiterung mit SPI]]&lt;br /&gt;
&lt;br /&gt;
* Porterweiterung mit Standard-Chips : [[Porterweiterungen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;/div&gt;</summary>
		<author><name>0:0:0:FFFF:194:175:222:211</name></author>
	</entry>
</feed>