找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4848|回复: 9
收起左侧

单片机LED流水灯 在仿真的时候第一次第一个灯不亮,其余都正常

[复制链接]
ID:235264 发表于 2018-3-18 10:57 | 显示全部楼层 |阅读模式
  最近给别人讲LED流水灯,发现了一个问题,在仿真的时候第一次第一个灯不亮,其余都正常,第二次也能从第一个开始亮,在思路上不知道哪里有问题,
代码如下:
第一次:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char        
void delay(uint z);
void delay(uint z)
{
        uint x,y;
        for(x = z;x > 0;x--)
        for(y =         120;y > 0 ;y--);
}
void main()
{
        P0=0XFE ;
        while(1)
        {        
          P0=_crol_ (P0,1);
                delay(500);
        }
}

第二次修改 加了temp 将P0赋值给temp 就可以
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char        
uint temp;
void delay(uint z);
void delay(uint z)
{
        uint x,y;
        for(x = z;x > 0;x--)
        for(y =         120;y > 0 ;y--);
}
void main()
{
        temp=0XFE ;
        while(1)
        {
                P0=temp;
                temp=temp<<1;
                temp=temp|0x01;
        //        temp=_crol_ (temp,1);
                delay(500);
        }
}


但是有点理解不通  P0不可以直接_crol_(P0,1)么 问题出在那里 望大佬指点
回复

使用道具 举报

ID:272269 发表于 2018-3-18 15:02 | 显示全部楼层
同学
_crol_ (P0,1)是循环移动是会把溢出位自动填回去的  形成有一个不亮其他全亮的样子
而第二次是全亮吧一个一个亮起来只是时间问题
P0是寄存器  你第一次是直接访问P0和修改它
第二次是用一个变量来赋值给P0

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:235264 发表于 2018-3-18 13:07 | 显示全部楼层
好像知道了 P0开始最为一个常量 后来又作为变量使用
回复

使用道具 举报

ID:212149 发表于 2018-3-18 13:27 | 显示全部楼层
第一次的第一盏灯亮了之后没有delay所以看不见,p0赋值之后你就立马左移赋值了,左移之后才进行了delay所以看到了现象就是一开始就亮两盏灯。
回复

使用道具 举报

ID:235264 发表于 2018-3-18 13:36 | 显示全部楼层
QWER01234 发表于 2018-3-18 13:27
第一次的第一盏灯亮了之后没有delay所以看不见,p0赋值之后你就立马左移赋值了,左移之后才进行了delay所以 ...

没有 第一次是从第二个开始亮的 但是第一次循环过后就是对的了
回复

使用道具 举报

ID:293525 发表于 2018-3-18 14:13 | 显示全部楼层
第一次的第一盏灯亮了之后没有delay所以看不见,p0赋值之后你就立马左移赋值了,左移之后进行了delay所以看到了现象就是  一开始就亮两盏灯
回复

使用道具 举报

ID:293542 发表于 2018-3-18 14:48 | 显示全部楼层
P口不能成为变量。可以给P口赋一个变量。
回复

使用道具 举报

ID:149057 发表于 2018-3-18 15:39 | 显示全部楼层
p0赋值之后你就立马左移赋值了
回复

使用道具 举报

ID:222948 发表于 2018-3-18 15:51 | 显示全部楼层
第一种方法:一开始把最低位赋值给p0口,他已经移到下一位在while里面进行下一盏灯,如果你试一下在while(1)的上面加一个延时就可以显示第一盏灯,第二种方法:一开始就赋值p0为最高为比如0x7f就可以
回复

使用道具 举报

ID:293590 发表于 2018-3-18 17:05 | 显示全部楼层
一般情况下第二种方法常用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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