找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
#
      两个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中使用是可以的。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

16#
ID:884042 发表于 2021-3-24 19:15 | 只看该作者
forest415 发表于 2021-3-22 16:31
请问这个应该怎么写呢?

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

使用道具 举报

15#
ID:126591 发表于 2021-3-23 18:06 | 只看该作者
unsigned char SendVal这个怎么不是unsigned short呢
回复

使用道具 举报

14#
ID:332444 发表于 2021-3-23 10:02 | 只看该作者
发送2次8位数据,可看到下面的数据往上移动.
回复

使用道具 举报

13#
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;

}
回复

使用道具 举报

12#
ID:213173 发表于 2021-3-22 19:08 | 只看该作者
forest415 发表于 2021-3-22 17:23
这个程序第二片595全部都是高电平


回复

使用道具 举报

11#
ID:718523 发表于 2021-3-22 17:23 | 只看该作者
wulin 发表于 2021-3-22 17:01
数据类型unsigned int

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

使用道具 举报

10#
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. }
复制代码
回复

使用道具 举报

9#
ID:718523 发表于 2021-3-22 16:58 | 只看该作者
yzwzfyz 发表于 2021-3-22 16:46
与硬件的接法有关:
1、两个595串接,即一个DATA输入,则用16个CLK,达成目的,这时DATA端当以序输入10个0 ...

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

使用道具 举报

8#
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。
回复

使用道具 举报

7#
ID:275826 发表于 2021-3-22 16:34 | 只看该作者

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

使用道具 举报

6#
ID:718523 发表于 2021-3-22 16:31 | 只看该作者
glinfei 发表于 2021-3-22 15:39
unsigned char SendVal,char不是只有8位吗?你传16位给它是什么意思啊?

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

使用道具 举报

5#
ID:718523 发表于 2021-3-22 16:29 | 只看该作者

没看懂什么意思
回复

使用道具 举报

地板
ID:275826 发表于 2021-3-22 15:59 | 只看该作者
把if((SendVal<<1)&0x80) MOSIO=1;
回复

使用道具 举报

板凳
ID:332444 发表于 2021-3-22 15:51 | 只看该作者
串联的595送2次8位数据即可.
回复

使用道具 举报

沙发
ID:844772 发表于 2021-3-22 15:39 | 只看该作者
unsigned char SendVal,char不是只有8位吗?你传16位给它是什么意思啊?
回复

使用道具 举报

楼主
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)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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