[!--tag.name--]

74HC595使用笔记

标签:74HC595   

《74HC595使用笔记》这篇文章中存在错误,具体如下:

*错误描述:
*联系邮箱:

1.简介

74HC595(74HCT595),是8-bit串行输入,实现8-bit串行或并行输出,带有移位寄存器和输出锁存,输出端口带有三态功能; 

芯片封装形式有:DIP16、SO16、SSOP16、TSSOP16、DHVQFN16。引脚控制信号可以IO口模拟,也可通过标准SPI进行。

2. 引脚说明:

PIN1(Q1):并行数据输出端第1位;
PIN2(Q2):并行数据输出端第2位;
PIN3(Q3):并行数据输出端第3位;
PIN4(Q4):并行数据输出端第4位;
PIN5(Q5):并行数据输出端第5位;
PIN6(Q6):并行数据输出端第6位;
PIN7(Q7):并行数据输出端第7位;
PIN8(GND):地;  PIN9(Q7’ ):串行数据输出端,一般作为级联输出使用;
PIN10(/MR ):低点平时将移位寄存器的数据清零,一般上拉10K电阻到VCC;
PIN11(SH_CP ):移位寄存器的时钟输入,上升沿时数据进行移位,下降沿数据不发生变化,使用时可根据要移位的数据位数,发出相应数量的脉冲数;
PIN12(ST_CP):存储寄存器的时钟输入,上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变,即当上升沿时,Q0-Q7按照当前移位寄存器数据进行并行输出;(例:设输入数据为0x01,①在每一次移位后,ST_CP都发出脉冲,则可实现8个通道的循环选通;②在所有移位完成后(SH_CP脉冲完成),ST_CP发出脉冲,可实现8个通道选通第1通道,如此将0x01更换为不同的输入数据,可以实现不同的1个或多个通道的并行输出);
PIN13(/OE):输出使能,低电平有效,高电平禁止(高阻态);
PIN14(DS):串行数据输入,要并行输出的数据,也是级联的输入端口;如果没有级联则是8-bit,若是二级级联,数据位数是16-bit;  PIN15(Q0 ):并行数据输出端第0位;  PIN16(VCC):电源,74HC系列为2~6V,74HCT系列为4.5~5.5V。

3. 电路原理

引脚控制信号可以IO口模拟,也可通过标准SPI进行。

用IO口模拟,将PIN11-PIN14分别连到MCU的控制IO,使能脚接10K电阻上拉到VCC,PIN10 也接10K电阻上拉到VCC。

如果有级联,将第一级的PIN9连到第二级的PIN14,以此类推。

用标准SPI,SPI-SCK与SH_CP连,MOSI与DS连,MISO与ST_CP相连,NSS与/OE相连(见 过STM32系列这样用过,但作者本人未调试)。

4. 时序图

1.jpg

①SH_CP没有必要一直给,当数据的每位输入之后,再给脉冲,数据位数和脉冲数相等就可以;

②使能引脚一定得是最先变为低电平;当使能为高电平时,Q0-Q7的输出为高阻态;

③ST_CP何时输出取决于实际使用,每给一次脉冲,Q0-Q7会进行相应的并行输出;上图中ST_CP的前8个脉冲使得数据从Q0移位到Q7;

④/MR为低电平时,把移位寄存器数据清0;/MR为高电平、/OE为低电平起,各引脚信号为有意义;

⑤DS端为1时,此刻所对应的SH_CP脉冲对于Q0-Q7移位无意义,下一次脉冲将数据移位到Q0;但对于Q7’,只要/MR为高电平后,就有意义;

⑥数据1在SH_CP发出8个脉冲后,在Q7’出现。

5.IO口模拟的使用步骤:

①IO口设置为输出方式;

②将数据的第1位放入到数据输入端; 

③产生1个时钟脉冲(上升沿),使第1位数据移位到Q0; 

④根据实际应用,判断是否需要并行输出,若需输出,ST_CP产生1个时钟脉冲(上升沿),否则不需输出,此端口不用处理; 

⑤重复步骤②③④,将第2位一直到第8位数据移位完成,并根据实际应用,判断是否需并行输出; 

⑥根据实际应用,判断何时关闭并行输出,或者不用关闭。  

注:SH_CP输出脉冲与ST_CP输出脉冲互不影响,是两个独立的过程,即:可以一边进行数据移位,一边数据输出,可以同时进行。这是此芯片的优点,在移位的过程中,输出端数据可以保持不变。在串行速度较慢的数码管应用时,可以利用这个特点,减轻数码管的闪烁。

6.软件代码(未级联)
//宏定义 

#define  POSITION   1  #define  NEGATIVE   0 
#define  SIO_IN_LOW   SBIT_P32 = NEGATIVE 
#define  SIO_IN_HIGH  SBIT_P32 = POSITION 
#define  SIO_CLK_LOW  SBIT_P33 = NEGATIVE 
#define  SIO_CLK_HIGH  SBIT_P33 = POSITION 
#define  SIO_LATCH_LOW  SBIT_P34 = NEGATIVE 
#define  SIO_LATCH_HIGH SBIT_P34 = POSITION 
#define  SIO_EN_LOW   SBIT_P35 = NEGATIVE 
#define  SIO_EN_HIGH  SBIT_P35 = POSITION  
//子函数  void senddata( uchar uc74595data )
{
     uchar data i;
     SIO_IN_LOW;
     SIO_CLK_LOW;
     SIO_LATCH_LOW;
      SIO_EN_LOW;
     _nop_( );
     _nop_( );
     _nop_( );
     _nop_( );
     _nop_( );
 
   for(i=0;i<8;i++) 
   {
         if( (uc74595data & 0x01) == 0 ) 
         {