极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 36360|回复: 23

小白求助~ 74HC595怎么不能让八个灯都亮,每隔一个灭一个,8个灯,只能亮四个

[复制链接]
发表于 2015-2-7 04:45:15 | 显示全部楼层 |阅读模式
74HC595怎么不能让八个灯都亮,每隔一个灭一个,8个灯,只能亮四个,为什么?


就是按教程做的那个实验,

线路图就按这个来的;(教程上的)


程序如下:(也是教程上的)

int latchPin = 5;
int clockPin = 4;
int dataPin = 2; //这里定义了那三个脚
void setup ()
{
  pinMode(latchPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  pinMode(dataPin,OUTPUT); //让三个脚都是输出状态
}
void loop()
{
for(int a=0; a<256; a++)
    //这个循环的意思是让a这个变量+1一直加到到256,每次循环都进行下面的活动
  {
    digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
    shiftOut(dataPin,clockPin,MSBFIRST,a);
    //这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数,
     //clockPin的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数,
    // 输入到芯片后会产生8个二进制数,达到开关的作用
    digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
    delay(1000); //暂停1秒钟让你看到效果
  }
  
}



有懂得给说下,谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-2-7 09:24:09 | 显示全部楼层
本帖最后由 xinhoujue 于 2015-2-7 09:26 编辑

void loop()  //想让8个LED亮需要改这里的程序
{
       //重新配置资源
    {
       //让8个LED依次点亮
     }
}
       程序比较简单,我就不写了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-7 15:01:23 | 显示全部楼层
xinhoujue 发表于 2015-2-7 09:24
void loop()  //想让8个LED亮需要改这里的程序
{
       //重新配置资源

不明白啊,我是小白,就是程序不明白
回复 支持 反对

使用道具 举报

发表于 2015-2-7 15:57:42 | 显示全部楼层
我不是很明白,移位寄存器的作用,还有移位寄存器和存储寄存器那两个脚改变时,对芯片内部数据的影响
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-7 16:06:16 | 显示全部楼层
laofuz1024 发表于 2015-2-7 15:57
我不是很明白,移位寄存器的作用,还有移位寄存器和存储寄存器那两个脚改变时,对芯片内部数据的影响

你这个有点高深了,我想控制8个LED灯都没实现
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-7 16:38:33 | 显示全部楼层
xinhoujue 发表于 2015-2-7 09:24
void loop()  //想让8个LED亮需要改这里的程序
{
       //重新配置资源

void loop()
{
for(int a=0; a<256; a++)
    //这个循环的意思是让a这个变量+1一直加到到256,每次循环都进行下面的活动
  {
    digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
    shiftOut(dataPin,clockPin,MSBFIRST,a);
    //这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数,
     //clockPin的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数,
    // 输入到芯片后会产生8个二进制数,达到开关的作用
    digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
    delay(1000); //暂停1秒钟让你看到效果
  }
  
}


就是上面这部分程序,我就看不太懂,为什么要用for循环语句?a变量到底有什么用?后面写的更不知道是怎么控制8个LED的。。。
回复 支持 反对

使用道具 举报

发表于 2015-2-7 19:13:18 | 显示全部楼层
yqfans 发表于 2015-2-7 16:38
void loop()
{
for(int a=0; a

这个是一个示例,功能是移入数据0到255。
回复 支持 反对

使用道具 举报

发表于 2015-2-7 21:39:26 | 显示全部楼层
这个,刚开始就玩595的确有点难理解
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-7 23:16:23 | 显示全部楼层
迷你强 发表于 2015-2-7 21:39
这个,刚开始就玩595的确有点难理解

好吧,那我占时先放一放。那刚入门建议玩什么
回复 支持 反对

使用道具 举报

发表于 2015-2-7 23:33:32 | 显示全部楼层
我觉得是你的面包板的问题,你确定面包板下边缘是全部想通的?一排电阻的下边接口。电源负极那个。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-8 02:10:36 | 显示全部楼层
Ansifa 发表于 2015-2-7 23:33
我觉得是你的面包板的问题,你确定面包板下边缘是全部想通的?一排电阻的下边接口。电源负极那个。

应该是通的,因为我换了我也不懂的程序,结果亮了另外4个(就是之前灭的那4个),但还是无法控制8个LED灯,所以我推测是应该是程序方面的问题
回复 支持 反对

使用道具 举报

发表于 2015-2-8 20:45:08 | 显示全部楼层
本帖最后由 マイナス37度 于 2015-2-8 21:58 编辑
yqfans 发表于 2015-2-8 02:10
应该是通的,因为我换了我也不懂的程序,结果亮了另外4个(就是之前灭的那4个),但还是无法控制8个LED灯 ...


帮你查了下74,他是需要一组8位2进制数来控制的,比如数等于00000001那么只亮一盏led,要8盏全亮只要输入11111111这个二进制数就行了,11111111等于十进制的255,那么a的取值是对的,亮4盏的原因可能是线路的问题,这玩意吃透了很简单的,看你同样是初学者才讲这么多,希望能帮到你吧

语法

shiftOut(dataPin, clockPin, bitOrder, value)
参数

dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
value: 要移位输出的数据(byte)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-9 01:27:18 | 显示全部楼层
マイナス37度 发表于 2015-2-8 20:45
帮你查了下74,他是需要一组8位2进制数来控制的,比如数等于00000001那么只亮一盏led,要8盏全亮只要输入 ...

好的,我先研究下,谢谢
回复 支持 反对

使用道具 举报

发表于 2015-2-10 14:20:28 | 显示全部楼层
yqfans 发表于 2015-2-7 16:06
你这个有点高深了,我想控制8个LED灯都没实现

呵呵,理解这些,就能用得随心所欲了!但是我不明白,什么时候应该往数据引脚写数据,什么应该把寄存器的两个引脚置高或置低
回复 支持 反对

使用道具 举报

发表于 2015-2-10 22:04:39 | 显示全部楼层
关于这个问题,看一下,那个郭天祥的十天学会单片机,就会完全理解了!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 03:21 , Processed in 0.042647 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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