搜索
bottom↓
回复: 15

keil编译出错

[复制链接]

出0入0汤圆

发表于 2014-6-10 17:17:41 | 显示全部楼层 |阅读模式
加上下面一段代码出错
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;谁帮看下



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2014-6-10 17:22:31 | 显示全部楼层
LEDDisplay在多个文件中重复定义了————你是把它放在.h文件中的吧?这个.h文件被多个.c文件include了吧?这个.h文件中没有加守卫来防止重复包含吧?

出0入0汤圆

 楼主| 发表于 2014-6-10 17:24:07 | 显示全部楼层
eduhf_123 发表于 2014-6-10 17:22
LEDDisplay在多个文件中重复定义了————你是把它放在.h文件中的吧?这个.h文件被多个.c文件include了吧 ...

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

出0入0汤圆

发表于 2014-6-10 23:25:05 | 显示全部楼层
新手常犯的错误。。这种问题在坛子里太常见了。

出0入0汤圆

发表于 2014-6-10 23:42:14 | 显示全部楼层
这么一段程序
同样一段程序,Keil C51

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

出0入0汤圆

发表于 2014-6-10 23:50:33 | 显示全部楼层
不就是个数字10吗,跟一下啊,看看数值变化

出0入0汤圆

发表于 2014-6-10 23:52:19 | 显示全部楼层
定义为位变量 不能写成  unsigned char LED_A;   要把 char 去了 。正确写法  unsigned LED_A;

出0入0汤圆

发表于 2014-6-11 01:35:21 | 显示全部楼层
Jigsaw 发表于 2014-6-10 23:42
这么一段程序
同样一段程序,Keil C51

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

出0入93汤圆

发表于 2014-6-11 07:19:40 | 显示全部楼层
jx_wwq 发表于 2014-6-10 23:52
定义为位变量 不能写成  unsigned char LED_A;   要把 char 去了 。正确写法  unsigned LED_A; ...

这是挑战编译器规则?

出0入0汤圆

发表于 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;谁帮看下

出0入0汤圆

发表于 2014-6-11 08:41:19 | 显示全部楼层
lswhome 发表于 2014-6-11 01:35
while(--i)而不是while(i--)。。
呵呵

应该不是这个原因

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

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

出0入0汤圆

发表于 2014-6-11 09:37:48 | 显示全部楼层
本帖最后由 qymcs 于 2014-6-11 09:39 编辑

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

出0入0汤圆

发表于 2014-6-11 09:46:54 | 显示全部楼层
Jigsaw 发表于 2014-6-10 23:42
这么一段程序
同样一段程序,Keil C51

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

出0入0汤圆

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

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

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

谢谢

出0入0汤圆

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

谢谢

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

出0入0汤圆

发表于 2014-6-11 22:54:56 | 显示全部楼层
单步跟踪了一晚上
实在想不出为啥在这个子程序里,frames值会被重置成9
  1. void V_Zebra(){
  2.   
  3.   unsigned char x,y;
  4.   LCD_FLM=1;
  5.   //LCD_LP=1;         
  6.   //LCD_LP=0;
  7.   LCD_M=LCD_AC;   
  8.   for(y=0;y<240;y++){                         //LCD_HEIGHT
  9.     for(x=0;x<40;x++){                 //  LCD_WIDTH/8
  10.                 LCD_CP=1;
  11.                 LCD_DATA=0xFF;
  12.                 LCD_CP=0;
  13.                 LCD_CP=1;                                                          
  14.                 LCD_DATA=0x00;
  15.                 LCD_CP=0;
  16.                 }
  17.         LCD_LP=1;         
  18.     LCD_LP=0;
  19.         LCD_FLM=0;
  20.         //delay_us(10);
  21.         }
  22.     LCD_LP=1;         
  23.     LCD_LP=0;
  24.   }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 03:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表