标题: 单片机LED发光二极管流动点亮程序问题 [打印本页]

作者: 86爆缸    时间: 2022-10-19 21:39
标题: 单片机LED发光二极管流动点亮程序问题
图片是我单独把流水灯部分去掉后做的分析,求大神解答下
********************************
间隔300ms第一次一个管亮流动一次,
第二次两个管亮流动,依次到8个管亮,
然后重复整个过程。

单片机源程序如下:
#include<reg52.h>  //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
void delay(uint z)  //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{                                        //delay(500);大约延时500ms.
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);        
}
void main()                    //主函数
{
        uchar a,i,j;
        while(1)        //大循环
        {
                        a=0xfe;     //赋初值
                        for(j=0;j<8;j++)
                        {
                                for(i=0;i<8-j;i++)   //左移
                                {
                                        P1=a;       //点亮小灯
                                        delay(200); //延时200毫秒
                                        a=_crol_(a,1); //将a变量循环左移一位
                                }
                                a=_crol_(a,j);   //补齐,方便下面的左移一位
                                P1=0xff;                 //全部关闭
                                a=a<<1;                        //左移一位让多一个灯点亮
                        }
        }
}


51hei图片_20221019213514.jpg (665.51 KB, 下载次数: 54)

51hei图片_20221019213514.jpg

作者: xxxevery    时间: 2022-10-20 10:50
语法上没啥错误,主要应该是逻辑上的混乱,最好还是把想要达成的图形画出来再分析逻辑上应该怎么表述
作者: 蓝魄    时间: 2022-10-21 08:19
第一次内循环的时候是把1111 1110左移8次;0111 1111结束第一次内循环;此时j是1;a=_crol_(a,j);后a=1111 1110;a<<1后a不循环左移低位补0就是1111 1100;开始第二次内循环;变成0011 1111结束;此时j==2;a=_crol_(a,j)后a是1111 1100;再经过a<<1左移后就是1111 1000;下次循环亦是如此规律;
作者: 人中狼    时间: 2022-10-21 08:54
每流动一次后重新赋值就行了,移位操作并不一定是补1的
作者: 86爆缸    时间: 2022-10-21 10:39
蓝魄 发表于 2022-10-21 08:19
第一次内循环的时候是把1111 1110左移8次;0111 1111结束第一次内循环;此时j是1;a=_crol_(a,j);后a=1111  ...

所以我单独把P1拿出来赋值,难怪结果不对了,代入内循环就是你的这个解释;
谢谢大佬




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1