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);但运行后结果乱七八糟,单片的能控制,级联如何做?像上面,如何改正即可,请教! 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. 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,其他控制口接在同一根线上。 给你一个我项目上用的三个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信号,否测上电很容易显示乱。 【3楼】 haso2007 错别字-妹影
-------------------------------------
果然精典,对我非常实用。为什么用在SPI上面不行呢? 全程英文回复的那位当前更今非昔比了吧,谢谢给出方案的坛友。 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]