搜索
bottom↓
回复: 16

新人求问~74hc595的串行数据怎么输出的

[复制链接]

出0入0汤圆

发表于 2013-12-23 15:59:51 | 显示全部楼层 |阅读模式
如题,操作数码管时总是乱码,或者是不闪,但是关掉了重新开数据就又不一样了

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-23 16:07:14 | 显示全部楼层
用逻辑分析仪抓波形分析。  对应 时钟 数据 锁存看看。没记错的话 应该是上升沿采样。

出0入0汤圆

发表于 2013-12-23 16:23:37 | 显示全部楼层
void hc595_output(void)
{
        unsigned char i;
        unsigned long temp;
       
        STCP_L();
        temp=0x01;
        for (i=0;i<32;i++)
        {
                SHCP_L();
                if (hc595_rg.b & temp) DS_H();
                else DS_L();
                SHCP_H();
                temp<<=1;
        }
        STCP_H();
}

出0入0汤圆

发表于 2013-12-23 16:25:09 | 显示全部楼层
这是4片595级联的,所以for循环32次,只有一片的话,把for循环改为8次

出0入0汤圆

 楼主| 发表于 2013-12-23 16:32:14 | 显示全部楼层
huangyiting1990 发表于 2013-12-23 16:07
用逻辑分析仪抓波形分析。  对应 时钟 数据 锁存看看。没记错的话 应该是上升沿采样。 ...

试了,可是时钟波形不是正常的高低信号

出0入0汤圆

 楼主| 发表于 2013-12-23 16:33:43 | 显示全部楼层
dlmaowf 发表于 2013-12-23 16:25
这是4片595级联的,所以for循环32次,只有一片的话,把for循环改为8次

#include <reg52.h>
#include <intrins.h>

sbit SCLK=P2^4;   
sbit DAT=P2^5;   
sbit SLCK=P2^6;   

unsigned char code tab[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};


void out595(void)
{
        SLCK=0;
                                _nop_();
        SLCK=1;
}


void sendbyte(unsigned char a)

{
  unsigned char i;
    for(i=0;i<32;i++)
        {
         SCLK=0;
         DAT=a&0x80;
         a=a<<1;
         SCLK=1;
                                }
}



main()
{
      unsigned char i;
      unsigned int  f=60000;
      while(1)
      {
                                        for(i=0;i<9;i++)
                                        {
            sendbyte(tab);
            out595();
            while(f--);
                                        }
            }
}



大神你帮我看看,哪里不对呢

出0入0汤圆

发表于 2013-12-23 16:39:14 | 显示全部楼层
建议发数据的流程为:
移位输出数据 -> 锁存数据 -> OE使能并行输出.不要把OE设置为直接就输出了

出0入0汤圆

发表于 2013-12-23 16:50:50 | 显示全部楼层
仔细看数据手册吧,用了这么多年了,也没出现过什么问题。

出0入0汤圆

发表于 2013-12-23 16:54:00 | 显示全部楼层
unsigned char i;
    for(i=0;i<32;i++)
只有一片595,不需要循环32次吧

sendbyte(tab);
            out595();
数组tab的下标呢?

出0入0汤圆

 楼主| 发表于 2013-12-23 16:58:16 | 显示全部楼层
qinshi1208 发表于 2013-12-23 16:39
建议发数据的流程为:
移位输出数据 -> 锁存数据 -> OE使能并行输出.不要把OE设置为直接就输出了 ...

我的OE接的是地,但是我不明白的是为什么我的是乱码

出0入0汤圆

 楼主| 发表于 2013-12-23 16:58:41 | 显示全部楼层
