AVR Studio-Fehler: „erwartete Deklaration oder Anweisung am Ende der Eingabe“

Ich bin neu in eingebetteten Systemen. Ich schreibe diesen Code und habe versucht, ihn in "AVR Studio" zu kompilieren, aber ich habe einen Fehler und kann ihn nicht korrigieren. Der Fehler lautet: "erwartete Deklaration oder Anweisung am Ende der Eingabe" und verweise auf die letzte Zeile im Code

Bitte helfen Sie mir, die Position dieses Fehlers zu finden

DER CODE :

/*
 * AVRGCC1.c
 *
 * Created: 2/8/2012 1:11:07 PM
 * Author: heha
 */
#define nibble 0 //determine nibble mode if 1 or 8-bit mode if 0
DDRD = 0XFF;
DDRB = 0X07;
#define portfor3pins PORTB
//define EN at PORTB pin no. 0
//define RS at PORTB pin no. 1
//define RW at PORTB pin no. 2
#define port PORTD
//LCD's DB pins deal with port D
//in 8-bit mode connect DB0 to p0 and DB1 to p1 and so on until DB7 to p7
//in nibble mode connect DB4 to p4 and DB5 to p5 and DB6 to p6 and DB7 to p7
#include <avr/io.h>
#include <stdint.h>
#include <string.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
void RS(unsigned char i);
void EN(unsigned char i);
void RW(unsigned char i);
void initialization();
void clearscreen();
void movecursortohome();
void setcursorstate(unsigned char isblinking, unsigned char ison);
void setcursorblink();
void setcursornoblink();
void setcursoron();
void setcursoroff();
void writecharatpos(unsigned char row, unsigned char col, char ch);
void setcursorpos(unsigned char row, unsigned char col);
void writestringatpos(unsigned char row, unsigned char col, const char data[]);

