74HC595驱动程序
文章原始地址: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驱动程序相关推荐
- 第十七节:两片联级74HC595驱动16个LED灯的基本驱动程序
. 开场白: 上一节讲了如何把矩阵键盘翻译成独立按键的处理方式.这节讲74HC595的驱动程序.要教会大家两个知识点: 第一点:朱兆祺的学习板是用74HC595控制LED,因此可以直接把595的OE引 ...
- STC8H8K64U——74HC595
74HC595 单片74HC595驱动程序,实现八个LED灯依次点亮. /* 频率:100MHz Q0~Q7并行三态输出端 OE 输出使能端,高电平时,移位寄存器清零,Q0~Q7处于高阻态. MR 主 ...
- 74HC595/四位按键 驱动四位数码管
一.主要元器件和原理 GD32F303RCT6 74HC595 共阳数码管 按键(图片数码管名字有误) 风中凌乱的笔记: A1A2A3A4下拉工作模式.给A1A2A3A4一个低电平.当abcdefg来 ...
- [51单片机] 从业将近十年!手把手教你单片机程序框架(连载)(转载)
这个是转载的 http://bbs.21ic.com/icview-691804-1-1.html [51单片机] 从业将近十年!手把手教你单片机程序框架(连载) 大家好,我叫吴坚鸿,从事单片机项目开 ...
- 第十九节:依次逐个点亮LED之后,再依次逐个熄灭LED的跑马灯程序。
开场白: 上一节讲了把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式.这节在上一节的驱动程序基础上,开始讲跑马灯程序.我的跑马灯程序看似简单而且重复,其实蕴含着鸿哥的大智慧.它是基于鸿哥的 ...
- [原创]基于proteus仿真16*64点阵屏带DS1302实钟芯片
注:本人大一新生,未学习电路,单片机,C语言,汇编均为自学内存,故难免有所疏露,希望大家多多指点. 该项目为惠州学院计算机系嵌入式培训班硬件组的任务(本人是电子系的,但还是加入了呵). 设计思路: 1 ...
- 单片机学习笔记————51单片机实现用LED灯和按键来模拟工业自动化设备的运动控制
一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...
- SM74HC595D电路级联教程[转载]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/zwj695535100/articl ...
- 74HC595驱动四位数码管
74HC595驱动四位数码管 数码管编码 出处 硬件原理图 出处 驱动程序 出处 1.数码管编码介绍 它每一段是一个发光二极管,排成一个"日"字形.通过控制某几段发光二极管的发光来 ...
最新文章
- 浅谈 UC 国际信息流推荐
- u-boot分析——struct gd_t与struct bd_t
- Python中使用requests和parsel爬取喜马拉雅电台音频
- 解决每次从cmd进入sqlplus,都得重新设置pagesize、linesize的问题
- python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
- C# Span 源码解读和应用实践
- 使用ISE一键生成bit文件
- js时间搓化为今天明天_秋冬国产搓背神器!360°无死角,让你搓背不求人,太舒服了...
- bootstrap轮播图 原点变为方块_Brother兄弟机床原点设定方法
- android系统戳,直戳ARM长处 首个RISC-V版Android 10系统顺畅运行
- mysql 5.6特性_MySQL 5.6新特性概览
- linux shell的sleep指定延时单位
- Kali Linux萌新特别篇
- 今天向你们分享一个表白代码(I LOVE YOU)
- 高等数学复盘 | 第七册上册第一章——第六章思维导图梳理(复习专用)
- 【细胞分割】基于形态学算法实现红细胞计数matlab源码含 GUI
- 数据挖掘中所需的概率论与数理统计知识
- VC程序里判断系统是64位还是32位的正确方法
- win32 009 masm32
- tomcat实现https