找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 660|回复: 4
打印 上一主题 下一主题
收起左侧

单片机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, 下载次数: 18)

51hei图片_20221019213514.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:59202 发表于 2022-10-20 10:50 | 只看该作者
语法上没啥错误,主要应该是逻辑上的混乱,最好还是把想要达成的图形画出来再分析逻辑上应该怎么表述
回复

使用道具 举报

板凳
ID:86926 发表于 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;下次循环亦是如此规律;
回复

使用道具 举报

地板
ID:384109 发表于 2022-10-21 08:54 | 只看该作者
每流动一次后重新赋值就行了,移位操作并不一定是补1的
回复

使用道具 举报

5#
ID:1048353 发表于 2022-10-21 10:39 | 只看该作者
蓝魄 发表于 2022-10-21 08:19
第一次内循环的时候是把1111 1110左移8次;0111 1111结束第一次内循环;此时j是1;a=_crol_(a,j);后a=1111  ...

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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