MSP430 LCD-Schnittstelle über I2C

Ich bin neu darin. Ich versuche, ein 1602A-LCD-Display über PCF8574 mit MSP430G2553 zu verbinden. Wenn ich den Code ausführe, passiert nichts:

#include <msp430.h>

unsigned int *ptxData;
unsigned int count = 0;
// [0..3] -> power on, [4..5] -> function set, [6..7] -> display off, cursor off, blink off
// [8..9] -> clear screen, [10..11] -> right, do not shift, [12..13] -> display on, cursor on
// [14..15] -> write char 'B'
unsigned int txData[] = {0x03, 0x03, 0x03, 0x02, 0x02, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0F, 0x24, 0x22};

void main() {
    WDTCTL = WDTPW | WDTHOLD;

    // for i2c pins
    P1SEL = 0xC0;
    P1SEL2 = 0xC0;

    // i2c config
    UCB0CTL1 |= UCSWRST;
    UCB0CTL0 = UCMST | UCMODE_3 | UCSYNC;
    UCB0CTL1 = UCSSEL_3;
    UCB0BR0 = 12;
    UCB0BR1 = 0;
    UCB0I2CSA = 0x27;   // slave address
    UCB0CTL1 &= ~UCSWRST;

    // enable tx interrupt
    IE2 |= UCB0TXIE;
    _enable_interrupts();

    // start to transmit data
    ptxData = txData;
    UCB0CTL1 |= UCTR + UCTXSTT;

    while (1);
}

#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void){
    // send txData elements one by one
    UCB0TXBUF = *ptxData;
    count++;
    *ptxData++;

    // if txData ends, start from beginning
    if (count == 16) {
        count = 0;
        ptxData -= 16;
    }
}

Was fehlt mir, können Sie mir helfen?

Antworten (1)

Dem Code fehlen offensichtlich Kommentare, was er tut. Wenn es Kommentare dazu hätte, was es tut oder tun soll, wäre es klarer, herauszufinden, was falsch ist.

Zunächst wird der Sendedatenzeiger auf Null initialisiert, sodass er Mülldaten anstelle von Daten aus dem Sendedatenarray sendet.

Das zweite Problem besteht darin, dass das Array nur Befehlsbytes enthält, die an LCD gesendet werden müssen. Sie werden nur auf GPIO-Expander-Datenpins geladen, aber die LCD-RS-, RW- und E-Leitungen werden an keinem Punkt für jedes Befehls-Nibble gesetzt, sodass die Befehle nicht auf das LCD übertragen werden.

Richtig, ich hätte Kommentare hinzufügen sollen, mein Fehler. Ich habe den Datenzeiger repariert. Aber der I2C-Bus ist 8-Bit. Wenn ich RW-, E-, RS-Bits hinzufüge, beträgt die Datenlänge 10 Bits. Wie kann ich 10-Bit senden?
Das LCD ist mit 4 Datenbits mit dem Expander verbunden. Drei weitere Erweiterungsbits sind die LCD-Steuerbits. Es bleibt ein Bit übrig, das entweder nicht verwendet wird oder die Hintergrundbeleuchtung steuert. Sehen Sie sich einfach die Schemata des Erweiterungsmoduls an.
Ich habe Kommentare bearbeitet und hinzugefügt. Jetzt sende ich Daten per RS ​​+ R/W + DB7/4, dann RS + R/W + DB3/0. Aber es passiert nichts, außer dass der Bildschirm zu unsicheren Zeiten ein- und ausgeschaltet wird.
Es bringt wenigstens etwas. Vielleicht schalten Sie E nicht richtig um?
E umschalten? Wie kann ich E umschalten? Entschuldigung, ich bin neu in diesen.
Du hast zwei unterschiedliche Probleme. Es spielt keine Rolle, welche Sie zuerst lösen. Ein Problem besteht darin, wie Sie einen der GPIO-Expander-Pins auf den gewünschten Zustand einstellen und steuern können. Das zweite Problem ist, wie Sie wissen müssen, wie Sie die LCD-Pins ansteuern müssen, um etwas richtig darauf zu schreiben. Daher müssen Sie wissen, welcher IO-Expander-Pin mit welchem ​​LCD-Pin verbunden ist. Vielleicht haben Sie eine Dokumentation oder Schaltpläne des I2C-Expander-Boards oder ein Datenblatt für den I2C-Expander-Chip. Und ein Datenblatt für das LCD-Display.