文章原始地址:http://feotech.com/?p=44

一. 74HC595芯片介绍
74HC595是串口转并口芯片,可输出三种状态:高电平、低电平和高组态。
一片74HC595芯片可实现3根口线扩展为8根口线.也可采用多片74HC595进行级联的方式扩展输出口线。


Q0~Q7: 并行数据数据输出端;
GND: 接地引脚;
Q7S: 串行数据输出(多芯片级联时使用);
MR: 复位引脚,当引脚接低电平时芯片内部数据存储寄存器数据清零复位.如不使用一般接高电平;
SHCP: 移位寄存器的时钟输入,当接收到上升沿时移位寄存器内部数据整体后移;
STCP: 数据存储寄存器时钟输入,当检测到上升沿时使能数据存储寄存器,将芯片接收到的数据输出到Q0~Q7 ,Q7S引脚.可以将其理解为锁存信号,当数据发送给芯片完成后对该引脚发送上升沿;
OE: 输出使能引脚,为高电平时芯片输出引脚为高组态,当为低电平时芯片输出引脚为高(低)电平.该引脚可用于同时控制并行输出引脚的电平,如控制LED闪烁等.当不使用该功能时通常接低电平;
DS: 串行数据输入端
VCC: 电源引脚

从功能框图中可以看出74HC595含有一个移位寄存器,一个存储寄存器和一个三态输出控制器。

在使用74HC595设计电路时应注意不同厂家生产的芯片对时钟最高频率和高电平保持时间范围都有不同要求.应查看对应厂家的芯片Data Sheet.本例程中使用的是Nexperia (NXP)所生产的74HCT595。

二. 74HC595硬件设计与74HC595驱动程序

1.单芯片工作模式

/********************************************************************************* @file    LED.c* @author  Ryan Zhao* @version V1.0.0* @date    2017-05-03* @brief   用于通过驱动芯片74HC595来控制LED.******************************************************************************* @attention*  注意CPU引脚的频率应在74HC595正常工作所允许的范围.******************************************************************************
**/
/**
* @brief  74HC595 的引脚初始化.
* @param  None.
* @retval None.
*/
void LED595Init(void)
{                GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//如果74HC595的驱动引脚为JTAG,则将JTAG引脚禁用并配置为通用GPIO引脚.//如果驱动引脚为通用GPIO则需要注释掉以下内容GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG功能,保留SWDGPIO_InitStructure.GPIO_Pin = LED595_DATA_PIN | LED595_LATCH_PIN;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOB, &GPIO_InitStructure);           GPIO_ResetBits(GPIOB,LED595_DATA_PIN | LED595_LATCH_PIN);//Data PinGPIO_InitStructure.GPIO_Pin  = LED595_DATA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_DATA_PORT, &GPIO_InitStructure);        //Clk PinGPIO_InitStructure.GPIO_Pin  = LED595_CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_CLK_PORT, &GPIO_InitStructure);  //Latch PinGPIO_InitStructure.GPIO_Pin  = LED595_LATCH_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_LATCH_PORT, &GPIO_InitStructure);
}
/*** @brief  将输入的数据输出到74HC595的引脚.* @param  Input 1 byte data.* @retval None.
**/
void LED595SendData(unsigned char OutData)
{unsigned char i; //发送数据时做循环使用临时变量for(i=0; i<8; i++) //将8位数据按位发送,先发送高字节后发送低字节{LED595_CLK_RESET;//时钟线低电平if( (OutData & 0x8000) == 0x8000)//判断数据高低位{LED595_DATA_SET;                   //数据线高电平}else{LED595_DATA_RESET;          //数据线低电平}OutData = OutData << 1;         //数据左移1位LED595_CLK_SET;                 //时钟线高电平}//上升沿输出数据LED595_LATCH_RESET;  LED595_LATCH_SET;
}
/********************************************************************************* @file    LED595.h* @author  Ryan Zhao* @version V1.0.0* @date    2017-05-03* @brief   用于通过驱动芯片74HC595来控制LED.******************************************************************************* @attention*  注意CPU引脚的切换速度应在74HC595正常工作所允许的范围.******************************************************************************
**/
//74HC595口线定义宏定义.当驱动74HC595引脚改变时,只需更改底层引脚宏定义即可
#define    LED595_DATA_PORT     GPIOB
#define    LED595_DATA_PIN      GPIO_Pin_3
#define    LED595_CLK_PORT      GPIOB
#define    LED595_CLK_PIN       GPIO_Pin_5
#define    LED595_LATCH_PORT    GPIOB
#define    LED595_LATCH_PIN     GPIO_Pin_4
//74HC595口线高低电平宏定义
#define    LED595_DATA_SET      GPIO_SetBits(LED595A_DATA_PORT,LED595A_DATA_PIN)
#define    LED595_DATA_RESET    GPIO_ResetBits(LED595A_DATA_PORT,LED595A_DATA_PIN)
#define    LED595_CLK_SET       GPIO_SetBits(LED595A_CLK_PORT,LED595A_CLK_PIN)
#define    LED595_CLK_RESET     GPIO_ResetBits(LED595A_CLK_PORT,LED595A_CLK_PIN)
#define    LED595_LATCH_SET     GPIO_SetBits(LED595A_LATCH_PORT,LED595A_LATCH_PIN)
#define    LED595_LATCH_RESET   GPIO_ResetBits(LED595A_LATCH_PORT,LED595A_LATCH_PIN)

