找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2273|回复: 3
打印 上一主题 下一主题
收起左侧

各位老师,这个单片机左右程序为什么没有逐位左移,求指点!

[复制链接]
跳转到指定楼层
楼主
各位老师,这个22行的led=(led<<i)运行的效果只有p0.0、p0.1、p0.3、p0.6被陆续点亮。而把哪行改成led=(0x01<<i)则可以实现p0到p7左移。能不能帮忙指点一下

单片机源程序:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define led P0
  5. sbit bee=P1^5;
  6. void delay(uint n)
  7. {
  8.     while(n--)
  9.     {
  10.         
  11.     }
  12. }

  13. void main()
  14. {
  15.     while(1)
  16.     {
  17.         uint i;
  18.         led=0x01;
  19.         for(i=0;i<8;i++)
  20.         {
  21.             led=(led<<i);
  22.             delay(2);
  23.         }
  24.     }
  25.    
  26. }
复制代码


左移.png (17.23 KB, 下载次数: 66)

左移.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2017-11-16 10:20 | 只看该作者
你的程序,就是这样的嘛,没有问题,只是它不是你想的那样罢了。
我们来看看程序的运行就知道了:
先说这个与你想法一致的:led=(0x01<<i)
0x01=00000001
i=0时,led=00000001
i=1时,led=00000010
i=2时,led=00000100......
不用再分析下去了,当然是一个一个向左移动的。


再来看看不能按你想法运行的那个:led=0x01;led=(led<<i);
开始时:led=00000001
i=0时,没移位,led=00000001
i=1时,led=00000010
i=2时,以当前的led值移位2位,led=00001000
i=3时,再以当前led值移位3位,led=01000000......
不用再分析了吧。


综上所述,你想逐位移动,要嘛,用第一种语句;要嘛,第二种情况只能led=(led<<1),即每次只移动一位
回复

使用道具 举报

板凳
ID:248394 发表于 2017-11-18 06:50 | 只看该作者
HC6800-ES-V2.0 发表于 2017-11-16 10:20
你的程序,就是这样的嘛,没有问题,只是它不是你想的那样罢了。
我们来看看程序的运行就知道了:
先说这 ...

谢谢^ω^
回复

使用道具 举报

地板
ID:250626 发表于 2017-11-18 08:36 | 只看该作者
i = 及就移位几位  你希望移位 1 而不是 2,3,4.。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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