74HC595驱动程序问题,求人指导
两个595联级时,出现异常,第2个595控制的LED,会跟着第1个595控制的LED亮,有两位亮点还不一样,挺复杂,搞不明白啊。
第2个595的串行输入接第1个595的Q'
- #include <reg52.h>
- sbit SER=P1^0; //输入
- sbit OE0=P1^1; //输出使能
- sbit RC_LK=P1^2;//输出存储器锁存时钟
- sbit SRCLK=P1^3;//数据输入时钟
- sbit SRCLR0=P1^4;//移位寄存器清零
- void delay(unsigned int a)//延时
- {
- unsigned int i;
- while(a--!=0)
- {
- for(i=0;i<600;i++);
- }
- }
- char code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
-
- void writebyte(char dat)//写入数据
- {
- char i;
- for(i=0;i<8;i++)
- {
- dat=dat>>1;
- SER=CY;
- SRCLK=0;
- SRCLK=1;
- }
- }
- main()
- {
- int p;
- OE0=0;
- SRCLR0=1;
- while(1)
- { for(p=0;p<8;p++)
- {
- writebyte(table[p]);
- RC_LK=1;
- RC_LK=0;
- delay(1000);
- }
- }
- }
程序有问题啊
- void writebyte(char dat)//写入数据
- {
- char i;
- for(i=0;i<8;i++)
- {
- dat=dat>>1;
- SER=CY;
- SRCLK=0;
- SRCLK=1;
- }
- 应该改成
- void writebyte(char dat)//写入数据 , dat的低位先出高位后出
- {
- char i;
- for(i = 0;i < 8;i ++)
- {
- if (dat & 0x01)
- SER = 1;
- else
- SER = 0;
- dat >>= 1;
- SRCLK = 0;
- SRCLK = 1;
- }
- }
- 或者是:
- void writebyte(char dat)//写入数据 , dat的高位先出低位后出
- {
- char i;
- for(i = 0;i < 8;i ++)
- {
- if (dat & 0x80)
- SER = 1;
- else
- SER = 0;
- dat <<= 1;
- SRCLK = 0;
- SRCLK = 1;
- }
- }
谢谢,我改下试试看
还是有问题哦,只接一个595时,LED可以正常点亮,貌似写入数据函数没错 。
但两个595联级时,出现异常,第2个595控制的LED,会跟着第1个595控制的LED亮,有两位亮点还不一样,是不是main函数哪里写错了?
有两个595,但你只writebyte了一次,当你第二次writebyte的时候,会把第一次写的数据推到前面那个595的,改成下面这样试试看:
- writebyte(0);
- writebyte(table[p]);
- RC_LK=1;
- RC_LK=0;
- delay(1000);
SRCLK=0;
SRCLK=1;
和
RC_LK=1;
RC_LK=0;
的状态转换加入少许延时试试。我记得595好像有一点响应延时的。
改成:
SRCLK=0;
delay(XXX);
SRCLK=1;
delay(XXX);
和
RC_LK=1;
delay(XXX);
RC_LK=0;
delay(XXX);
另外要看看你的电路接法是否有错误
writebyte(0); //这句可以控制第二个595(更改括号内数值可以控制第二个595输出),但是LED常亮是状态,貌似没有收到位移信号输入。估计问题就出在这了,但不知道怎么改
writebyte(table[p]);
RC_LK=1;
RC_LK=0;
delay(1000);
加延时后没有什么变化,还是老问题.
电路检查了,两个595的引脚接法一致,除了第2个595的串行输入接第1个595的Q',两个595的引脚接法一致,是这样接吧?
我试了一下你的程序,不知道你的SER=CY;这个CY是指的什么。如果CY=dat&0b0000001,你的程序就没问题。你的显示本来就应该是第2个595显示table0,第一个595显示table1,然后延时,然后第2个595显示table1,第一个595显示table2,以此类推。建议你把char code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
显示的内容由单个笔画换成数字0-9,看起来比较直观。另外还是建议你在状态切换中加入几十ns的延时,595PDF上有要求的。
我试你的程序只改了下面:
void writebyte(char dat)//写入数据
{
char i;
char cy;
cy=dat;
for(i=0;i<8;i++)
{
SER=cy&0b00000001;
cy=cy>>1;
SRCLK=0;
delay(2);
SRCLK=1;
}
}
其他都没变,运行结果是正常的.
如果你的595接法和我的一样,可以这样些char code table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,}; //共阴数码管0-7
595
LED常亮是因为你写的是常量啊,把第一个writebyte(0); 改成writebyte(table[7-p]); 试试看,是不是两个流水灯是反方向的了?
谢谢各位指导,终于弄好了。
第2个595显示table0,第一个595显示table1,然后延时,
然后第2个595显示table1,第一个595显示table2,以此类推。就是这样的。
谢谢大家帮忙。
技术贴 顶下
受教了
初学者。刚入门
硬件的的问题,当驱动两个595时,单片机的驱动电流不够,数据输入和两个时钟信号加1k的上拉电阻就行!
。