小弟求解啊,为什么<<左移可以,>>右移为什么不行了!
#include<reg52.h>char a;
unsigned int b,c,flag;
sbit F1 = P2^6;
void main()
{
a = 0xff;
while(1)
{
b = 50000;
c = 50000;
a = a<<1;
P1 = a;
while(b--);
if(a == 0x00)
{
a = 0xfe;
flag = 1;
while(c--);
}
while( flag == 1)
{
a = 0x7f;
b = 1000;
c = 1000;
a >>= 1;
P1 = a;
while(b--);
if(a == 0x00)
{
P1 = 0xfe;
flag = 0;
while(c--);
}
}
}
}
这个是低电平点亮,为什么左移可以,右移不行啊,朋友帮我看看啊!!谢谢了 本帖最后由 y574924080 于 2012-4-17 21:47 编辑
建议排版 弄好一些~~~~~~
然后加上注释 ,
要不没人想看 y574924080 发表于 2012-4-17 21:43 static/image/common/back.gif
建议排版 弄好一些~~~~~~
然后加上注释 ,
嗯, 我去弄一下 本帖最后由 bangbangji 于 2012-4-17 21:56 编辑
我也不想看,不过提醒你一下吧。
<<都是在最低位移入0
>>移入的可能是1,可能是0,也可能是某个标志位
仔细研究一下这个区别,应该就可以搞定了
补充一下,上面有点错误,<<有的也可以移入标志位,像51的汇编里有带标志位的移位,也有循环移位吧。 #include<reg52.h>
unsigned char a;
unsigned int b,c,flag;//声明变量
sbit F1 = P2^6;
void main()
{
a = 0xff; //给a赋值
while(1)
{
b = 50000;
c = 50000;
a = a<<1; //左移一位
P1 = a; //把左移后面数赋值给P1;
while(b--); //延时一段时间
if(a == 0x00) //判断是循环完毕
{
a = 0xfe; //再重新赋值
flag = 1; //标志位赋值1
while(c--); //延时一段时间
}
while( flag == 1) //判断标志位是否为1
{
a = 0x7f; //赋值
b = 1000;
c = 1000;
a >>= 1; //右移一位
P1 = a; //赋值给P1
while(b--);
if(a == 0x00)//判断是否循环完毕
{
P1 = 0xfe;//P1口重新赋值
flag = 0; //标志位置0
while(c--); //延时一段时间
}
}
}
} 可以用这个编辑代码 ~~~~~~~~~~~~~~~
bangbangji 发表于 2012-4-17 21:51 static/image/common/back.gif
我也不想看,不过提醒你一下吧。
移入的可能是1,可能是0,也可能是某个标志位
仔细研究一下这个区别,应该 ...
为什么左移与右移有什么差别吗??? 左移可以为什么右移不行啊,我似乎找不到原因啊! 本帖最后由 徐照林 于 2012-4-17 22:04 编辑
#include<reg52.h>
unsigned char a;
unsigned int b,c,flag;//声明变量
sbit F1 = P2^6;
void main()
{
a = 0xff; //给a赋值
while(1)
{
b = 50000;
c = 50000;
a = a<<1; //左移一位
P1 = a; //把左移后面数赋值给P1;
while(b--); //延时一段时间
if(a == 0x00) //判断是循环完毕
{
a = 0xfe; //再重新赋值
flag = 1; //标志位赋值1
while(c--); //延时一段时间
}
while( flag == 1) //判断标志位是否为1
{
a = 0x7f; //赋值
b = 1000;
c = 1000;
a >>= 1; //右移一位
P1 = a; //赋值给P1
while(b--);
if(a == 0x00)//判断是否循环完毕
{
P1 = 0xfe;//P1口重新赋值
flag = 0; //标志位置0
while(c--); //延时一段时间
}
}
}
} 23行每次执行都赋值0x7f
26行移位一次,所以现象一样 啊 y574924080 发表于 2012-4-17 22:06 static/image/common/back.gif
23行每次执行都赋值0x7f
26行移位一次,所以现象一样 啊
那我不要P1=0X7F,应该就正常的吗???,我这种写法有错误吗!! 徐照林 发表于 2012-4-17 22:10 static/image/common/back.gif
那我不要P1=0X7F,应该就正常的吗???,我这种写法有错误吗!!
当右移位到a=0x00时,
退出循环,然后左移位a还是等于0x00
继续进入右移循环 我这种写法有错误吗!!
get a decent C book and read about type promotion.
I think what this discussion highlights is the shocking but general lack of understanding of C the language. while( flag == 1) //判断标志位是否为1
{
a = 0x7f; //赋值
...
a >>= 1; //右移一位
...
if(a == 0x00)//判断是否循环完毕
{
...
}
}简化了一下右移循环的代码,自己找死循环原因。 在循环里{赋值-移位-显示}#include<reg52.h>
unsigned char a;
unsigned int b,c,flag;//声明变量
sbit F1 = P2^6;
void main()
{
a = 0xff; //给a赋值
while(1)
{
b = 50000;
a = a<<1; //左移一位
P1 = a; //把左移后面数赋值给P1;
while(b--); //延时一段时间
if(a == 0x00) //判断是循环完毕
{
a = 0xff; //再重新赋值
flag = 1; //标志位赋值1
}
while( flag == 1) //判断标志位是否为1
{
b = 10000;
a >>= 1; //右移一位
P1 = a; //赋值给P1
while(b--);
if(a == 0x00)//判断是否循环完毕
{
flag = 0; //标志位置0
a=0xff;
}
}
}
}
页:
[1]