找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2843|回复: 4
收起左侧

用数组点亮单片机流水灯结果没有动态效果直接全亮了?

[复制链接]
ID:466499 发表于 2019-2-17 11:29 | 显示全部楼层 |阅读模式
很喜欢51黑论坛,论坛里面有很多热心的大佬,这是我见过的最有爱的论坛,没有之一。每一位回贴的网友都是优秀的老师,像我这样的小白在这里能学到很多东西。
最近想用数组跑一个流水灯,LED的引脚是随便接的,考虑到实际应用中也不可能有整组的引脚来操作,所以申明了个全局变量Y来整合这些引脚,问题好像就出现在这里。
这段代码运行的结果没有逐个点亮LED灯,而是一次全亮,显示的是y得到数组最后一个元素0X0000全亮,for循环是遍历了数组每个元素的,但为什么延时失效了?问题出在哪?好懵逼
#include<reg51.h>
sbit LED1  = P3^5;
sbit LED2  = P1^7;
sbit LED3  = P1^6;
sbit LED4  = P1^5;
sbit LED5  = P1^4;
sbit LED6  = P1^3;
sbit LED7  = P3^7;
sbit LED8  = P0^0;
sbit LED9  = P1^2;
sbit LED10 = P1^0;
sbit LED11 = P3^2;
sbit LED12 = P1^1;
//全局变量//
int y;
//定义LED数组//
int leddata[]={0x0ffe,0x0ffc,0x0ff8,0x0ff0,0x0fe0,0x0fc0,0x0f80,0x0f00,0x0e00,0x0c00,0x0800,0x0000};
//延时函数//
delay(int t)
{ int i,j;
        for(i=t;i>0;i--)
        {
                for(j=247;j>0;j--);
        }
}
//LED驱动函数//
void LED()
{
        LED1=0x0001&y;
        LED2=0x0002&y;
        LED3=0x0004&y;
        LED4=0x0008&y;
        LED5=0x0010&y;
        LED6=0x0020&y;
        LED7=0x0040&y;
        LED8=0x0080&y;
        LED9=0x0100&y;
        LED10=0x0200&y;
        LED11=0x0400&y;
        LED12=0x0800&y;
}

main()
{int a;
        LED();
        for (a=0;a<12;a++)
        {
                y=leddata[a];
                delay(100);
        }
               
}

QQ截图20190217110929.png
回复

使用道具 举报

ID:213173 发表于 2019-2-17 20:36 | 显示全部楼层
你这样写LED驱动函数不行,改成这样就可以了。
无标题.jpg


#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1  = P3^5;
sbit LED2  = P1^7;
sbit LED3  = P1^6;
sbit LED4  = P1^5;
sbit LED5  = P1^4;
sbit LED6  = P1^3;
sbit LED7  = P3^7;
sbit LED8  = P0^0;
sbit LED9  = P1^2;
sbit LED10 = P1^0;
sbit LED11 = P3^2;
sbit LED12 = P1^1;
//全局变量//
uint y;
//定义LED数组//
uint leddata[]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff};
//延时函数//
delay(uint t)
{
        uint i,j;
        for(i=t;i>0;i--)
                for(j=112;j>0;j--);
}
//LED驱动函数//
void LED(uint i)//写入12位数据
{   
        LED1=i&0x01;i>>=1;       
        LED2=i&0x01;i>>=1;
        LED3=i&0x01;i>>=1;
        LED4=i&0x01;i>>=1;
        LED5=i&0x01;i>>=1;
        LED6=i&0x01;i>>=1;
        LED7=i&0x01;i>>=1;
        LED8=i&0x01;i>>=1;
        LED9=i&0x01;i>>=1;
        LED10=i&0x01;i>>=1;
        LED11=i&0x01;i>>=1;
        LED12=i&0x01;
}

void main()
{
        uchar j=0;
        while(1)
        {
                y=leddata[j];
                LED(y);
                j++;
                j%=12;
                delay(500);
        }
}


评分

参与人数 2黑币 +18 收起 理由
Trump1438 + 8 回帖助人的奖励!
toaaa + 10 跪谢大佬!按照你的例程我找到了我程序问题.

查看全部评分

回复

使用道具 举报

ID:154074 发表于 2019-2-17 21:49 | 显示全部楼层
你的大循环没写
回复

使用道具 举报

ID:466499 发表于 2019-2-17 22:07 | 显示全部楼层
顶顶顶!还有没有其它好方法实现啊,这种引脚分散的怎么用数组来操作哦?
回复

使用道具 举报

ID:466499 发表于 2019-2-17 22:46 | 显示全部楼层
wulin 发表于 2019-2-17 20:36
你这样写LED驱动函数不行,改成这样就可以了。

看了你的例程,我在我的程序LED()驱动函数里面加了一个参数y,在main函数的for循环里面调用了这个带参数的驱动函数LED(y),就美妙的跑起来了,跪谢大佬用心给我仿真,祝新年快乐!万事大吉!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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