出处:http://worldsing.cnblogs.com
74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准。 74HC595是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在SHcp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在STcp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。
将串行输入的8位数字,转变为并行输出的8位数字,例如控制一个8位数码管,将不会有闪烁。
8位串行输入 /8位串行或并行输出 存储状态寄存器,三种状态
输出寄存器(三态输出:就是具有高电平、低电平和高阻抗三种输出状态的门电路。)可以直接清除 100MHz的移位频率
并行输出,总线驱动; 串行输出;标准中等规模集成电路
595移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
参考数据
Cpd决定动态的能耗,
Pd=Cpd×VCC×f1+∑(CL×VCC^2×f0)
F1=输入频率,CL=输出电容 f0=输出频率(MHz) Vcc=电源电压
符号 引脚 描述
Q0…Q7 8位并行数据输出,其中Q0为第15脚
GND 第8脚 地
Q7’ 第9脚 串行数据输出
MR 第10脚 主复位(低电平)
SHCP 第11脚 移位寄存器时钟输入
STCP 第12脚 存储寄存器时钟输入
OE 第13脚 输出有效(低电平)
DS 第14脚 串行数据输入
VCC 第16脚 电源
注释
H=高电平状态
L=低电平状态
↑=上升沿
↓=下降沿
Z=高阻
NC=无变化
×=无效
当MR为高电平,OE为低电平时,数据在SHCP上升沿进入移位寄存器,在STCP上升沿输出到并行端口。
74HC595.c
------------------------------------------------------------------------------------------------------------------------------------------------------
#include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "74HC595.h" /* 延时模块82615468 sp-320-12 * */ static void delay(u32 t) { u32 i; while(t--) for (i = 0; i < 1; i++); } void HC595Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(HC595_CLK_GPIO_CLK | HC595_DATA_GPIO_CLK | HC595_CS_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = HC595_CLK_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HC595_CLK_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = HC595_DATA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HC595_DATA_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = HC595_CS_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HC595_CS_GPIO, &GPIO_InitStructure); HC595_CLK_H(); HC595_DATA_H(); HC595_CS_H(); } void HC595Send(u8 data) { u8 j; for (j = 8; j > 0; j--) { if(data & 0x80) HC595_DATA_H(); else HC595_DATA_L(); HC595_CLK_L(); //上升沿发生移位 delay(1); data <<= 1; HC595_CLK_H(); delay(1); } //HC595Load(); } void HC595Load(void) { HC595_CS_L(); HC595_CS_H(); } /* void LedRowOn(u8 Row7_0, u8 Row15_8, u8 Row16_23,u8 Row31_24) { HC595Send(Row15_8); HC595Send(Row7_0); HC595Send(Row31_24); HC595Send(Row16_23); HC595Load(); } */ void LedRowOut(u32 Data) { HC595Send(Data >> 24); HC595Send(Data >> 16); HC595Send(Data >> 8); HC595Send(Data >> 0); HC595Load(); } //end of file
74HC595.h
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#ifndef __74HC595_H__
#define __74HC595_H__
#define HC595_CLK_PIN GPIO_Pin_6
#define HC595_CLK_GPIO GPIOA
#define HC595_CLK_GPIO_CLK RCC_APB2Periph_GPIOA
#define HC595_CLK_H() GPIOA->BSRR = HC595_CLK_PIN
#define HC595_CLK_L() GPIOA->BRR = HC595_CLK_PIN
#define HC595_CS_PIN GPIO_Pin_7
#define HC595_CS_GPIO GPIOA
#define HC595_CS_GPIO_CLK RCC_APB2Periph_GPIOA
#define HC595_CS_H() GPIOA->BSRR = HC595_CS_PIN
#define HC595_CS_L() GPIOA->BRR = HC595_CS_PIN
#define HC595_DATA_PIN GPIO_Pin_10
#define HC595_DATA_GPIO GPIOE
#define HC595_DATA_GPIO_CLK RCC_APB2Periph_GPIOE
#define HC595_DATA_H() GPIOE->BSRR = HC595_DATA_PIN
#define HC595_DATA_L() GPIOE->BRR = HC595_DATA_PIN
void HC595Send(u8 data);
void HC595Init(void);
void HC595Load(void);
void LedRowOn(u8 Row7_0, u8 Row15_8, u8 Row16_23,u8 Row31_24);
void LedRowOut(u32 Data);
#endif
74HC595 for stm32 源代码下载