//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不要用于单片机供电,不稳定。