函数使用

LED595SendData(0xFF); //74HC595输出端全部为高电平,LED全部熄灭
LED595SendData(0x00); //74HC595输出端全部为低电平,LED全部点亮

2.级联工作模式

/********************************************************************************* @file    LED.c* @author  Ryan Zhao* @version V1.1.0* @date    2017-06-05* @brief   用于通过驱动芯片74HC595来控制LED.******************************************************************************* @attention**  注意CPU引脚的切换速度应在74HC595正常工作所允许的范围.*******************************************************************************
**/
/**
* @brief  74HC595 的引脚初始化.
* @param  None.
* @retval None.
*/
void LED595Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//Data PinGPIO_InitStructure.GPIO_Pin = LED595_DATA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_DATA_PORT, &GPIO_InitStructure);//Clk PinGPIO_InitStructure.GPIO_Pin = LED595_CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_CLK_PORT, &GPIO_InitStructure);//Latch PinGPIO_InitStructure.GPIO_Pin = LED595_LATCH_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_LATCH_PORT, &GPIO_InitStructure);
}/*** @brief  LED显示函数.* @param  要显示的数据.* @retval None.
**/
void LED595SendData(unsigned int OutData)
{unsigned char i; //发送数据时做循环使用临时变量for (i = 0; i < 16; i++) //将16位数据按位发送{LED595_CLK_RESET;  //时钟线低电平if ((OutData & 0x8000) == 0x8000) //判断数据高低位{LED595_DATA_SET; //发送数据高位}else{LED595_DATA_RESET; //发送数据低位}OutData = OutData << 1; //数据左移1位LED595_CLK_SET;          //时钟线高电平}//上升沿输出数据LED595_LATCH_RESET;LED595_LATCH_SET;
}
/********************************************************************************* @file    LED595.h* @author  Ryan Zhao* @version V1.1.0* @date    2017-05-03* @brief   用于通过驱动芯片74HC595来控制LED.******************************************************************************* @attention**  注意CPU引脚的切换速度应在74HC595正常工作所允许的范围.*******************************************************************************
**//**********************物理层定义******************************/
//74HC595口线定义宏定义.当驱动74HC595引脚改变时,只需更改底层引脚宏定义即可
#define    LED595_DATA_PORT   GPIOC
#define    LED595_DATA_PIN    GPIO_Pin_5
#define    LED595_CLK_PORT    GPIOB
#define    LED595_CLK_PIN     GPIO_Pin_0
#define    LED595_LATCH_PORT  GPIOB
#define    LED595_LATCH_PIN   GPIO_Pin_1//74HC595口线高低电平宏定义
#define    LED595_DATA_SET     GPIO_SetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define    LED595_DATA_RESET   GPIO_ResetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define    LED595_CLK_SET      GPIO_SetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define    LED595_CLK_RESET    GPIO_ResetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define    LED595_LATCH_SET    GPIO_SetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
#define    LED595_LATCH_RESET  GPIO_ResetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
#define    LED595_DATA_PORT     GPIOC
#define    LED595_DATA_PIN      GPIO_Pin_5
#define    LED595_CLK_PORT      GPIOB
#define    LED595_CLK_PIN       GPIO_Pin_0
#define    LED595_LATCH_PORT    GPIOB
#define    LED595_LATCH_PIN     GPIO_Pin_1//74HC595口线高低电平宏定义
#define    LED595_DATA_SET      GPIO_SetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define    LED595_DATA_RESET    GPIO_ResetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define    LED595_CLK_SET       GPIO_SetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define    LED595_CLK_RESET     GPIO_ResetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define    LED595_LATCH_SET     GPIO_SetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
#define    LED595_LATCH_RESET   GPIO_ResetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)

