找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1959|回复: 10
收起左侧

74hc595级联每一片输出所耗时间是不是不同

[复制链接]
ID:698257 发表于 2020-3-2 03:07 来自手机 | 显示全部楼层 |阅读模式
10黑币
如果三片74hc595级联,假如第一片完全输出要8个脉冲信号,那第二片输出是不是就得花费16个脉冲信号才行,第三片是不是得24个脉冲才行,所有输入不得都经过第一片么,为什么有的程序每一片时间都一样嘞,求大佬告知

回复

使用道具 举报

ID:697917 发表于 2020-3-2 14:11 | 显示全部楼层
可否贴下你的级联原理图。
回复

使用道具 举报

ID:275826 发表于 2020-3-2 14:45 | 显示全部楼层
都是8个脉冲
回复

使用道具 举报

ID:698257 发表于 2020-3-2 16:23 来自手机 | 显示全部楼层
下边是昨天看到的程序,是八个595级联,主函数里边每个调用的函数都是先移了八位后就直接锁存了,后边再调用装第二片595不是会影响第一片数据么

回复

使用道具 举报

ID:88256 发表于 2020-3-2 16:34 | 显示全部楼层
只需要8个脉冲,因为该级595要显示的内容是取自上一级595的输出,而不是单片机,所以只需移位8次。
回复

使用道具 举报

ID:698257 发表于 2020-3-2 16:39 来自手机 | 显示全部楼层
tyrl800 发表于 2020-3-2 14:45
都是8个脉冲

怎么都是八个脉冲呢?不是第二片输出不是经过第一片么,而且第一片八位输完已经锁存了,那这样不是第二片是时序多了,而且同一个锁存脉冲不是存了第二片也会影响到第一片么
回复

使用道具 举报

ID:698257 发表于 2020-3-2 16:40 来自手机 | 显示全部楼层
abc18434762843 发表于 2020-3-2 16:23
下边是昨天看到的程序,是八个595级联,主函数里边每个调用的函数都是先移了八位后就直接锁存了,后边再调 ...

不好意思,刚刚那个程序不全,现在补全

#include <reg52.h>
sbit  st=P1^5;   //  存储脉冲 该脉冲上升沿所有被所存的信号一起输出
sbit  sh=P1^6;   //  移位脉冲 该脉冲上升沿输出信号移位,但不一定输出
sbit  DA=P1^7;   //  待移入的数据信号
sbit oe_595=P3^6; // 595使能端
sbit oe_138=P1^4; // 138使能端
unsigned char code zf[4][32]=  //从左到右  从上到下  横向8点右高位
{
0x00,0x10,0xFE,0x3F,0x80,0x00,0x80,0x00, //"正"
0x80,0x00,0x80,0x00,0x88,0x08,0x88,0x1F,
0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,
0x88,0x00,0x88,0x20,0xFF,0x7F,0x00,0x00,

0x40,0x00,0x40,0x00,0x40,0x20,0xFF,0x7F, //"在"
0x20,0x00,0x20,0x02,0x10,0x02,0x10,0x0A,
0xC8,0x1F,0x0C,0x02,0x0A,0x02,0x09,0x02,
0x08,0x02,0x08,0x22,0xE8,0x7F,0x08,0x00,

0x00,0x00,0x02,0x22,0xE4,0x27,0x24,0x2A, //"测"
0xA1,0x2A,0xA6,0x2A,0xA4,0x2A,0xB0,0x2A,
0xA8,0x2A,0xA4,0x2A,0xA7,0x2A,0x84,0x20,
0x44,0x21,0x24,0x22,0x14,0x2A,0x04,0x10,

0x00,0x04,0x02,0x14,0x04,0x24,0x04,0x04, //"试"
0xF0,0x7F,0x00,0x04,0x07,0x04,0xE4,0x07,
0x84,0x04,0x84,0x08,0x84,0x08,0x84,0x08,
0x94,0x4B,0xEC,0x48,0x44,0x50,0x00,0x20
};
void Delay(unsigned int i)   // 延时函数
{
while(--i)
;
}
void SendByte(unsigned char Dat) // 对595写入一个字节数据
{
   unsigned char a;
   for(a=0;a<8;a++)    // 分8次移位输出到锁存器
  {
    if((Dat&0x80)==0x80)  // 判断写0还是写1
  { DA=1; }  
  else
  { DA=0; }
    sh = 0;  
  st = 0;
  sh = 1;      // SH上升沿所存移位输出信号
  st = 1;      // ST上升沿输出锁存数据
    Dat=Dat<<1;     // 数据移一位
  }
}
void main(void)      // 主程序
{
oe_595=0;oe_138=1;    // 初始化 开595 关138
  while(1)
  {unsigned char i;
    for(i=0;i<16;i++)   // 共计16次,因为共有16行要扫描
  {
  SendByte(zf[0][i*2]);
  SendByte(zf[0][i*2+1]);
  SendByte(zf[1][i*2]);
  SendByte(zf[1][i*2+1]);
  SendByte(zf[2][i*2]);
  SendByte(zf[2][i*2+1]);
  SendByte(zf[3][i*2]);
  SendByte(zf[3][i*2+1]);  // 送某行的8列显示数据
  P1=i;      // 送扫描码
  oe_138=0;     // 开138 显示该行数据
  Delay(100);     // 延时一会
  oe_138=1;     // 关138
     }
   }
}
回复

使用道具 举报

ID:698257 发表于 2020-3-2 16:50 来自手机 | 显示全部楼层
hhdsdy 发表于 2020-3-2 16:34
只需要8个脉冲,因为该级595要显示的内容是取自上一级595的输出,而不是单片机,所以只需移位8次。

那这样后一片的内容一锁存,那前一片的输出不就也变了么
回复

使用道具 举报

ID:88256 发表于 2020-3-2 17:01 | 显示全部楼层
abc18434762843 发表于 2020-3-2 16:23
下边是昨天看到的程序,是八个595级联,主函数里边每个调用的函数都是先移了八位后就直接锁存了,后边再调 ...

595有数据锁存的,移位和数据并行输出是分开的,移位过程中并不会改变并行的内容,所以送数给第2片数据并不会改变第一片的显示内容
回复

使用道具 举报

ID:94031 发表于 2020-3-2 17:35 | 显示全部楼层
因为74hc595级联是串行,串行先送的数是第三级,然后二级,一级,因此三级数到达后,其他两级的数据也就到达,再一起输出,具体应看595时序图。
回复

使用道具 举报

ID:679425 发表于 2020-3-5 08:37 | 显示全部楼层
具体应看595时序图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表