[点读笔/故事机应用]

单片机LED流水灯

[复制链接]
975|8
手机看帖
扫描二维码
随时随地手机跟帖
zhouhuanの|  楼主 | 2018-3-18 22:38 | 显示全部楼层 |阅读模式
最近给别人讲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)么 问题出在那里 望大佬指点
handleMessage| | 2018-3-18 22:44 | 显示全部楼层

好像知道了 P0开始最为一个常量 后来又作为变量使用

使用特权

评论回复
bbapple| | 2018-3-18 22:45 | 显示全部楼层

第一次的第一盏灯亮了之后没有delay所以看不见,p0赋值之后你就立马左移赋值了,左移之后才进行了delay所以看到了现象就是一开始就亮两盏灯。

使用特权

评论回复
wanglaojii| | 2018-3-18 22:49 | 显示全部楼层

P口不能成为变量。可以给P口赋一个变量。

使用特权

评论回复
laozhongyi| | 2018-3-18 22:49 | 显示全部楼层

p0赋值之后你就立马左移赋值了

使用特权

评论回复
Edisons| | 2018-3-18 22:52 | 显示全部楼层

第一种方法:一开始把最低位赋值给p0口,他已经移到下一位在while里面进行下一盏灯,如果你试一下在while(1)的上面加一个延时就可以显示第一盏灯,第二种方法:一开始就赋值p0为最高为比如0x7f就可以

使用特权

评论回复
_gege| | 2018-3-18 22:52 | 显示全部楼层
一般情况下第二种方法常用。。。。

使用特权

评论回复
Mozarts| | 2018-3-18 22:55 | 显示全部楼层
_crol_ (P0,1)是循环移动是会把溢出位自动填回去的  形成有一个不亮其他全亮的样子

使用特权

评论回复
Listate| | 2018-3-18 22:55 | 显示全部楼层
二次是全亮吧一个一个亮起来只是时间问题
P0是寄存器  你第一次是直接访问P0和修改它

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

1557

帖子

2

粉丝