.. note::

    Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

    **Warum beitreten?**

    - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
    - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
    - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
    - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
    - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

    👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!

.. _py_lcd:

1.1.7 I2C LCD1602
======================

Einführung
------------------

LCD1602 ist eine Flüssigkristallanzeige vom Zeichentyp, die gleichzeitig 32 (16 * 2) Zeichen anzeigen kann.

Komponenten
-------------------

.. image:: ../img/list_i2c_lcd.png

Prinzip
-----------

**I2C LCD1602**

Wie wir alle wissen, bereichern LCD und einige andere Anzeiger die Mensch-Maschine-Interaktion erheblich, 
weisen jedoch eine gemeinsame Schwäche auf. Wenn sie mit einem Controller verbunden sind, werden mehrere E / A des Controllers belegt, 
der nicht so viele äußere Ports hat. 
Es schränkt auch andere Funktionen der Steuerung ein. Daher wurde LCD1602 mit einem I2C-Bus entwickelt, um das Problem zu lösen.

.. image:: ../img/i2c_lcd1602.png
    :width: 800

**I2C-Kommunikation**

Der I2C-Bus (Inter-Integrated Circuit) ist ein sehr beliebter und leistungsstarker Bus für die Kommunikation zwischen einem Master-Gerät (oder Master-Geräten) und einem oder mehreren Slave-Geräten.

Der I2C-Hauptcontroller kann zur Steuerung des E / A-Expanders, verschiedener Sensoren, des EEPROM, des ADC / DAC usw. verwendet werden. Alle diese werden nur von den beiden Pins des Hosts gesteuert, der seriellen Datenleitung (SDA1) und der seriellen Taktleitung (SCL1).

Schematische Darstellung
-----------------------------------------

============ ========
T-Karte Name physisch
SDA1         Pin 3
SCL1         Pin 5
============ ========

.. image:: ../img/schematic_i2c_lcd.png


Experimentelle Verfahren
-----------------------------

Schritt 1: Bauen Sie die Schaltung auf.

.. image:: ../img/image96.png
    :width: 800



Schritt 2: I2C einrichten (siehe :ref:`i2c_config`. Wenn Sie I2C eingestellt haben, überspringen Sie diesen Schritt.)


Schritt 3: Verzeichnis wechseln.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/c/1.1.7/

Schritt 4: Kompilieren.

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.1.7_Lcd1602.c -lwiringPi

Schritt 5: Ausführen.

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Nachdem die Kode ausgeführt wurde, werden auf dem LCD \"Greetings\" und \"From SunFounder\" angezeigt.

.. note::

    Wenn es kein Problem mit dem Code und der Verkabelung gibt, aber das LCD immer noch keinen Inhalt anzeigt, können Sie versuchen, das Potentiometer auf der Rückseite zu drehen.

**Code**

.. code-block:: c

    #include <stdio.h>
    #include <wiringPi.h>
    #include <wiringPiI2C.h>
    #include <string.h>

    int LCDAddr = 0x27;
    int BLEN = 1;
    int fd;

    void write_word(int data){
        int temp = data;
        if ( BLEN == 1 )
            temp |= 0x08;
        else
            temp &= 0xF7;
        wiringPiI2CWrite(fd, temp);
    }

    void send_command(int comm){
        int buf;
        // Send bit7-4 firstly
        buf = comm & 0xF0;
        buf |= 0x04;			// RS = 0, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;			// Make EN = 0
        write_word(buf);

        // Send bit3-0 secondly
        buf = (comm & 0x0F) << 4;
        buf |= 0x04;			// RS = 0, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;			// Make EN = 0
        write_word(buf);
    }

    void send_data(int data){
        int buf;
        // Send bit7-4 firstly
        buf = data & 0xF0;
        buf |= 0x05;			// RS = 1, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;			// Make EN = 0
        write_word(buf);

        // Send bit3-0 secondly
        buf = (data & 0x0F) << 4;
        buf |= 0x05;			// RS = 1, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;			// Make EN = 0
        write_word(buf);
    }

    void init(){
        send_command(0x33);	// Must initialize to 8-line mode at first
        delay(5);
        send_command(0x32);	// Then initialize to 4-line mode
        delay(5);
        send_command(0x28);	// 2 Lines & 5*7 dots
        delay(5);
        send_command(0x0C);	// Enable display without cursor
        delay(5);
        send_command(0x01);	// Clear Screen
        wiringPiI2CWrite(fd, 0x08);
    }

    void clear(){
        send_command(0x01);	//clear Screen
    }

    void write(int x, int y, char data[]){
        int addr, i;
        int tmp;
        if (x < 0)  x = 0;
        if (x > 15) x = 15;
        if (y < 0)  y = 0;
        if (y > 1)  y = 1;

        // Move cursor
        addr = 0x80 + 0x40 * y + x;
        send_command(addr);
        
        tmp = strlen(data);
        for (i = 0; i < tmp; i++){
            send_data(data[i]);
        }
    }


    void main(){
        fd = wiringPiI2CSetup(LCDAddr);
        init();
        write(0, 0, "Greetings!");
        write(1, 1, "From SunFounder");
    }

**Code Erklärung**

.. code-block:: 

    void write_word(int data){……}
    void send_command(int comm){……}
    void send_data(int data){……}
    void init(){……}
    void clear(){……}
    void write(int x, int y, char data[]){……}

Diese Funktionen werden zur Steuerung des Open Source-Codes I2C LCD1602 verwendet. 
Sie ermöglichen die einfache Verwendung von I2C LCD1602. 
Unter diesen Funktionen wird ``init()`` zur Initialisierung verwendet, 
``clear()`` wird zum Löschen des Bildschirms verwendet, 
``write()`` wirdzum Schreiben der angezeigten Elemente verwendet und andere Funktionen unterstützen die obigen Funktionen.

.. code-block:: c

    fd = wiringPiI2CSetup(LCDAddr);

Diese Funktion initialisiert das I2C-System mit dem angegebenen Gerätesymbol. Der Prototyp der Funktion:

.. code-block:: c

    int wiringPiI2CSetup(int devId);

Parameter devId ist die Adresse des I2C-Geräts. Sie kann über den Befehl i2cdetect (siehe Anhang) ermittelt werden. Die devId des I2C LCD1602 ist im Allgemeinen 0x27.

.. code-block:: c

    void write(int x, int y, char data[]){}

In dieser Funktion ist ``data[]`` das Zeichen, 
das auf dem LCD gedruckt werden soll, 
und die Parameter x und y bestimmen die Druckposition (Zeile y + 1, Spalte x + 1 ist die Startposition des zu druckenden Zeichens).
