keil里面的if(key1==0)前面加了while(1)此后不管key1是不是等于0,if后面的执行语句都没有反应了

是不是被编译器优化掉了????

key1变量的赋值是在中断程序里吧?如果是这样,变量key1申明时应该加上关键字volatile,如volatile char key1;不加此关键字编译器会把当前局部的key1变量优化成一个寄存器变量,永远不去读取全局变量,你去看看汇编代码就知道了。新手进阶时都会碰到此问题,恭喜你要步入老手行列了!
回答完了才看到你采用降低优化等级来绕过,这是治标不治本的办法,当你程序太大了或其它什么原因需要提高优化等级时你现在采用的办法不可行。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-18
你的key1是什么?是外部中断里改变的变量吗,你敢把中断程序放上来吗?如果是,你是不是没有进中断啊?或者进来中断就没出来了追问

前面有sbit key1= P1^0,问题解决了,确实是if被优化掉了。把优化级别设为1就成功了。

追答

好吧,解决了问题就好

第2个回答  2013-12-18
应该不是,我觉得是单片机执行太快,你的按键效果不好。加上延时试试!追问

我加了while循环的啊.

第3个回答  2013-12-18
这得看你的key1是什么了,这里的key1是要在循环的时候被动态改变的,凡是指向硬件地址或在定时器里改变的都可以,如果不是那就是你这种情况了。你可以调试打断点看看。追问

确实是if被优化掉了。把优化级别设为1就成功了。弄出汇编界面IF被砍了.

追答

这个 你得检查你P1^0的定义有没有volatile关键字了

第4个回答  2013-12-23
我暂时看不出什么门道,但我觉得正一兄的说法很可能,按键我在用的时候都要延时判断是不是真的被按下了,延时20ms
相似回答