三国小兵 发表于 2014-6-10 17:17:41

keil编译出错

加上下面一段代码出错
union {
unsigned char LEDByte;
struct{
    unsigned char LED_A   :1;//位域   byte型,占1bit 为了节省内存
    unsigned char LED_B   :1;
    unsigned char LED_C   :1;
    unsigned char LED_D   :1;
    unsigned char LED_E   :1;
    unsigned char LED_F   :1;
    unsigned char LED_G   :1;
    unsigned char LED_H   :1;
} LEDBits;
} LEDDisplay;谁帮看下



eduhf_123 发表于 2014-6-10 17:22:31

LEDDisplay在多个文件中重复定义了————你是把它放在.h文件中的吧?这个.h文件被多个.c文件include了吧?这个.h文件中没有加守卫来防止重复包含吧?

三国小兵 发表于 2014-6-10 17:24:07

eduhf_123 发表于 2014-6-10 17:22
LEDDisplay在多个文件中重复定义了————你是把它放在.h文件中的吧?这个.h文件被多个.c文件include了吧 ...

额,是放在.h文件中,我看看,调整下

lcofjp 发表于 2014-6-10 23:25:05

新手常犯的错误。。这种问题在坛子里太常见了。

Jigsaw 发表于 2014-6-10 23:42:14

这么一段程序
同样一段程序,Keil C51

frames=10;
while (frames--){
        V_Zebra();
        LCD_AC=!LCD_AC;
        LED=!LED;
      }
实际调试中发现,frames永远到不了0,一直在这个循环中打转,去不了后面的程序
这个变量只在这段程序中使用,未开任何中断

jx_wwq 发表于 2014-6-10 23:50:33

不就是个数字10吗,跟一下啊,看看数值变化

jx_wwq 发表于 2014-6-10 23:52:19

定义为位变量 不能写成unsigned char LED_A;   要把 char 去了 。正确写法unsigned LED_A;

lswhome 发表于 2014-6-11 01:35:21

Jigsaw 发表于 2014-6-10 23:42
这么一段程序
同样一段程序,Keil C51



while(--i)而不是while(i--)。。
呵呵

takashiki 发表于 2014-6-11 07:19:40

jx_wwq 发表于 2014-6-10 23:52
定义为位变量 不能写成unsigned char LED_A;   要把 char 去了 。正确写法unsigned LED_A; ...

这是挑战编译器规则?

uzufk 发表于 2014-6-11 07:50:29

位域定义要用逗号,而不是分号,如
union {
unsigned char LEDByte;
struct{
    unsigned char LED_A   :1,//位域   byte型,占1bit 为了节省内存
    unsigned char LED_B   :1,
    unsigned char LED_C   :1,
    unsigned char LED_D   :1,
    unsigned char LED_E   :1,
    unsigned char LED_F   :1,
    unsigned char LED_G   :1,
    unsigned char LED_H   :1;
} LEDBits;
} LEDDisplay;谁帮看下

Jigsaw 发表于 2014-6-11 08:41:19

lswhome 发表于 2014-6-11 01:35
while(--i)而不是while(i--)。。
呵呵

应该不是这个原因

--i和i--的差别还是知道的

实际软件仿真发现,frames这个值只倒计数到5,然后直接回到了10

qymcs 发表于 2014-6-11 09:37:48

本帖最后由 qymcs 于 2014-6-11 09:39 编辑

写成 while(i-- > 0) 试试看 或是用for 语句替代下whlie 看看是哪里出的问题

xiaobendan 发表于 2014-6-11 09:46:54

Jigsaw 发表于 2014-6-10 23:42
这么一段程序
同样一段程序,Keil C51



单步执行看看啥时候变的5然后又怎样变成10
另外,吧赋值的那一句放到函数外试试,就是把 变量变成全局的试试

Jigsaw 发表于 2014-6-11 11:56:52

qymcs 发表于 2014-6-11 09:37
写成 while(i-- > 0) 试试看 或是用for 语句替代下whlie 看看是哪里出的问题

都试过
还试着把frames--放到执行段里,while括号内不加任何运算
结果一样

怀疑是全局变量和局部变量造成的,晚上回去试试

谢谢

Jigsaw 发表于 2014-6-11 11:57:20

xiaobendan 发表于 2014-6-11 09:46
单步执行看看啥时候变的5然后又怎样变成10
另外,吧赋值的那一句放到函数外试试,就是把 变量变成全局的 ...

谢谢

想一块了
晚上试试改成全局变量

Jigsaw 发表于 2014-6-11 22:54:56

单步跟踪了一晚上
实在想不出为啥在这个子程序里,frames值会被重置成9void V_Zebra(){

unsigned char x,y;
LCD_FLM=1;
//LCD_LP=1;         
//LCD_LP=0;
LCD_M=LCD_AC;   
for(y=0;y<240;y++){                       //LCD_HEIGHT
    for(x=0;x<40;x++){               //LCD_WIDTH/8
                LCD_CP=1;
                LCD_DATA=0xFF;
                LCD_CP=0;
                LCD_CP=1;                                                          
                LCD_DATA=0x00;
                LCD_CP=0;
                }
        LCD_LP=1;         
    LCD_LP=0;
        LCD_FLM=0;
        //delay_us(10);
        }
    LCD_LP=1;         
    LCD_LP=0;
}
页: [1]
查看完整版本: keil编译出错