void RS(unsigned char i) {
    if (i == 1)
        portfor3pins |= 0X02;
    else
        portfor3pins &= 0XFD;
}
void EN(unsigned char i) {
    if (i == 1)
        portfor3pins |= 0X01;
    else
        portfor3pins &= 0XFE;
}
void RW(unsigned char i) {
    if (i == 1)
        portfor3pins |= 0X04;
    else
        portfor3pins &= 0XFB;
}
void initialization() {
    _delay_ms(3); //3
    EN(1);
    if (nibble) {
        port = 0X30;
        _delay_ms(1);
        port = 0x00;
        _delay_ms(50);
        port = 0x30;
        _delay_ms(1);
        port = 0x00;
        _delay_ms(10);
        port = 0x30;
        _delay_ms(1);
        port = 0x00;
        _delay_ms(1);
        port = 0x20;
        _delay_ms(1);
        port = 0x00;
        _delay_ms(50);
        RS(0);
        RW(0);
        port = 0X20; //DL=0
        _delay_ms(1);
        port = 0X80; //N=1,F=0
        _delay_ms(1);
        port = 0X00;
        _delay_ms(1);
        port = 0X80; //D=C=B=0
        _delay_ms(1);
        port = 0X00;
        _delay_ms(1);
        port = 0XF0;
        _delay_ms(1);
        port = 0X00;
        _delay_ms(1);
        port = 0X60; //S=0,I/D=1
        _delay_ms(1);
        port = 0X00;
        _delay_ms(1);
        port = 0X10;
        _delay_ms(50);
    } else {
        port = 0x30;
        _delay_ms(50);
        port = 0x30;
        _delay_ms(10);
        port = 0x30;
        _delay_ms(1);
        port = 0x30;
        _delay_ms(50);
        RS(0);
        RW(0);
        port = 0X38; //DL=1,N=1,F=0
        _delay_ms(1);
        port = 0X08;//D=C=B=0
        _delay_ms(1);
        port = 0X0F;
        _delay_ms(1);
        port = 0X06;//S=0,I/D=1
        _delay_ms(1);
        port = 0X01;
        _delay_ms(50);
    }
}
void clearscreen() {
    EN(1);
    RS(0);
    RW(0);
    if (nibble) {
        port = 0X00;
        _delay_ms(1);
        port = 0X10;
    } else
        port = 0X01;
    _delay_ms(1);
}
void movecursortohome() {
    EN(1);
    RS(0);
    RW(0);
    if (nibble) {
        port = 0X00;
        _delay_ms(1);
        port = 0X30;
    } else
        port = 0X03;
    _delay_ms(2);
}
void setcursorstate(unsigned char isblinking, unsigned char ison) {
    RS(0);
    RW(0);
    EN(1);
    if ((isblinking == 0) && (ison == 0)) {
        if (nibble) {
            port = 0x00;
            _delay_ms(1);
            port = 0xC0;
        } else
            port = 0x0C;
    } else if ((isblinking == 1) && (ison == 0)) {
        if (nibble) {
            port = 0X00;
            _delay_ms(1);
            port = 0XD0;
        } else
            port = 0X0D;
    } else if ((isblinking == 0) && (ison == 1)) {
        if (nibble) {
            port = 0X00;
            _delay_ms(1);
            port = 0XE0;
        } else
            port = 0X0E;
    } else {
        if (nibble) {
            port = 0X00;
            _delay_ms(1);
            port = 0XF0;
        } else
            port = 0X0F;
    }
    _delay_ms(1);
}
void setcursorblink() {
    RS(0);
    RW(0);
    EN(1);
    port &= 0x0f;
    _delay_ms(1);
    if (!nibble)
        port |= 0x09;
    else if (nibble)
        port |= 0x90;
    _delay_ms(1);
}
void setcursornoblink() {
    RS(0);
    RW(0);
    EN(1);
    if (!nibble) {
        port &= 0X0E;
        _delay_ms(1);
        port |= 0X08;
    } else if (nibble) {
        port = 0x00;
        _delay_ms(1);
        port |= 0x80;
    }
    _delay_ms(1);
}
void setcursoron() {
    RS(0);
    RW(0);
    EN(1);
    port &= 0x0f;
    _delay_ms(1);
    if (!nibble)
        port |= 0X0A;
    else if (nibble)
        port |= 0XA0;
    _delay_ms(1);
}
void setcursoroff() {
    RS(0);
    RW(0);
    EN(1);
    if (!nibble) {
        port &= 0X0D;
        _delay_ms(1);
        port |= 0X08;
    } else if (nibble) {
        port = 0X00;
        _delay_ms(1);
        port |= 0X80;
    }
    _delay_ms(1);
}
void writecharatpos(unsigned char row, unsigned char col, char ch)
{
    char pos, i, y, z;
    RS(0);
    RW(0);
    EN(1);
    if (row == 0) {
        pos = 0X80 + col; //in fact I don't use this variable later
        movecursortohome();
        for (i = 0; i < col; i++) {
            if (!nibble) {
                port &= 0XFE;
                _delay_ms(1);
                port |= 0X06;
                _delay_ms(1);
                port = 0X14;
            } else if (nibble) {
                port = 0X00;
                _delay_ms(1);
                port = 0X60;
                _delay_ms(1);
                port = 0X10;
                _delay_ms(1);
                port = 0X40;
            }
        }
    } else if (row == 1) {
        pos = 0XC0 + col; //in fact I don't use this variable later
        if (nibble) {
            port = 0XC0;
            _delay_ms(1);
            port = 0X00;
        } else if (!nibble)
            port = 0XC0;
        for (i = 0; i < col; i++) {
            if (!nibble) {
                port &= 0XFE;
                _delay_ms(1);
                port |= 0X06;
                _delay_ms(1);
                port = 0X14;
            }

            else if (nibble) {
                port = 0X00;
                _delay_ms(1);
                port = 0X60;
                _delay_ms(1);
                port = 0X10;
                _delay_ms(1);
                port = 0X40;
            }
        }
        _delay_ms(1);
        RS(1);
        if (!nibble)
            port = ch;
        else {
            z = ch;
            y = ch;
            for (i = 0; i <3;i++)
                z << 1;
            port = y;
            _delay_ms(1);
            port = z;
        }
        _delay_ms(1);
    }
    void setcursorpos(unsigned char row, unsigned char col) {
        char i;
        RS(0);
        RW(0);
        EN(1);
        if (row == 0)
            movecursortohome();
        else if (row == 1) {
            if (nibble) {
                port = 0XC0;
                _delay_ms(1);
                port = 0X00;
            } else
                port = 0XC0;
        }
        _delay_ms(1);
        for (i = 0; i < col; i++) {
            if (!nibble)
                port = 0X14;
            else {
                port = 0X10;
                _delay_ms(1);
                port = 0x40;
            }
        }
    }
    void writestringatpos(unsigned char row, unsigned char col,
            const char data[]) {
        char length, i, z, y;
        if (row == 0)
            movecursortohome();
        else if (row == 1) {
            if (nibble) {
                port = 0XC0;
                _delay_ms(1);
                port = 0X00;
            } else
                port = 0XC0;
        }
        _delay_ms(1);
        for (i = 0; i < col; i++) {
            if (!nibble)
                port = 0X14;
            else {
                port = 0X10;
                _delay_ms(1);
                port = 0X40;
            }
        }
        _delay_ms(1);
        length = strlen(data);
        RS(1);
        for (i = 1; i <= length; i++) {
            if (!nibble) {
                port = data[i];
                _delay_ms(1);
                port &= 0XFE;
                _delay_ms(1);
                port |= 0X06;
                _delay_ms(1);
                port = 0X14;
            } else {
                z = data[i];
                y = data[i];
                for (i = 0; i <3;i++)
                    z << 1;
                port = y;
                _delay_ms(1);
                port = z;
                _delay_ms(1);
                port = 0x00;
                _delay_ms(1);
                port = 0x60;
                _delay_ms(1);
                port = 0x10;
                _delay_ms(1);
                port = 0x40;
            }
        }
        _delay_ms(1);
    }

    int main(void) {
        initialization();

        /*while(1)
         {

         }*/
    }
Wenn Sie Code posten, verwenden Sie bitte die mit gekennzeichnete Code-Schaltfläche, um { }den Code korrekt zu formatieren. Wenn Sie den Code einfügen, wählen Sie ihn aus und klicken Sie auf die Schaltfläche.
Überprüfen Sie auch Ihren ursprünglichen Quellcode auf das Vorkommen des Zeichens . Bei manchen Tastaturlayouts kann es vorkommen, dass Sie versuchen, etwas einzugeben, <3und das könnte den Compiler stören. Überprüfen Sie auch, ob die Klammern und geschweiften Klammern korrekt sind. Das sieht für mich meistens nach einem einfachen Fehler aus, der irgendwo durch einen Tippfehler verursacht wurde.
Das Posten einer massiven Wand aus nicht eingerücktem und unkommentiertem Code ist geradezu unhöflich.
Es ist sehr schwer zu erkennen, was vor sich geht, wenn der Code ohne Einrückung dargestellt wird. Ich habe die ersten paar Blöcke geändert, um ein Beispiel für eine bessere Lesbarkeit zu geben. Es ist auch eine gute Idee, die vollständige Fehlermeldung wie vom Compiler angegeben einzufügen (dh Ausschneiden / Einfügen).
Haben Sie die Arduino-LCD-Bibliothek als Referenz überprüft?

Antworten (1)

Die geschweiften Klammern in writecharatpos passen nicht zusammen.

Um Fehler dieser Art zu finden, fügen Sie Ihren Originalcode in ein Tool mit Quellformatierungshilfe ein und formatieren Sie Ihren Code automatisch.

Nach der Formatierung wird der Fehler auf den ersten Blick deutlich: Die Hauptfunktion steht nicht in Spalte eins, was bedeutet, dass die frühere Funktion nicht korrekt geschlossen ist. Außerdem sagt das erste Suchergebnis in der Fehlermeldung "geschweifte Klammern addieren sich nicht".

Das Formatieren Ihres Codes gilt als bewährte Vorgehensweise. Es hilft Ihnen und anderen, die Sie nach Ihrem Code fragen. Ich formatiere Code während der Eingabe und formatiere ihn auch regelmäßig automatisch.

Sie könnten auch eine Benennungsrichtlinie wie CamelCasing oder so in Betracht ziehen, da WriteCharAtPos so viel besser zu lesen ist.

Das Kommentieren von Code, insbesondere Port-Fiddling, wird ebenfalls als bewährte Vorgehensweise angesehen.

Einige Kommentare dazu, wofür die Verzögerungen beispielsweise bei der Initialisierung gut sind, wären nett. Kommentieren Sie auch, was in den Port geschrieben werden soll. Du wirst es dir in 2 Jahren danken, wenn du dir die Bibliothek anschaust, weil du merkst, dass du sie eines Tages ändern musst.

Kommentare wie _delay_ms(3); //3sind nutzlos. Kommentieren Sie warum, nicht was getan wird.