墨逸、 发表于 2013-12-23 15:59:51

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

如题,操作数码管时总是乱码,或者是不闪,但是关掉了重新开数据就又不一样了

huangyiting1990 发表于 2013-12-23 16:07:14

用逻辑分析仪抓波形分析。对应 时钟 数据 锁存看看。没记错的话 应该是上升沿采样。

dlmaowf 发表于 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();
}

dlmaowf 发表于 2013-12-23 16:25:09

这是4片595级联的,所以for循环32次,只有一片的话,把for循环改为8次

墨逸、 发表于 2013-12-23 16:32:14

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

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

墨逸、 发表于 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 intf=60000;
      while(1)
      {
                                        for(i=0;i<9;i++)
                                        {
            sendbyte(tab);
            out595();
            while(f--);
                                        }
          }
}



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

qinshi1208 发表于 2013-12-23 16:39:14

建议发数据的流程为:
移位输出数据 -> 锁存数据 -> OE使能并行输出.不要把OE设置为直接就输出了

dushanwu522 发表于 2013-12-23 16:50:50

仔细看数据手册吧,用了这么多年了,也没出现过什么问题。

dlmaowf 发表于 2013-12-23 16:54:00

unsigned char i;
    for(i=0;i<32;i++)
只有一片595,不需要循环32次吧

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

墨逸、 发表于 2013-12-23 16:58:16

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

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

墨逸、 发表于 2013-12-23 16:58:41

dlmaowf 发表于 2013-12-23 16:54
unsigned char i;
    for(i=0;i

我的事四片的

墨逸、 发表于 2013-12-23 17:00:10

dlmaowf 发表于 2013-12-23 16:54
unsigned char i;
    for(i=0;i

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

dlmaowf 发表于 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

365mcu 发表于 2013-12-23 17:14:21

我用过三片级联的,驱动程序你看看还有帮助
#include "stm32f10x.h"

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

/*初始化硬件*/
void HC595InitIO (void)
{
Pin pindo[] = {PIO_74HC595};
PIO_74HC595RCCConf();
PIO_Configure(pindo,PIO_LISTSIZE(pindo));
HC595_LEDOnOff(&HC595DataBuf);//初始状态设置
}
/*串行数据输入IO*/
void DATA_IO(INT8U Value)
{
if(Value == 0)
{
    GPIOE->BRR = GPIO_Pin_6;
}
else
{
    GPIOE->BSRR = GPIO_Pin_6;
}
}

/*串行数据移位引脚控制*/
void SHIFT_IO(INT8U Value)
{
if(Value == 0)
{
    GPIOE->BRR = GPIO_Pin_4;
}
else
{
    GPIOE->BSRR = GPIO_Pin_4;
}
}

/*串行数据存储引脚控制*/
void DISP_IO(INT8U Value)
{
if(Value == 0)
{
    GPIOE->BRR = GPIO_Pin_5;
}
else
{
    GPIOE->BSRR = GPIO_Pin_5;
}
}

/*8位数据输入函数*/
void HC595_DataIn(INT8U Data)
{
for(INT8U i = 0; i < 8; i++)
{
    SHIFT_IO(0);
    DATA_IO(Data&0x01);
    Data >>= 1;
    __NOP();
    SHIFT_IO(1);
}
}

/*8位数据移位输入完成后输出*/
void HC595_StatuOut(void)
{
DISP_IO(0);
__NOP();
__NOP();//72M下延时14ns
DISP_IO(1);
}

/*控制不同LED灯开关*/
void HC595_LEDOnOff(INT8U *pBuf)
{
HC595_DataIn(pBuf);
HC595_DataIn(pBuf);
HC595_DataIn(pBuf);
HC595_StatuOut();
}

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

huangyiting1990 发表于 2013-12-23 17:56:20

墨逸、 发表于 2013-12-23 16:32
试了,可是时钟波形不是正常的高低信号

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

墨逸、 发表于 2013-12-23 21:56:56

365mcu 发表于 2013-12-23 17:14
我用过三片级联的,驱动程序你看看还有帮助




32的...看不懂

墨逸、 发表于 2013-12-23 22:00:55

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

实现循环了,只不过还是乱码,应该是数据输入的问题,不过问题已经基本解决了,感谢帮助
页: [1]
查看完整版本: 新人求问~74hc595的串行数据怎么输出的