5146|14

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

多个源文件使用全局变量发生的错误 [复制链接]

main.c 文件
#include "menu.h"
volatile unsigned char key=0;
void INT1_Key() interrupt 2
{
   get(key);
}
main()
{
   menu();
}

main.h文件
#ifndef _main_h_
#define _main_h_
extern volatile unsigned char key;
#endif

menu.c文件
#include "main.h"
void menu()
{
  for(;;)
  {
   switch (key)
   {
    case 1:
          表达式1;
          表达式2;
          表达式3;
          break;
    case 2:
          .....
          break;
    ......
    case 9:
          .....
          break;
    default:
          .....
          break;
    }
   }
}

menu.h文件
#ifndef _menu_h_
#define _menu_h_
void menu();
#endif


出现错误:当key=0x01,进入case 1,执行表达式1、表达式2、break,之后进入case 9执行,也就是说跳过了case 1中break之前的表达式3,而且奇怪地进入case 9,而key=0x01。

最新回复

等待牛人来答.  详情 回复 发表于 2008-5-1 06:55
点赞 关注

回复
举报

51

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你表达式2是啥啊?
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
表达式1:i++;
表达式2:i++;
表达式3:i++;
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
好像和全局变量无关,我在menu()函数里定义一个unsigned char k=1,结果却k!=1,依然是不执行break之前一句表达式。会不会是堆栈溢出之类的问题?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
当我把case的情况减少到2种以后,就运行正常,3种情况以上就不正常。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
以下C代码:
switch (k)
{
    case 1:
        h++;   
        h++;   
        break;
    case 2:
        h++;
        h++;
        break;
    case 3:
        h++;
        h++;
        break;
    default:
        break;
}
编译成汇编:
   207: switch (k)
C:0x0FDA    900012   MOV      DPTR,#0x0012
C:0x0FDD    E0       MOVX     A,@DPTR
C:0x0FDE    FE       MOV      R6,A
C:0x0FDF    A3       INC      DPTR
C:0x0FE0    E0       MOVX     A,@DPTR
C:0x0FE1    FF       MOV      R7,A
C:0x0FE2    EE       MOV      A,R6
C:0x0FE3    70F5     JNZ      C:0FDA
C:0x0FE5    EF       MOV      A,R7
C:0x0FE6    24FE     ADD      A,#0xFE
C:0x0FE8    6009     JZ       C:0FF3
C:0x0FEA    14       DEC      A
C:0x0FEB    6011     JZ       C:0FFE
C:0x0FED    2402     ADD      A,#0x02
C:0x0FEF    70E9     JNZ      C:0FDA
   208: {
   209:     case 1:
   210:         h++;  
   211:         h++;           <-------|         
   212:         break;                 |
C:0x0FF1    8000     SJMP     C:0FF3   |         
                                       |--------------------出现错误
   213:     case 2:
   214:         h++;
C:0x0FF3    900011   MOV      DPTR,#0x0011
C:0x0FF6    E0       MOVX     A,@DPTR
C:0x0FF7    04       INC      A
C:0x0FF8    F0       MOVX     @DPTR,A
   215:         h++;
C:0x0FF9    E0       MOVX     A,@DPTR
C:0x0FFA    04       INC      A
C:0x0FFB    F0       MOVX     @DPTR,A
   216:         break;
C:0x0FFC    80DC     SJMP     C:0FDA
   217:     case 3:
   218:         h++;
C:0x0FFE    900011   MOV      DPTR,#0x0011
C:0x1001    E0       MOVX     A,@DPTR
C:0x1002    04       INC      A
C:0x1003    F0       MOVX     @DPTR,A
   219:         h++;
C:0x1004    E0       MOVX     A,@DPTR
C:0x1005    04       INC      A
C:0x1006    F0       MOVX     @DPTR,A
   220:         break;
C:0x1007    80D1     SJMP     C:0FDA
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
LZ看了SWITCH的处理,没有啥问题

你还是看看,你中断的处理吧....

如果不用中断

我这边编译出的SWITCH是正常的...


呵呵
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
是否启用了优化编译?做一次不优化编译试一试.
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
有些时候仿真器不完全可靠哦,烧个片子试试。要么是你的SP太小,把它设得大一点。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
你可以试着把判断条件的key
换成临时变量
比如在main()
tmpKey = key;
switch(tmpKey)
{
...
}
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
对了。。。

初始化

LZ要不在MAIN执行进行赋值一下看看

呵呵
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
这里太没有人气了,是我们不够活跃,还是搞这行的人太少了呢?
我狂顶!
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

13
 
这一版块,太没人气了,是不是大家都成大侠了

如果成大侠了,也常回家看看嘛,家里太冷清了

据说努力顶帖也是一种美德,但我只想大家常回家看看

毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
我也想了解,谢谢LZ.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
等待牛人来答.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表