74系列芯片简介

74系列集成电路大致可分为6大类:
     74××(标准型);
     74LS××(低功耗肖特基);
     74S××(肖特基);
     74ALS××(先进低功耗肖特基);
     74AS××(先进肖特基);
     74F××(高速)。

近年来还出现了高速CMOS电路的74系列,该系列可分为3大类:
     HC为COMS工作电平;
     HCT为TTL工作电平,可与74LS系列互换使用;
     HCU适用于无缓冲级的CMOS电路。

其中74HC系列是目前应用最为广泛的74系列芯片,应用广泛且价格低廉。74HC系列是高速CMOS标准逻辑电路系列,具有与74LS系列同等的工作度和CMOS 集成电路固有的低功耗及电源电压范围宽等特点。型号最后几位数字相同,表示电路的逻辑功能、管脚排列完全兼容。

74HC595的主要参数

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK的上升沿,串行数据由DS输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

简单来说,就是单片机的信号可以通过串行输入74HC595来实现并行输出,节约了单片机上珍贵的引脚资源。(相应的,也有一款芯片可以实现并行输入,串行输出,和595功能正相反,这个芯片就是74HC165)

符号 引脚 描述
QA–QH 第15脚,第1-7脚 8位并行数据输出
GND 第8脚
SQH 第9脚 串行数据输出
SCLR 第10脚 主复位(低电平有效)
SH_CP、SCK 第11脚 数据输入时钟线
ST_CP、RCK 第12脚 输出存储器锁存时钟线
OE 第13脚 输出有效(低电平有效)
SI 第14脚 串行数据输入
VCC 第16脚 电源

(不同批次芯片其引脚名称可能有变化,但位置功能不变)

74HC595的使用

首先将74HC595的SHCP、STCP、SI连接单片机的三个输出引脚,SCLR接VCC,OE接GND,QA-QH连接输出。
当SHCP波形处于上升沿时,芯片会读取SI引脚高低电平并将数据依次保存在储存器中,当数据输入完成后,给STCP一个上升沿,芯片就能把储存器中数据并行输出。

595的数据来源只有这一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。
假如,我们要将二进制数据0111 1111 输入到595的移位寄存器中,0111 1111 这个数据完全输入后是这样的


这里我们注意到,0111 1111对应的输出引脚并不是ABCD……的顺序,而是HGFE……的倒序。

我们现在知道,使用一块74HC595可以用单片机的三个IO口控制8路信号输出,但若是想要控制16路信号呢?32路呢?是不是要用单片机的6个、12个引脚呢?这样的确可以达成目的,但是74HC595的SQH引脚为我们提供了更好的解决方案。我们可以将第一块595芯片的SQH引脚连接下一块595芯片的SI引脚,再将两块595芯片的SHCP,STCP分别连接在一起,这时,我们可以一次性朝第一块595芯片的SI引脚输入16位数据(如0011 0000 1111 0000),当输入到第九位数据1时,第一块595芯片的储存器已满,所以数据的第一位0就会由SQH引脚输入到第二块595芯片的储存器中,以此类推直到输入完16位数据。这样我们就通过两块595串联利用单片机的三个IO口控制16路输出了,如果是四块595串联,那就可以利用三个IO口控制32路输出了……

这里推荐一段视频,非常的直观易懂。https://www.bilibili.com/video/BV1xZ4y1Z7RP/?spm_id_from=333.999.0.0&vd_source=0c966c3372f6f92eed8e89d108b3ccca

74HC595数据手册:https://www.semiee.com/file/backup/PHILIPS-74HC595.pdf

供参考:stm32f103驱动程序header文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "Device/Include/stm32f10x.h"   // Device header
#include "delay.h"

void Init_A0A1A2() //初始化GPIOA输出
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;//GPIOA PIN 0 1 2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void GPIOA_Ctrl(unsigned char GPIN , unsigned char Bool)//将GPIO输出函数封装为bool值控制
{
if(Bool == 0){
GPIO_ResetBits(GPIOA , GPIN);
}
else GPIO_SetBits(GPIOA , GPIN);
}


void Op_74HC595(unsigned char DataByte )
{
unsigned char i;
for(i=0;i<8;i++){
GPIOA_Ctrl(GPIO_Pin_0 , DataByte & (0x80 >> i));­
GPIO_SetBits(GPIOA , GPIO_Pin_1);
GPIO_ResetBits(GPIOA , GPIO_Pin_1);
}
//GPIO_SetBits(GPIOA , GPIO_Pin_2);
//GPIO_ResetBits(GPIOA , GPIO_Pin_2);
}

void Scan_Row_Neg(unsigned char Frame_Row[8])
{
unsigned char i;
for(i=0;i<8;i++){
Op_74HC595(0x01 << i);
Op_74HC595(!Frame_Row[i]);
delay_ms(5);
}
GPIO_SetBits(GPIOA , GPIO_Pin_2);
GPIO_ResetBits(GPIOA , GPIO_Pin_2);
}