函数使用

LED595SendData(0xFFFF); //74HC595输出端全部为高电平,LED全部熄灭
LED595SendData(0x0000);//74HC595输出端全部为低电平,LED全部点亮

74HC595驱动程序相关推荐

  1. 第十七节:两片联级74HC595驱动16个LED灯的基本驱动程序

    . 开场白: 上一节讲了如何把矩阵键盘翻译成独立按键的处理方式.这节讲74HC595的驱动程序.要教会大家两个知识点: 第一点:朱兆祺的学习板是用74HC595控制LED,因此可以直接把595的OE引 ...

  2. STC8H8K64U——74HC595

    74HC595 单片74HC595驱动程序,实现八个LED灯依次点亮. /* 频率:100MHz Q0~Q7并行三态输出端 OE 输出使能端,高电平时,移位寄存器清零,Q0~Q7处于高阻态. MR 主 ...

  3. 74HC595/四位按键 驱动四位数码管

    一.主要元器件和原理 GD32F303RCT6 74HC595 共阳数码管 按键(图片数码管名字有误) 风中凌乱的笔记: A1A2A3A4下拉工作模式.给A1A2A3A4一个低电平.当abcdefg来 ...

  4. [51单片机] 从业将近十年!手把手教你单片机程序框架(连载)(转载)

    这个是转载的 http://bbs.21ic.com/icview-691804-1-1.html [51单片机] 从业将近十年!手把手教你单片机程序框架(连载) 大家好,我叫吴坚鸿,从事单片机项目开 ...

  5. 第十九节:依次逐个点亮LED之后,再依次逐个熄灭LED的跑马灯程序。

    开场白: 上一节讲了把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式.这节在上一节的驱动程序基础上,开始讲跑马灯程序.我的跑马灯程序看似简单而且重复,其实蕴含着鸿哥的大智慧.它是基于鸿哥的 ...

  6. [原创]基于proteus仿真16*64点阵屏带DS1302实钟芯片

    注:本人大一新生,未学习电路,单片机,C语言,汇编均为自学内存,故难免有所疏露,希望大家多多指点. 该项目为惠州学院计算机系嵌入式培训班硬件组的任务(本人是电子系的,但还是加入了呵). 设计思路: 1 ...

  7. 单片机学习笔记————51单片机实现用LED灯和按键来模拟工业自动化设备的运动控制

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

  8. SM74HC595D电路级联教程[转载]

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/zwj695535100/articl ...

  9. 74HC595驱动四位数码管

    74HC595驱动四位数码管 数码管编码 出处 硬件原理图 出处 驱动程序 出处 1.数码管编码介绍 它每一段是一个发光二极管,排成一个"日"字形.通过控制某几段发光二极管的发光来 ...

最新文章

  1. 浅谈 UC 国际信息流推荐
  2. u-boot分析——struct gd_t与struct bd_t
  3. Python中使用requests和parsel爬取喜马拉雅电台音频
  4. 解决每次从cmd进入sqlplus,都得重新设置pagesize、linesize的问题
  5. python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
  6. C# Span 源码解读和应用实践
  7. 使用ISE一键生成bit文件
  8. js时间搓化为今天明天_秋冬国产搓背神器!360°无死角,让你搓背不求人,太舒服了...
  9. bootstrap轮播图 原点变为方块_Brother兄弟机床原点设定方法
  10. android系统戳,直戳ARM长处 首个RISC-V版Android 10系统顺畅运行
  11. mysql 5.6特性_MySQL 5.6新特性概览
  12. linux shell的sleep指定延时单位
  13. Kali Linux萌新特别篇
  14. 今天向你们分享一个表白代码(I LOVE YOU)
  15. 高等数学复盘 | 第七册上册第一章——第六章思维导图梳理(复习专用)
  16. 【细胞分割】基于形态学算法实现红细胞计数matlab源码含 GUI
  17. 数据挖掘中所需的概率论与数理统计知识
  18. VC程序里判断系统是64位还是32位的正确方法
  19. win32 009 masm32
  20. tomcat实现https

热门文章

  1. JavaScript- 省市联动代码
  2. input驱动12种事件类型Event types的含义
  3. android 串口调试
  4. MT6575 3G切换2G
  5. 一点一滴培养你的领袖气质
  6. python制作英语字典_如何在Python中创建字典词典
  7. OTA固件升级对于物联网设备的重要性
  8. EntityFramework Core 1.1是如何创建DbContext实例的呢?
  9. JavaScript Array.prototype.some()
  10. Arduino vs Raspberry Pi vs BeagleBone