961|14

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万

帖子

25

TA的资源

版主

沙发
 

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

此帖出自单片机论坛
 
 

回复

6106

帖子

4

TA的资源

版主

板凳
 

LEDNum<<=1;

此帖出自单片机论坛
 
 
 

回复

6523

帖子

9

TA的资源

版主

4
 

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

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

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

 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

5
 

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

此帖出自单片机论坛

点评

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

回复

1388

帖子

1

TA的资源

五彩晶圆(初级)

6
 

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

 

此帖出自单片机论坛
 
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

7
 
本帖最后由 suiyue9528 于 2024-5-21 10:32 编辑

无符号LEDNum=0x01一直左移,最大值为0x80,怎么可能大于等于0x81?问题就出在这里。当达到了0x80,再左移就是0了,所以最后LEDNum一直为0

此帖出自单片机论坛

点评

我今天在学习按键控制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
 
suiyue9528 发表于 2024-5-21 10:30 无符号LEDNum=0x01一直左移,最大值为0x80,怎么可能大于等于0x81?问题就出在这里。当达到了0x80,再左移 ...

非常感谢您,醍醐灌顶!后面改过来就好了。

此帖出自单片机论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

9
 
suiyue9528 发表于 2024-5-21 10:30 无符号LEDNum=0x01一直左移,最大值为0x80,怎么可能大于等于0x81?问题就出在这里。当达到了0x80,再左移 ...

我今天在学习按键控制LED亮灭代码时,用的if...else...语句,代码如下:

void main()
{
    while(1)
    {
        if(P3_0==0)
        {
            Delay(20);
            while(P3_0==0);
            Delay(20);
            P2_0=~P2_0;
        }
//        else
//            P2_0=P2_0;
    }
}

在执行时发现加上最后else语句时,按键按下去控制不了LED亮灭,P2_0的状态一直不变,反倒是去掉else语句,反而就正常了!还请指导下,这是为啥?if后面难道不接else语句吗?

此帖出自单片机论坛

点评

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

回复

61

帖子

0

TA的资源

一粒金砂(中级)

10
 
Tacking 发表于 2024-5-21 17:59 我今天在学习按键控制LED亮灭代码时,用的if...else...语句,代码如下: void main() {    ...

这个问题还请了解的告知下,非常感谢

此帖出自单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

11
 

无符号LEDNum=0x01一直左移,最大值为0x80,怎么可能大于等于0x81?问题就出在这里。当达到了0x80,再左移就是0了,所以最后LEDNum一直为0

此帖出自单片机论坛
 
 
 

回复

6106

帖子

4

TA的资源

版主

12
 
Tacking 发表于 2024-5-21 09:39 谢谢各位,问题找到了,应该写成:LEDNum=LEDNum<<1;LEDNum只是左移了一位,左移之后不重新对LEDNum赋 ...

LEDNum<<=1; LEDNum=LEDNum<<1;应该一样吧。你试试。

此帖出自单片机论坛

点评

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

回复

2

帖子

1

TA的资源

一粒金砂(初级)

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

P3_0的状态为1时,会执行P2_0=P2_0,这里改为P2_0=~P2_0,就可以反转电平了

此帖出自单片机论坛

点评

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

回复

61

帖子

0

TA的资源

一粒金砂(中级)

14
 
damiaa 发表于 2024-5-22 13:01 LEDNum<<=1; LEDNum=LEDNum<<1;应该一样吧。你试试。

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

此帖出自单片机论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

15
 
suiyue9528 发表于 2024-5-23 09:51 P3_0的状态为1时,会执行P2_0=P2_0,这里改为P2_0=~P2_0,就可以反转电平了

我那段代码的想法就是,P3_0状态为1时,P2_0状态保持不变,当P3_0状态为0时,P2_0状态翻转。执行结果发现else那句加上后,状态不能翻转了,P2_0一直保持状态不变。去掉else语句后,就可以正常翻转了。

此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表