徐照林 发表于 2012-4-17 21:41:31

小弟求解啊,为什么<<左移可以,>>右移为什么不行了!

#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:43:35

本帖最后由 y574924080 于 2012-4-17 21:47 编辑

建议排版 弄好一些~~~~~~

然后加上注释 ,

要不没人想看

徐照林 发表于 2012-4-17 21:48:29

y574924080 发表于 2012-4-17 21:43 static/image/common/back.gif
建议排版 弄好一些~~~~~~

然后加上注释 ,


嗯,   我去弄一下

bangbangji 发表于 2012-4-17 21:51:40

本帖最后由 bangbangji 于 2012-4-17 21:56 编辑

我也不想看,不过提醒你一下吧。
<<都是在最低位移入0
>>移入的可能是1,可能是0,也可能是某个标志位
仔细研究一下这个区别,应该就可以搞定了

补充一下,上面有点错误,<<有的也可以移入标志位,像51的汇编里有带标志位的移位,也有循环移位吧。

徐照林 发表于 2012-4-17 21:56:42

#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--); //延时一段时间
      }
   }

   }
}

y574924080 发表于 2012-4-17 22:02:25

可以用这个编辑代码 ~~~~~~~~~~~~~~~

徐照林 发表于 2012-4-17 22:02:39

bangbangji 发表于 2012-4-17 21:51 static/image/common/back.gif
我也不想看,不过提醒你一下吧。
移入的可能是1,可能是0,也可能是某个标志位
仔细研究一下这个区别,应该 ...

为什么左移与右移有什么差别吗??? 左移可以为什么右移不行啊,我似乎找不到原因啊!

徐照林 发表于 2012-4-17 22:03:19

本帖最后由 徐照林 于 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--); //延时一段时间
      }
   }

   }
}

y574924080 发表于 2012-4-17 22:06:41

23行每次执行都赋值0x7f
26行移位一次,所以现象一样 啊

徐照林 发表于 2012-4-17 22:10:29

y574924080 发表于 2012-4-17 22:06 static/image/common/back.gif
23行每次执行都赋值0x7f
26行移位一次,所以现象一样 啊

那我不要P1=0X7F,应该就正常的吗???,我这种写法有错误吗!!

y574924080 发表于 2012-4-17 22:38:48

徐照林 发表于 2012-4-17 22:10 static/image/common/back.gif
那我不要P1=0X7F,应该就正常的吗???,我这种写法有错误吗!!

当右移位到a=0x00时,

退出循环,然后左移位a还是等于0x00

继续进入右移循环

millwood0 发表于 2012-4-17 22:51:19

我这种写法有错误吗!!

get a decent C book and read about type promotion.

millwood0 发表于 2012-4-17 23:05:26

I think what this discussion highlights is the shocking but general lack of understanding of C the language.

gzhuli 发表于 2012-4-17 23:27:19

while( flag == 1) //判断标志位是否为1
{
a = 0x7f;   //赋值
...
a >>= 1;      //右移一位
...
if(a == 0x00)//判断是否循环完毕
{
    ...
}
}简化了一下右移循环的代码,自己找死循环原因。

sniper.q 发表于 2012-4-18 00:19:44

在循环里{赋值-移位-显示}#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]
查看完整版本: 小弟求解啊,为什么<<左移可以,>>右移为什么不行了!