使用 MPLAB X IDE C18 编译器编译我的 Microchip PIC18f4550 USB 项目时出现问题。编译器一直高亮 "syntax error" 并且不会编译

Trouble Compiling my Microchip PIC18f4550 USB project using MPLAB X IDE C18 compiler. The compiler keep highlighting "syntax error" and won't compile

我无法使用 MPLAB X IDE C18 编译器编译我的代码。下面的 link 是我 error.As 的打印屏幕图片的 link 你可以看到 IDE 说语句 LED3 = 0;[ 有语法错误=15=]

PrintScreen of Error

我在这里附上代码

// includes ///////////////////////////////////////////////////////////////////////////////////////
#include<p18f4550.h>
#include "USBFunctions.h"


// chip config ////////////////////////////////////////////////////////////////////////////////////
                    // clock options, see 18F4550 data sheet figure 2-1 "clock diagram" for explanation
#pragma config PLLDIV = 5               // 20 MHz external clock / PLL prescaler value of 5 = 4 MHz required input to PLL circuit
#pragma config CPUDIV = OSC1_PLL2       // non-PLL postscale / 1 OR PLL postscale / 2 for CPU clock speed, depending on FOSC setting below
#pragma config USBDIV = 2               // USB clock source = 96 MHz PLL source / 2, (full-speed USB mode)

                        // if desired, could change this line to "FOSC = HS" & "oscillator postscaler" gate would be used 
                        // (not the "PLL postscaler" gate), CPU speed would be 20MHz, USB circuitry would still receive 48Mhz clock
#pragma config FOSC = HSPLL_HS          // use high-speed external osc crystal, & use PLL postscaler gate to feed CPU (CPU speed = 48 MHz)

                    // now the other less confusing options . . .
#pragma config FCMEN = OFF              // fail-safe clock monitor disabled
#pragma config IESO = OFF               // internal / external osc switchover bit disabled
#pragma config PWRT = OFF               // power-up timer disabled
#pragma config BOR = OFF                // brown-out reset disabled in hardware & software
#pragma config BORV = 3                 // brown-out reset voltage bits, does not matter since brown-out is disabled 
#pragma config VREGEN = ON              // USB voltage regulator enabled (If using USB, capacitor goes on pin 18 (VUSB))
#pragma config WDT = OFF                // watchdog timer disabled
#pragma config WDTPS = 32768            // watchdog timer postscale, does not matter since watchdog timer is disabled
#pragma config CCP2MX = ON              // use RC1 (pin #16) as CCP2 MUX (this is the default pin for CCP2 MUX)
#pragma config PBADEN = OFF             // RB0, RB1, RB2, RB3, & RB4 are configured as digital I/O on reset
#pragma config LPT1OSC = OFF            // disable low-power option for timer 1 (timer 1 in regular mode)
#pragma config MCLRE = OFF              // master clear disabled, pin #1 is for VPP and / or RE3 use
#pragma config STVREN = ON              // stack full/underflow will cause reset
#pragma config LVP = OFF                // single-supply ICSP disabled
#pragma config ICPRT = OFF              // in-circuit debug/programming port (ICPORT) disabled, this feature is not available on 40 pin DIP package
#pragma config XINST = OFF              // instruction set extension and indexed addressing mode disabled (this is the default setting)
#pragma config DEBUG = OFF              // background debugger disabled, RA6 & RB7 configured as general purpose I/O pins
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF           // code protection bits off
#pragma config CPB = OFF                // boot block code protection off
#pragma config CPD = OFF                // data EEPROM code protection off
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF       // write protection bits off
#pragma config WRTC = OFF               // config registers write protection off
#pragma config WRTB = OFF               // boot block is not write protected
#pragma config WRTD = OFF               // data EEPROM is not write protected
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF   // table read protection bits off
#pragma config EBTRB = OFF              // boot block table read protection off

// #defines ///////////////////////////////////////////////////////////////////////////////////////
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS  0x1008          // these are necessary to accommodate the special linker file,
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS   0x1018          // do not change these !!

#define SWITCH1 PORTAbits.RA1;
#define SWITCH2 PORTAbits.RA2;

#define LED1 PORTBbits.RB1;
#define LED2 PORTBbits.RB2;
#define LED3 PORTBbits.RB3;

