搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 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--);
                }
           }
        }
}

这个是低电平点亮,为什么左移可以,右移不行啊,朋友帮我看看啊!!谢谢了

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-4-17 21:43:35 | 显示全部楼层
本帖最后由 y574924080 于 2012-4-17 21:47 编辑

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

然后加上注释 ,

要不没人想看

出0入0汤圆

 楼主| 发表于 2012-4-17 21:48:29 | 显示全部楼层
y574924080 发表于 2012-4-17 21:43
建议排版 弄好一些~~~~~~

然后加上注释 ,

嗯,   我去弄一下

出0入0汤圆

发表于 2012-4-17 21:51:40 | 显示全部楼层
本帖最后由 bangbangji 于 2012-4-17 21:56 编辑

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

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

出0入0汤圆

 楼主| 发表于 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--); //延时一段时间
        }
   }

   }
}

出0入0汤圆

发表于 2012-4-17 22:02:25 | 显示全部楼层
可以用这个编辑代码 ~~~~~~~~~~~~~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-4-17 22:02:39 | 显示全部楼层
bangbangji 发表于 2012-4-17 21:51
我也不想看,不过提醒你一下吧。
移入的可能是1,可能是0,也可能是某个标志位
仔细研究一下这个区别,应该 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-17 22:03:19 | 显示全部楼层
本帖最后由 徐照林 于 2012-4-17 22:04 编辑
  1. #include<reg52.h>
  2. unsigned char a;
  3. unsigned int b,c,flag;  //声明变量
  4. sbit F1 = P2^6;
  5. void main()
  6. {
  7.     a = 0xff;         //给a赋值
  8.         while(1)
  9.         {   
  10.             b = 50000;
  11.             c = 50000;
  12.             a = a<<1;     //左移一位
  13.                 P1 = a;       //把左移后面数赋值给P1;
  14.         while(b--);       //延时一段时间
  15.         if(a == 0x00)     //判断是循环完毕
  16.         {
  17.            a = 0xfe;      //再重新赋值
  18.            flag = 1;      //标志位赋值1
  19.            while(c--);    //延时一段时间
  20.     }
  21.     while( flag == 1) //判断标志位是否为1
  22.         {   
  23.             a = 0x7f;     //赋值
  24.             b = 1000;
  25.         c = 1000;
  26.                 a >>= 1;      //右移一位
  27.                 P1 = a;       //赋值给P1
  28.                 while(b--);
  29.                 if(a == 0x00)  //判断是否循环完毕
  30.                 {   
  31.                    P1 = 0xfe;  //P1口重新赋值
  32.                    flag = 0;   //标志位置0
  33.                    while(c--); //延时一段时间
  34.         }
  35.    }

  36.    }
  37. }
复制代码

出0入0汤圆

发表于 2012-4-17 22:06:41 | 显示全部楼层
23行每次执行都赋值0x7f
26行移位一次,所以现象一样 啊

出0入0汤圆

 楼主| 发表于 2012-4-17 22:10:29 | 显示全部楼层
y574924080 发表于 2012-4-17 22:06
23行每次执行都赋值0x7f
26行移位一次,所以现象一样 啊

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

出0入0汤圆

发表于 2012-4-17 22:38:48 | 显示全部楼层
徐照林 发表于 2012-4-17 22:10
那我不要P1=0X7F,应该就正常的吗???,我这种写法有错误吗!!

当右移位到a=0x00时,

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

继续进入右移循环

出0入0汤圆

发表于 2012-4-17 22:51:19 | 显示全部楼层
我这种写法有错误吗!!


get a decent C book and read about type promotion.

出0入0汤圆

发表于 2012-4-17 23:05:26 | 显示全部楼层
I think what this discussion highlights is the shocking but general lack of understanding of C the language.

出0入663汤圆

发表于 2012-4-17 23:27:19 | 显示全部楼层
  1. while( flag == 1) //判断标志位是否为1
  2. {
  3.   a = 0x7f;     //赋值
  4.   ...
  5.   a >>= 1;      //右移一位
  6.   ...
  7.   if(a == 0x00)  //判断是否循环完毕
  8.   {
  9.     ...
  10.   }
  11. }
复制代码
简化了一下右移循环的代码,自己找死循环原因。

出0入4汤圆

发表于 2012-4-18 00:19:44 | 显示全部楼层
在循环里{赋值-移位-显示}
  1. #include<reg52.h>
  2. unsigned char a;
  3. unsigned int b,c,flag;  //声明变量
  4. sbit F1 = P2^6;
  5. void main()
  6. {
  7.     a = 0xff;         //给a赋值
  8.     while(1)
  9.     {   
  10.             b = 50000;
  11.             a = a<<1;     //左移一位
  12.             P1 = a;       //把左移后面数赋值给P1;
  13.             while(b--);       //延时一段时间
  14.             if(a == 0x00)     //判断是循环完毕
  15.             {
  16.                     a = 0xff;      //再重新赋值
  17.                     flag = 1;     //标志位赋值1
  18.                 }
  19.                
  20.                 while( flag == 1) //判断标志位是否为1
  21.                 {   
  22.                        
  23.                         b = 10000;
  24.                         a >>= 1;      //右移一位
  25.                         P1 = a;       //赋值给P1
  26.                         while(b--);
  27.                         if(a == 0x00)  //判断是否循环完毕
  28.                         {   
  29.                                 flag = 0;   //标志位置0
  30.                                 a=0xff;
  31.                         }
  32.             }
  33.        
  34.            }
  35. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表