1.1.7 I2C LCD1602

Einführung

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

Komponenten

_images/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.

_images/i2c_lcd.png

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

_images/schematic_i2c_lcd.png

Experimentelle Verfahren

Schritt 1: Bauen Sie die Schaltung auf.

_images/image96.png

Schritt 2: I2C einrichten (siehe I2C-Konfiguration. Wenn Sie I2C eingestellt haben, überspringen Sie diesen Schritt.)

Für Benutzer in C-Sprache

Schritt 3: Verzeichnis wechseln.

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

Schritt 4: Kompilieren.

gcc 1.1.7_Lcd1602.c -lwiringPi

Schritt 5: Ausführen.

sudo ./a.out

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

Bemerkung

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

#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

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.

fd = wiringPiI2CSetup(LCDAddr);

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

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.

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).

Für Python-Sprachbenutzer

Schritt 3: Verzeichnis wechseln.

cd /home/pi/davinci-kit-for-raspberry-pi/python/

Schritt 4: Ausführen.

sudo python3 1.1.7_Lcd1602.py

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

  • Wenn Sie den Fehler FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1' erhalten, müssen Sie sich auf I2C-Konfiguration beziehen, um I2C zu aktivieren.
    • Wenn Sie den Fehler ModuleNotFoundError: No module named 'smbus2' erhalten, führen Sie bitte sudo pip3 install smbus2 aus.

    • Wenn der Fehler OSError: [Errno 121] Remote I/O erscheint, bedeutet dies, dass das Modul falsch verdrahtet oder das Modul defekt ist.

    • 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

Bemerkung

Sie können den folgenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen . Zuvor müssen Sie jedoch zu einem Quellcodepfad wie davinci-kit-for-raspberry-pi/python gehen.

import LCD1602
import time

def setup():
    LCD1602.init(0x27, 1)   # init(slave address, background light)
    LCD1602.write(0, 0, 'Greetings!!')
    LCD1602.write(1, 1, 'from SunFounder')
    time.sleep(2)

def destroy():
    LCD1602.clear()

if __name__ == "__main__":
    try:
        setup()
    except KeyboardInterrupt:
        destroy()

Code Erklärung

import LCD1602

Diese Datei ist eine Open Source-Datei zur Steuerung von I2C LCD1602. Es ermöglicht uns die einfache Verwendung von I2C LCD1602.

LCD1602.init(0x27, 1)

Die Funktion initialisiert das I2C-System mit dem angegebenen Gerätesymbol. Der erste Parameter ist die Adresse des I2C-Geräts, die mit dem Befehl i2cdetect erkannt werden kann (Einzelheiten siehe Anhang). Die Adresse des I2C LCD1602 lautet im Allgemeinen 0x27.

LCD1602.write(0, 0, 'Greetings!!')

Innerhalb dieser Funktion 'Greetings!!' ist das Zeichen, das in der Zeile 0 + 1, Spalte 0 + 1 auf dem LCD gedruckt werden soll. Jetzt können Sie "Greetings! From SunFounder" auf dem LCD angezeigt.

Phänomen Bild

_images/image97.jpeg