找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4030|回复: 16
收起左侧

单片机+两个74hc595驱动LED程序实在搞不懂了 求大神帮忙

[复制链接]
ID:718523 发表于 2021-3-22 13:00 | 显示全部楼层 |阅读模式
      两个74hc595串联的不是就有16个输出脚了吗?想让它输出10个0和6个1也就是0000000000111111我的程序如下,但是是错的求大神指正。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define  NOP() _nop_()  /* 定义空指令 */

  4. //SPI IO
  5. sbit MOSIO =P3^4;
  6. sbit R_CLK =P3^5;
  7. sbit S_CLK =P3^6;
  8. void HC595SendData(unsigned char SendVal);//向595发送数据

  9. main()
  10. {
  11. HC595SendData(0x00);//初始化595使他为高电平 让LED处于熄灭状态  
  12.   HC595SendData(0xfc00);//1111110000000000  
  13. }

  14. void HC595SendData(unsigned char SendVal)
  15. {  
  16.   unsigned char i;               
  17.   for(i=0;i<8;i++)
  18.    {
  19.         if((SendVal<<i)&0x80) MOSIO=1;
  20.         else MOSIO=0;                                   

  21.         S_CLK=0;
  22.         NOP();        
  23.         NOP();
  24.         S_CLK=1;        
  25.    }
  26.         
  27.   R_CLK=0;
  28.   NOP();   
  29.   NOP();
  30.   R_CLK=1;

  31. }
复制代码

像代码中的蓝字我把8改成16过,把80改成800和8080过都不起作用,请问要怎么改呢才能输出本文开头提的问题呢?注:这个程序在一片595中使用是可以的。



回复

使用道具 举报

ID:718523 发表于 2021-3-22 15:01 | 显示全部楼层
我尝试着接在8段3位的数码管上
A-DP=Qa-Qh
DIG1-DIG3=Qb-Qd
程序改成
  1. HC595SendData(0x08); //00001000
  2. HC595SendData(0xf9);//11111001
复制代码

我觉得它应该是DIG3这一个管里右边显示1,结果它显示111(DIG1-DIG3都是右边的1)
回复

使用道具 举报

ID:844772 发表于 2021-3-22 15:39 | 显示全部楼层
unsigned char SendVal,char不是只有8位吗?你传16位给它是什么意思啊?
回复

使用道具 举报

ID:332444 发表于 2021-3-22 15:51 | 显示全部楼层
串联的595送2次8位数据即可.
回复

使用道具 举报

ID:275826 发表于 2021-3-22 15:59 | 显示全部楼层
把if((SendVal<<1)&0x80) MOSIO=1;
回复

使用道具 举报

ID:718523 发表于 2021-3-22 16:29 | 显示全部楼层

没看懂什么意思
回复

使用道具 举报

ID:718523 发表于 2021-3-22 16:31 | 显示全部楼层
glinfei 发表于 2021-3-22 15:39
unsigned char SendVal,char不是只有8位吗?你传16位给它是什么意思啊?

请问这个应该怎么写呢?
回复

使用道具 举报

ID:275826 发表于 2021-3-22 16:34 | 显示全部楼层

要仔细看,跟原来的差别
回复

使用道具 举报

ID:123289 发表于 2021-3-22 16:46 | 显示全部楼层
与硬件的接法有关:
1、两个595串接,即一个DATA输入,则用16个CLK,达成目的,这时DATA端当以序输入10个0、6个1。
1、两个595并接,即有两个DATA输入,DATA1、DATA2,则用8个CLK,达成目的,这时DATA1端当以序输入8个0,DATA2端当以序输入两个0、及6个1。
回复

使用道具 举报

ID:718523 发表于 2021-3-22 16:58 | 显示全部楼层
yzwzfyz 发表于 2021-3-22 16:46
与硬件的接法有关:
1、两个595串接,即一个DATA输入,则用16个CLK,达成目的,这时DATA端当以序输入10个0 ...

是串连的请问我的程序需要改哪里呢?
回复

使用道具 举报

ID:213173 发表于 2021-3-22 17:01 | 显示全部楼层
forest415 发表于 2021-3-22 16:31
请问这个应该怎么写呢?

数据类型unsigned int
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define  NOP() _nop_()  /* 定义空指令 */

  4. //SPI IO
  5. sbit MOSIO =P3^4;
  6. sbit R_CLK =P3^5;
  7. sbit S_CLK =P3^6;
  8. void HC595SendData(unsigned int SendVal);//向595发送数据

  9. main()
  10. {
  11. //        HC595SendData(0x00);//初始化595使他为高电平 让LED处于熄灭状态  
  12.         HC595SendData(0x003f);//0000000000111111  
  13.         while(1);
  14. }

  15. void HC595SendData(unsigned int SendVal)
  16. {  
  17.   unsigned char i;               
  18.   for(i=0;i<16;i++)
  19.    {
  20.         if((SendVal<<i)&0x8000) MOSIO=1;//由高位到低位传送
  21.         else MOSIO=0;                                   

  22.         S_CLK=0;
  23.         NOP();        
  24.         NOP();
  25.         S_CLK=1;        
  26.    }
  27.         
  28.   R_CLK=0;
  29.   NOP();   
  30.   NOP();
  31.   R_CLK=1;
  32. }
复制代码
回复

使用道具 举报

ID:718523 发表于 2021-3-22 17:23 | 显示全部楼层
wulin 发表于 2021-3-22 17:01
数据类型unsigned int

这个程序第二片595全部都是高电平
回复

使用道具 举报

ID:213173 发表于 2021-3-22 19:08 | 显示全部楼层
forest415 发表于 2021-3-22 17:23
这个程序第二片595全部都是高电平

无标题.jpg
回复

使用道具 举报

ID:68800 发表于 2021-3-22 22:15 | 显示全部楼层
#include<reg52.h>
#include <intrins.h>
#define  NOP() _nop_()  /* 定义空指令 */

//SPI IO
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;
void HC595SendData(unsigned char SendVal);//向595发送数据

main()
{HC595SendData(0xfc);//11111100先发第二片的从左往右移 入 左边第一位在第二片的q7
  HC595SendData(0x00);//00000000  第一片的数据
}

void HC595SendData(unsigned char SendVal)
{  
  unsigned char i;               
  for(i=0;i<8;i++)
   {
        if((SendVal<<i)&0x80) MOSIO=1;
        else MOSIO=0;                                   

        S_CLK=0;
        NOP();        
        NOP();
        S_CLK=1;        
   }
        
  R_CLK=0;
  NOP();   
  NOP();
  R_CLK=1;

}
回复

使用道具 举报

ID:332444 发表于 2021-3-23 10:02 | 显示全部楼层
发送2次8位数据,可看到下面的数据往上移动. 录像14_转.gif
回复

使用道具 举报

ID:126591 发表于 2021-3-23 18:06 | 显示全部楼层
unsigned char SendVal这个怎么不是unsigned short呢
回复

使用道具 举报

ID:884042 发表于 2021-3-24 19:15 | 显示全部楼层
forest415 发表于 2021-3-22 16:31
请问这个应该怎么写呢?

unsigned char SendVal把它改成int型也就是unsigned int SendVal
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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