#define LED1_ON 0x01;
#define LED1_OFF 0x00;

#define LED2_ON 0x01;
#define LED2_OFF 0x00;

#define LED3_ON 0x01;
#define LED3_OFF 0x00;

#define SWITCH1_ON 0x01;
#define SWITCH1_OFF 0x00;

#define SWITCH2_ON 0x01;
#define SWITCH2_OFF 0x00;

// global variables ///////////////////////////////////////////////////////////////////////////////
extern BYTE g_USBDeviceState;
extern BYTE g_fromHostToDeviceBuffer[65];
extern BYTE g_fromDeviceToHostBuffer[65];

        // format for g_fromHostToDeviceBuffer[]
        // 
        // byte - purpose
        // -------------------------------------
        //  0 - do NOT use this for data, this is initialized to zero in USBstuff.c, leave as is (part of USB protocol)
        //  1 - LED1 state
        //  2 - LED2 state
        //  3 - LED3 state
        //  4 - unused
        //  5 - unused
        //  6 - unused
        //  7 - unused
        //  8 - usused
        //  9 - unused
        // 10 - unused
        // 11 - unused
        // 12 - unused
        // 13 - unused
        // 14 - usused
        // 15 - unused
        // 16 - unused
        // 17 - unused
        // 18 - unused
        // 19 - unused
        // 20 - usused
        // 21 - unused
        // 22 - unused
        // 23 - unused
        // 24 - unused
        // 25 - unused
        // 26 - usused
        // 27 - unused
        // 28 - unused
        // 29 - unused
        // 30 - unused
        // 31 - usused
        // 32 - unused
        // 33 - unused
        // 34 - unused
        // 35 - unused
        // 36 - unused
        // 37 - usused
        // 38 - unused
        // 39 - unused
        // 40 - unused
        // 41 - unused
        // 42 - unused
        // 43 - usused
        // 44 - unused
        // 45 - unused
        // 46 - unused
        // 47 - unused
        // 48 - unused
        // 49 - usused
        // 50 - unused
        // 51 - unused
        // 52 - unused
        // 53 - unused
        // 54 - unused
        // 55 - usused
        // 56 - unused
        // 57 - unused
        // 58 - unused
        // 59 - unused
        // 60 - unused
        // 61 - usused
        // 62 - unused
        // 63 - unused
        // 64 - unused

        // format for g_fromDeviceToHostBuffer[]
        // 
        // byte - purpose
        // -------------------------------------
        //  0 - do NOT use this for data, this is initialized to zero in USBstuff.c, leave as is (part of USB protocol)
        //  1 - SWITCH1 state
        //  2 - SWITCH2 state
        //  3 - unused
        //  4 - unused
        //  5 - unused
        //  6 - unused
        //  7 - unused
        //  8 - usused
        //  9 - unused
        // 10 - unused
        // 11 - unused
        // 12 - unused
        // 13 - unused
        // 14 - usused
        // 15 - unused
        // 16 - unused
        // 17 - unused
        // 18 - unused
        // 19 - unused
        // 20 - usused
        // 21 - unused
        // 22 - unused
        // 23 - unused
        // 24 - unused
        // 25 - unused
        // 26 - usused
        // 27 - unused
        // 28 - unused
        // 29 - unused
        // 30 - unused
        // 31 - usused
        // 32 - unused
        // 33 - unused
        // 34 - unused
        // 35 - unused
        // 36 - unused
        // 37 - usused
        // 38 - unused
        // 39 - unused
        // 40 - unused
        // 41 - unused
        // 42 - unused
        // 43 - usused
        // 44 - unused
        // 45 - unused
        // 46 - unused
        // 47 - unused
        // 48 - unused
        // 49 - usused
        // 50 - unused
        // 51 - unused
        // 52 - unused
        // 53 - unused
        // 54 - unused
        // 55 - usused
        // 56 - unused
        // 57 - unused
        // 58 - unused
        // 59 - unused
        // 60 - unused
        // 61 - usused
        // 62 - unused
        // 63 - unused
        // 64 - unused

