1037|13

61

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

学习C51 LED流水灯时,自己写了一段代码,其中有一句软件不执行,直接跳过了。 [复制链接]

 

#include <REGX52.H>

unsigned char LEDNum;    //定义一个无符号字符型变量LEDNum

/*定义一个无符号整型n,可以设置任意延时时常,基于1ms延时的倍数*/
void Delay(unsigned int n)        //@12.000MHz
{
    unsigned char i, j;

    while(n--)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
    }
}

/*主函数*/
void main()
{
    LEDNum=0x01;
    while(1)
    {
        if(LEDNum>=0x81)
            LEDNum=0x01;    
        else
        {    
            LEDNum<<1;
            P2=~LEDNum;
            Delay(500);
        }    
    }
}

 

本意是:定义了一个无符号型字符LEDNum,初始赋值0000 0001,然后条件语句判断,如果LEDNum大于1000 0001时,就重新赋值0000 0001,如果没到1000 0001时,执行LEDNum<<1,左移一位,但是这句我在单步执行时发现被忽略了,没被执行,所以最终结果也不对,还请高手帮忙指出问题原因,本人新手,万分感激

此帖出自单片机论坛

最新回复

P3_0的状态为1时,会执行P2_0=P2_0,这里改为P2_0=~P2_0,就可以反转电平了   详情 回复 发表于 2024-5-23 09:51
点赞 关注
 

回复
举报

1万

帖子

24

TA的资源

版主

沙发
 

被编译器优化了,关闭优化就可以执行。

此帖出自单片机论坛
 
 

回复

6179

帖子

4

TA的资源

版主

板凳
 

LEDNum<<=1;

此帖出自单片机论坛
 
 
 

回复

6876

帖子

10

TA的资源

版主

4
 

加个断点试一下,根绝应该不会不执行啊  

此帖出自单片机论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

5
 

谢谢各位,问题找到了,应该写成:LEDNum=LEDNum<<1;LEDNum只是左移了一位,左移之后不重新对LEDNum赋值的话,LEDNum这个值一直保持不变,所以就被优化了,改成赋值语句后,就没问题了,可以执行了。非常感谢

此帖出自单片机论坛

点评

LEDNum<<=1; LEDNum=LEDNum<<1;应该一样吧。你试试。  详情 回复 发表于 2024-5-22 13:01
 
 
 

回复

1490

帖子

1

TA的资源

五彩晶圆(初级)

6
 

积累经验。。。。。持续精进!!!

 

此帖出自单片机论坛
 
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

7
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛

点评

我今天在学习按键控制LED亮灭代码时,用的if...else...语句,代码如下: void main() {     while(1)     {         if(P3_0==0)     详情 回复 发表于 2024-5-21 17:59
非常感谢您,醍醐灌顶!后面改过来就好了。  详情 回复 发表于 2024-5-21 17:56
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

8
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

9
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛

点评

这个问题还请了解的告知下,非常感谢  详情 回复 发表于 2024-5-22 09:52
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

10
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

6179

帖子

4

TA的资源

版主

11
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛

点评

LEDNum<<=1跟LED=LEDNum<<1确实是一样的,我之前写成了LEDNum<<1,没有加“=”,编译时这句老是被程序优化掉不执行,改为LEDNum<<=1,确实就可以了。学习啦,非常感谢,原来是我语法错误  详情 回复 发表于 2024-5-24 15:45
 
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

12
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛

点评

我那段代码的想法就是,P3_0状态为1时,P2_0状态保持不变,当P3_0状态为0时,P2_0状态翻转。执行结果发现else那句加上后,状态不能翻转了,P2_0一直保持状态不变。去掉else语句后,就可以正常翻转了。  详情 回复 发表于 2024-5-24 15:51
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

13
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

14
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
      关闭
      站长推荐上一条 1/10 下一条
      中星联华&ADI明日直播
      直播主题:大咖面对面,轻松玩转高速ADC性能测试
      直播时间:3月25日(周二)14:00
      活动奖励:京东卡、双肩包

      查看 »

       
      EEWorld订阅号

       
      EEWorld服务号

       
      汽车开发圈

       
      机器人开发圈

      About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

      站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 15

      北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

      电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
      快速回复 返回顶部 返回列表