单片机 2片 HC595 级联 程序

在这里插入图片描述

//init
void init_relay(void)
{
    P1DIR |= BIT4;
    P1OUT |= BIT4;

    P1DIR |= BIT5;
    P1OUT |= BIT5;

    P3DIR |= BIT1;
    P3OUT |= BIT1;

}


//LedSER 595(14脚)SER  数据输入引脚  p1.4
//RCK    595(12脚)STCP 锁存时钟 1个上升沿所存一次数据   p1.5
//SCK   595(11脚)SHCP 移位时钟 8个时钟移入一个字节   p3.1
//* 函数功能:向LedScreen中写入两个字节
//继电器低电平触发
void LedScreen_WrTwoByte(unsigned int realy_data)
{
    unsigned char SEGDat;
    unsigned char COMDat;
    unsigned char i = 0;
    unsigned char j = 0;

    P1OUT |= BIT4;
    P1OUT |= BIT5;
    P3OUT |= BIT1;

    SEGDat = realy_data >> 8; //高8位
    COMDat = realy_data; //低8位

    /* 通过8循环将8位数据一次移入第一个595 */
    for (i = 0; i < 8; i++)
    {
        delay_us(5);
        if (SEGDat & 0x80)
        {
            P1OUT |= BIT4;
        }
        else
        {
            P1OUT &= ~BIT4;
        }
        delay_us(5);

        P3OUT &= ~BIT1;                            //0
        delay_ms(5);
        SEGDat <<= 1;
        P3OUT |= BIT1;                            //1
    }

    /* 通过8循环将8位数据,通过级联的方式最后的结果是
     * SEGDat在是点阵的负极端数据,COMDat是点阵的正极端数据*/
    for (j = 0; j < 8; j++)
    {
        delay_us(5);
        if (COMDat & 0x80)
        {
            P1OUT |= BIT4;
        }
        else
        {
            P1OUT &= ~BIT4;
        }
        delay_us(5);

        P3OUT &= ~BIT1;                            //0
        delay_ms(5);
        COMDat <<= 1;
        P3OUT |= BIT1;                            //1

    }
    /* 数据并行输出(借助上升沿) */
    P1OUT &= ~BIT5;                            //RCK = 0;
    delaytimerelay = 2;
    while (delaytimerelay)
        ;
    delay_ms(5);
    P1OUT |= BIT5;
    delay_ms(50);
}

HC595 100MHZ的速度,下图这些地方的时间改成延时5us都没问题。
上升沿送数据。
2片送完后给那个引脚上升沿就能行。
16路继电器的VCC不要用于单片机供电,不稳定。
在这里插入图片描述

发布了82 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/103393393