打印
[点读笔/故事机应用]

单片机LED流水灯

[复制链接]
991|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口赋一个变量。

使用特权

评论回复
5
laozhongyi| | 2018-3-18 22:49 | 只看该作者

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

使用特权

评论回复
6
Edisons| | 2018-3-18 22:52 | 只看该作者

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

使用特权

评论回复
7
_gege| | 2018-3-18 22:52 | 只看该作者
一般情况下第二种方法常用。。。。

使用特权

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

使用特权

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

使用特权

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

本版积分规则

68

主题

1557

帖子

2

粉丝