huzb11 发表于 2011-12-8 09:12:45

4个595级联,为什么这个程序不行?请大家分析,并解答。。。

void Send_595(u8 Data1,u8 Data2,u8 Data3,u8 Data4)
{
u8 i;
RCK1=0;
SCK1=0;
for(i=0;i<=7;i++)
        {
        SCK1=0;
        if(((0x80>>i)&Data1)==0)
        SER1=0;
        else
        SER1=1;
        SCK1=1;
        }
        SCK1=0;
for(i=0;i<=7;i++)
        {
        SCK1=0;
        if(((0x80>>i)&Data2)==0)
        SER1=0;
        else
        SER1=1;
        SCK1=1;
        }
        SCK1=0;
for(i=0;i<=7;i++)
        {
        SCK1=0;
        if(((0x80>>i)&Data3)==0)
        SER1=0;
        else
        SER1=1;
        SCK1=1;
        }
        SCK1=0;
for(i=0;i<=7;i++)
        {
        SCK1=0;
        if(((0x80>>i)&Data4)==0)
        SER1=0;
        else
        SER1=1;
        SCK1=1;
        }
        RCK1=0;
}
我的思想是希望在程序中直接填值调用函数,比如:Send_595(0ff,0x07,0xfe,0xfd);但运行后结果乱七八糟,单片的能控制,级联如何做?像上面,如何改正即可,请教!

millwood0 发表于 2011-12-8 09:31:43

write a routine that sends just one byte, like hc595_send(unsigned char dat). and then call that routine 4 times to send your data.

you will need to strobe out the output registers at the end of the four byte.

right now, you code looks like shit.

34071417 发表于 2011-12-8 10:15:45

void SPI_WRITE(uint8 dat)
{
        uint8 dat_tmp1=dat,num;
        NUM_OE=1;
        NUM_STCK=0;
        for(num=0;num<8;num++)
                {
                        NUM_SHCK=0;
                        if(dat_tmp1&0x80)
                                {
                                        NUM_SDA=1;
                                }
                        else
                                {
                                        NUM_SDA=0;       
                                }
                        dat_tmp1<<=1;
                        NUM_SHCK=1;       
                }
        NUM_STCK=0;
        NUM_STCK=1;
        NUM_STCK=0;
        NUM_OE=0;
        //delay_ms(20);       
}
直接调用,把Q8那个输出接下一595的SDI,其他控制口接在同一根线上。

haso2007 发表于 2011-12-8 10:23:27

给你一个我项目上用的三个595级联的代码,希望你对你用。。
/*write 3 bytes , full duplex */
       void LED_Write3Byte(u8 val1,u8 val2,u8 val3)
       {
               u8 i,j;
               u8 led_data;
               led_data=val3;
               led_data=val2;
               led_data=val1;
               CS_LOW();
               SCK_LOW();
               for(j=0; j<3; j++)
               {
                       for(i=0; i<8; i++)
                       {
                               SCK_LOW();
       //                        nop();
       //                        nop();
                               if((led_data<<i)&0x80) DATAB_HIGH();
                               else DATAB_LOW();
       //                        nop();
       //                        nop();
                               SCK_HIGH();
       //                        nop();
       //                        nop();

                       }
               }
               CS_HIGH();
               SCK_HIGH();
               DATAB_HIGH();
               return;
       }
另外特别注意,不要用SPI方式给级联595信号,否测上电很容易显示乱。

huzb11 发表于 2011-12-8 12:31:34

【3楼】 haso2007 错别字-妹影
-------------------------------------
果然精典,对我非常实用。为什么用在SPI上面不行呢?

sidu320 发表于 2019-1-27 19:01:55

全程英文回复的那位当前更今非昔比了吧,谢谢给出方案的坛友。

yuanbo19870216 发表于 2019-1-30 15:58:15

void HC595SendData(uint32_t SendVal)
{
uint8_t i;
for (i = 0; i < 32; i++)
{
    if (((SendVal << i) & 0x80000000) != 0 )
                {
      HC595_SER=1;
   }                       
    else
   {
      HC595_SER=0;
   }

    HC595_SRCLK=0;
    NOP();
    HC595_SRCLK=1;
                NOP();
}
HC595_RCLK =0;
NOP();
HC595_RCLK =1;
}
页: [1]
查看完整版本: 4个595级联,为什么这个程序不行?请大家分析,并解答。。。