// function prototypes ////////////////////////////////////////////////////////////////////////////
void highISR(void);                         // interrupt prototypes
void remappedHighISR(void);                 //
void yourHighPriorityISRCode(void);         //
                                            //
void lowISR(void);                          //
void remappedLowISR(void);                  //
void yourLowPriorityISRCode(void);          //
                                            //
extern void _startup(void);                 //

void yourInit(void);
void yourTasks(void);

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void highISR(void) {
    _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void remappedHighISR(void) {
    _asm goto yourHighPriorityISRCode _endasm
}
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma interrupt yourHighPriorityISRCode
void yourHighPriorityISRCode(void) {
    // check which int flag is set
    // service int
    // clear flag
    // etc.
} // return will be a "retfie fast"
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma code LOW_INTERRUPT_VECTOR = 0x18
void lowISR(void) {
    _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void remappedLowISR(void) {
    _asm goto yourLowPriorityISRCode _endasm
}
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma interruptlow yourLowPriorityISRCode
void yourLowPriorityISRCode(void) {
    // check which int flag is set
    // service int
    // clear int flag
    // etc.
} // return will be a "retfie"
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset(void) {
    _asm goto _startup _endasm
}
#pragma code

///////////////////////////////////////////////////////////////////////////////////////////////////
void main(void) {
    USBInit();              // in USBFunctions.c
    yourInit();             // in this file
    while(1) {
        USBTasks();         // in USBFunctions.c
        yourTasks();        // in this file
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////
void yourInit(void) {
    ADCON1bits.PCFG3 = 1;
    ADCON1bits.PCFG2 = 1;
    ADCON1bits.PCFG1 = 1;
    ADCON1bits.PCFG0 = 1;

    TRISAbits.RA1 = 1;
    TRISAbits.RA2 = 1;

    TRISBbits.RB1 = 0;
    TRISBbits.RB2 = 0;
    TRISBbits.RB3 = 0;

    LED3 = 0;
    LED2 = 0;
    LED1 = 0;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
void yourTasks(void) {


    if(g_USBDeviceState == CONFIGURED_STATE) {

        receiveViaUSB();                                            // read into input buffer
        // process inputs here (check g_fromHostToDeviceBuffer[x])
        if(g_fromHostToDeviceBuffer[1] == LED1_ON) 
        {
            LED1 = 1;
        }
        else if (g_fromHostToDeviceBuffer[1] == LED1_OFF)
        {
            LED1 = 0;
        }

        if(g_fromHostToDeviceBuffer[2] == LED2_ON) {
            LED2 = 1;
        }
        else if (g_fromHostToDeviceBuffer[2] == LED2_OFF)
        {
            LED2 = 0;
        }

        if(g_fromHostToDeviceBuffer[3] == LED3_ON) {
            LED3 = 1;
        }
        else if (g_fromHostToDeviceBuffer[3] == LED3_OFF)
        {
            LED3 = 0;
        }
        // set outputs here (set g_fromDeviceToHostBuffer[x])
        if(SWITCH1 == 0) //switch is press
        {
            g_fromDeviceToHostBuffer[1] = SWITCH1_ON;
        }
        else if(SWITCH1 == 1) //switch is press
        {
            g_fromDeviceToHostBuffer[1] = SWITCH1_OFF;
        }

        if(SWITCH2 == 0) //switch is press
        {
            g_fromDeviceToHostBuffer[2] = SWITCH2_ON;
        }
        else if(SWITCH2 == 1) //switch is press
        {
            g_fromDeviceToHostBuffer[2] = SWITCH2_OFF;
        }
        sendViaUSB();
    }       

}
#define LED1 PORTBbits.RB1;
...
LED1 = 0;

编译器会将LED1替换为PORTBbits.RB1;因此错误=>

PORTBbits.RB1;= 0;

尝试删除;在你定义的末尾。

问题出在预处理器定义后的分号上。

#define LED1 PORTBbits.RB1;
#define LED2 PORTBbits.RB2;
#define LED3 PORTBbits.RB3;
...
...
LED3 = 0;
LED2 = 0;
LED1 = 0;

扩展为:

PORTBbits.RB1; = 0;
PORTBbits.RB2; = 0;
PORTBbits.RB3; = 0;

编辑:@scrapper 抢先一步点击了提交按钮。