单片机c程序问题

#include<reg51.h>
#define uchar unsigned char

void main()
{
char i,t,ff;
while(1)
{
// t=P1;
// i=P1&0x0f;

i=P1&0x0f;
switch(i)
{
case 0: P0=0x00; break;
case 1: P0=0x10; break;
default: break;
}
while(P1==0xef);

}
}

如果在keil中能正常编译,但在调试时;i值不变化,我把switch语句修改后;
i=P1&0x0f;
switch(i)
变成 switch(i=P1&0x0f)
程序能正常运行,请高手指点;如果问题解决,再追加分数;

1.程序中没有哪条语句让P1的值改变过,所以i(=P1&0x0f)自然也不会改变。
2.i是符号变量,对应于8位二进制数,而switch中的两种情况都是没法跟它对应上的。所以switch就没有执行过
3.复位后各I/O为0xFF,所以P0,P1保持为0xFF.
这样子改(i要有个初值)就变了,不过不知道这有什么用,因为P0,P1的值还是没变化过。呵呵
#include<reg51.h>
#define uchar unsigned char

void main()
{
//char t,ff;
uchar i=0xff;
while(1)
{
// t=P1;
// i=P1&0x0f;

i=P1&0x0f;

switch(i)
{
case 0x0f: P0=0x00; break;
case 0x00: P0=0x10; break;
default: break;
}
while(P1==0xef);

}
}

参考资料:qingtao1017的大脑,哈哈!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-10-07
我觉得你第一种写法没有错啊!i不变化是不是因为P1口没有变化啊?
第2个回答  2008-10-07
如果你能看懂汇编程序,建议你看看编译后产生的汇编的程序。
因为整个程序只有一个用到的临时变量i,编译后并没有一个具体的RAM地址来指向这个变量i,而是用的累加器A来代替。你如果改i为全局变量就不存在问题了。或者把其它的变量t,ff的值也用来起,例如:
t=ff+i;

i=P1&0x0f;
因为此时有多个变量了,不可能全用A来代替,就不存在问题。
最后的建议:平时多看看编译后的汇编程序。这样才能写出更简短,更可靠的程序。