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. 时序图
①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 )
{
赞() |