微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 74HC595驱动程序问题,求人指导

74HC595驱动程序问题,求人指导

时间:10-02 整理:3721RD 点击:
接一个595时,LED可以正常点亮。
两个595联级时,出现异常,第2个595控制的LED,会跟着第1个595控制的LED亮,有两位亮点还不一样,挺复杂,搞不明白啊。
第2个595的串行输入接第1个595的Q'

  1. #include <reg52.h>
  2. sbit SER=P1^0; //输入
  3. sbit OE0=P1^1; //输出使能
  4. sbit RC_LK=P1^2;//输出存储器锁存时钟
  5. sbit SRCLK=P1^3;//数据输入时钟
  6. sbit SRCLR0=P1^4;//移位寄存器清零
  7. void delay(unsigned int a)//延时
  8. {
  9. unsigned int i;
  10. while(a--!=0)
  11. {
  12. for(i=0;i<600;i++);
  13. }
  14. }
  15. char code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
  16.    
  17. void writebyte(char dat)//写入数据
  18. {
  19. char i;
  20. for(i=0;i<8;i++)
  21. {
  22. dat=dat>>1;
  23. SER=CY;
  24. SRCLK=0;
  25. SRCLK=1;
  26. }
  27. }
  28. main()
  29. {
  30. int p;
  31. OE0=0;
  32. SRCLR0=1;
  33. while(1)
  34. { for(p=0;p<8;p++)
  35. {
  36.   writebyte(table[p]);
  37.         RC_LK=1;
  38. RC_LK=0;
  39.         delay(1000);
  40. }
  41. }
  42. }

复制代码

程序有问题啊

  1. void writebyte(char dat)//写入数据  
  2. {  
  3. char i;  
  4. for(i=0;i<8;i++)  
  5. {  
  6. dat=dat>>1;  
  7. SER=CY;  
  8. SRCLK=0;  
  9. SRCLK=1;  
  10. }
  11. 应该改成
  12. void writebyte(char dat)//写入数据 , dat的低位先出高位后出
  13. {  
  14. char i;  
  15. for(i = 0;i < 8;i ++)  
  16. {  
  17.     if (dat & 0x01)
  18.         SER = 1;
  19.     else
  20.         SER = 0;

  21.     dat >>= 1;  
  22.     SRCLK = 0;  
  23.     SRCLK = 1;  
  24. }
  25. }
  26. 或者是:
  27. void writebyte(char dat)//写入数据 , dat的高位先出低位后出
  28. {  
  29. char i;  
  30. for(i = 0;i < 8;i ++)  
  31. {  
  32.     if (dat & 0x80)
  33.         SER = 1;
  34.     else
  35.         SER = 0;

  36.     dat <<= 1;  
  37.     SRCLK = 0;  
  38.     SRCLK = 1;  
  39. }
  40. }

复制代码

谢谢,我改下试试看

还是有问题哦,只接一个595时,LED可以正常点亮,貌似写入数据函数没错 。
但两个595联级时,出现异常,第2个595控制的LED,会跟着第1个595控制的LED亮,有两位亮点还不一样,是不是main函数哪里写错了?

有两个595,但你只writebyte了一次,当你第二次writebyte的时候,会把第一次写的数据推到前面那个595的,改成下面这样试试看:

  1.   writebyte(0);  
  2.   writebyte(table[p]);  
  3.   RC_LK=1;  
  4.   RC_LK=0;  
  5.   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的上拉电阻就行!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top