dlmaowf 发表于 2013-12-23 16:54
unsigned char i;
    for(i=0;i

我的事四片的

出0入0汤圆

 楼主| 发表于 2013-12-23 17:00:10 | 显示全部楼层
dlmaowf 发表于 2013-12-23 16:54
unsigned char i;
    for(i=0;i

tab的下标没有粘贴出来,可能是未识别,下标是i

出0入0汤圆

发表于 2013-12-23 17:11:08 | 显示全部楼层
void sendbyte(unsigned char a)

{
  unsigned char i;
    for(i=0;i<32;i++)
        {
         SCLK=0;
         DAT=a&0x80;
         a=a<<1;
         SCLK=1;
                                }
}

unsigned char a;
a是一个字节,所以你循环32次没有用,后面都是0了
另外 DAT=a&0x80 ,即使循环32次,a左移的话,DAT=a&0x80000000
a右移的话,DAT=a&0x01

出0入0汤圆

发表于 2013-12-23 17:14:21 | 显示全部楼层
我用过三片级联的,驱动程序你看看还有帮助
  1. #include "stm32f10x.h"

  2. INT8U HC595DataBuf[3] = {0};
  3. /*
  4.   //23    22    21    20    19    18    17    16
  5.           R1    G1    R2    G2    R3    G3    R4
  6.   //15    14    13    12    11    10    9     8
  7.           G4    R5    G5    R6    G6
  8.   //7     6     5     4     3     2     1     0
  9.                            ALED4 ALED3 ALED2 ALED1
  10. */

  11. /*初始化硬件*/
  12. void HC595InitIO (void)
  13. {
  14.   Pin pindo[] = {PIO_74HC595};
  15.   PIO_74HC595RCCConf();
  16.   PIO_Configure(pindo,PIO_LISTSIZE(pindo));
  17.   HC595_LEDOnOff(&HC595DataBuf[0]);//初始状态设置
  18. }
  19. /*串行数据输入IO*/
  20. void DATA_IO(INT8U Value)
  21. {
  22.   if(Value == 0)
  23.   {
  24.     GPIOE->BRR = GPIO_Pin_6;
  25.   }
  26.   else
  27.   {
  28.     GPIOE->BSRR = GPIO_Pin_6;
  29.   }  
  30. }

  31. /*串行数据移位引脚控制*/
  32. void SHIFT_IO(INT8U Value)
  33. {
  34.   if(Value == 0)
  35.   {
  36.     GPIOE->BRR = GPIO_Pin_4;
  37.   }
  38.   else
  39.   {
  40.     GPIOE->BSRR = GPIO_Pin_4;
  41.   }  
  42. }

  43. /*串行数据存储引脚控制*/
  44. void DISP_IO(INT8U Value)
  45. {
  46.   if(Value == 0)
  47.   {
  48.     GPIOE->BRR = GPIO_Pin_5;
  49.   }
  50.   else
  51.   {
  52.     GPIOE->BSRR = GPIO_Pin_5;
  53.   }  
  54. }

  55. /*8位数据输入函数*/
  56. void HC595_DataIn(INT8U Data)
  57. {
  58.   for(INT8U i = 0; i < 8; i++)
  59.   {
  60.     SHIFT_IO(0);
  61.     DATA_IO(Data&0x01);
  62.     Data >>= 1;
  63.     __NOP();
  64.     SHIFT_IO(1);  
  65.   }
  66. }

  67. /*8位数据移位输入完成后输出*/
  68. void HC595_StatuOut(void)
  69. {
  70.   DISP_IO(0);
  71.   __NOP();
  72.   __NOP();//72M下延时14ns
  73.   DISP_IO(1);
  74. }

  75. /*控制不同LED灯开关*/
  76. void HC595_LEDOnOff(INT8U *pBuf)
  77. {
  78.   HC595_DataIn(pBuf[0]);
  79.   HC595_DataIn(pBuf[1]);
  80.   HC595_DataIn(pBuf[2]);
  81.   HC595_StatuOut();
  82. }
复制代码


需要显示哪一个就相应位置1,最后统一输出一次就好了。

出0入0汤圆

发表于 2013-12-23 17:56:20 | 显示全部楼层
墨逸、 发表于 2013-12-23 16:32
试了,可是时钟波形不是正常的高低信号

这是关键,连时钟信号都不标准 ,那就先查电路,时钟线,数据线可以适当的拉高试试。

出0入0汤圆

 楼主| 发表于 2013-12-23 21:56:56 | 显示全部楼层
365mcu 发表于 2013-12-23 17:14
我用过三片级联的,驱动程序你看看还有帮助

32的...看不懂

出0入0汤圆

 楼主| 发表于 2013-12-23 22:00:55 | 显示全部楼层
huangyiting1990 发表于 2013-12-23 17:56
这是关键,连时钟信号都不标准 ,那就先查电路,时钟线,数据线可以适当的拉高试试。 ...

实现循环了,只不过还是乱码,应该是数据输入的问题,不过问题已经基本解决了,感谢帮助
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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