如何在Keil V5中修复“乘以定义”

时间:2019-06-03 13:34:27

标签: embedded keil cortex-m lpc

我正在尝试编译我的代码,但是尽管仅在一个标头中定义了变量,但仍收到错误“乘以定义”(例如,“。\ Objects \ LCDADC.axf:错误:L6200E:符号Pin_D6乘以定义(由lcd .o和main.o)。”。

我正在将Keil与LPC1768一起使用

main.c

#include <lpc17xx.h>
#include "LCD.h"
#include "Delay.h"


//Char LCD Pins
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_E P2_2
#define LCD_D4 P2_4
#define LCD_D5 P2_5
#define LCD_D6 P2_6
#define LCD_D7 P2_7

int main(){
    SystemInit();
    Delay_init();
    LCD_Init(LCD_RS, LCD_RW, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);

    int main....

LCD.H

#include "Delay.h"

uint8_t Pin_RS;
uint8_t Pin_RW;
uint8_t Pin_E;
uint8_t Pin_D4;
uint8_t Pin_D5;
uint8_t Pin_D6;
uint8_t Pin_D7;

void LCD_Init(uint8_t rs, uint8_t rw, uint8_t e, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);

....(More functions)

LCD.c

#include "LCD.h"
#include "GPIO.h"
#include "Delay.h"

void LCD_Init(uint8_t rs, uint8_t rw, uint8_t e, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
    //Set Pin Numbers
    Pin_RW = rw;
    Pin_E = e;
    Pin_RS = rs;
    Pin_D4 = d4;
    Pin_D5 = d5;
    Pin_D6 = d6;
    Pin_D7 = d7;

    //Set port Directions
    GPIO_PinDirection(Pin_D4, 1);
    ....(same for every pin and some command sending.)

}

....(Other Functions.)

(很抱歉张贴我的完整代码,但我认为这种情况很重要,而且很简短。)

如您所见,我显然只定义了我的引脚一次。那么为什么认为我要多次定义它?

1 个答案:

答案 0 :(得分:1)

您已在头文件LCD.h中声明了这些变量。每当包含头文件时,这些变量都将被声明。

您已将该文件包含在main.cLCD.c中,这意味着将创建每个变量的两个实例。由于这些变量是全局变量,因此不能两次使用相同的名称。这就是为什么您得到此错误。

要解决此问题,请在LCD.c中移动这些变量。如果您不打算在此C文件之外使用它们,请将它们设置为“静态”。这样一来,它们只限于LCD.c

另一个提示(与错误无关)是您应该使用Include Guards。您的Delay.h被多次收录。