【74HC595】STM32 74HC595驱动程序

以下为.h文件:

#ifndef __74HC595_H__
#define __74HC595_H__
#include "stm32f10x.h"  



 
 
#define SHCP_GPIO_PORT      GPIOA			              
#define SHCP_GPIO_CLK 	    RCC_APB2Periph_GPIOA		
#define SHCP_GPIO_PIN	    GPIO_Pin_1		       
 
#define STCP_GPIO_PORT      GPIOA		              
#define STCP_GPIO_CLK 	    RCC_APB2Periph_GPIOA		
#define STCP_GPIO_PIN	    GPIO_Pin_0		        
 
#define DS_GPIO_PORT        GPIOB			              
#define DS_GPIO_CLK 	    RCC_APB2Periph_GPIOB		
#define DS_GPIO_PIN	    GPIO_Pin_1	
 
#define HC595_SHCP_Low()      GPIO_ResetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )
#define HC595_SHCP_High()     GPIO_SetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )
#define HC595_STCP_Low()      GPIO_ResetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )
#define HC595_STCP_High()     GPIO_SetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )
#define HC595_Data_Low()      GPIO_ResetBits( DS_GPIO_PORT, DS_GPIO_PIN )
#define HC595_Data_High()     GPIO_SetBits( DS_GPIO_PORT, DS_GPIO_PIN )
 
 
void HC595_GPIO_Config(void);
void HC595_Send_Byte(u8 byte);
void HC595_CS(void);
void HC595_Send_Multi_Byte(u8 *data, u16 len);


#endif

以下为.c文件:

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

#include "74HC595.h"
void delay(uint16_t t);
 
 
/********  74HC595 GPIO 配置 *************************/
void HC595_GPIO_Config(void)
{		
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd( SHCP_GPIO_CLK | STCP_GPIO_CLK | DS_GPIO_CLK, ENABLE);
			
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
		GPIO_InitStructure.GPIO_Pin = SHCP_GPIO_PIN;
		GPIO_Init(SHCP_GPIO_PORT, &GPIO_InitStructure);   // 初始化 SHCP 引脚
	
		GPIO_InitStructure.GPIO_Pin = STCP_GPIO_PIN;
		GPIO_Init(STCP_GPIO_PORT, &GPIO_InitStructure);   // 初始化 STCP 引脚
	
		GPIO_InitStructure.GPIO_Pin = DS_GPIO_PIN;
		GPIO_Init(DS_GPIO_PORT, &GPIO_InitStructure);     // 初始化 DS   引脚
 
		GPIO_ResetBits(SHCP_GPIO_PORT, SHCP_GPIO_PIN);      // 引脚初始状态为高,便于产生上升沿
		GPIO_ResetBits(STCP_GPIO_PORT, STCP_GPIO_PIN);	 
		GPIO_ResetBits(DS_GPIO_PORT, DS_GPIO_PIN);
}
 
 
/***
 *74HC595 发送一个字节 
 *即往74HC595的DS引脚发送一个字节
*/
void HC595_Send_Byte(u8 byte)
{
	u8 i;
	for (i = 0; i < 8; i ++)  //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
	{
	  /****  步骤1:将数据传到DS引脚    ****/
		if (byte & 0x80)        //先传输高位,通过与运算判断第八是否为1
			HC595_Data_High();    //如果第八位是1,则与 595 DS连接的引脚输出高电平
		else                    //否则输出低电平
			HC595_Data_Low();
		
		/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
		HC595_SHCP_Low();   // SHCP拉低
		delay(1);           // 适当延时
		HC595_SHCP_High();  // SHCP拉高, SHCP产生上升沿
		delay(1);
		
		byte <<= 1;		// 左移一位,将低位往高位移,通过	if (byte & 0x80)判断低位是否为1
	}
}
 
/**
 *74HC595输出锁存 使能 
**/
void HC595_CS(void) 
{
	/**  步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器  **/
	HC595_STCP_Low();   // 将STCP拉低
	delay(1);           // 适当延时
	HC595_STCP_High();  // 再将STCP拉高,STCP即可产生一个上升沿
	delay(1);
}
 
/**
 *发送多个字节
 *便于级联时数据的发送
 *级联N级,就需要发送N个字节控制HC595
***/
void HC595_Send_Multi_Byte(u8 *data, u16 len)
{
	u8 i;
	for (i = 0; i < len; i ++ ) // len 个字节
	{
		HC595_Send_Byte(data[i]);
	}
	
	HC595_CS(); //先把所有字节发送完,再使能输出
}
 
void delay(uint16_t t)
{
	for (; t != 0; t --);

}

关于HC595_Send_Multi_Byte函数的使用要根据实际的硬件情况来,以下为一个例子,可以参考一下:

 

程序中的相关数据:


u8 Led_Buf[2] = {0xff, 0xff}; //存储要发送的指令字节,也就是灯的状态	 Led_Buf[0]控制灯6-10;Led_Buf[1]控制灯1-5
u8 Led_All_Off[2] = {0xff, 0xff}; //LED灯全灭
u8 Led_All_On[2] = {0x00, 0x00}; //LED灯全亮


HC595_Send_Multi_Byte(Led_All_On,2);//10路灯全开
HC595_Send_Multi_Byte(Led_All_Off,2);//10路灯全关

实现流水灯效果:

/******************************************************    
 *流水灯程序
*******************************************************/
void LED_ShowOneToOne(void)	
{
		u8 pos; // led位置	
		u8 Led_Show[2] = {0xff, 0xff}; //存储要发送的指令字节,		Led_Show[0]控制灯6-10;		Led_Show[1]控制灯1-5
			//第X个led亮	:1     2    3      4    5    	
		u8 Waterfall_Led[20] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef,  //控制第一级74HC595
					0xff, 0xff, 0xff, 0xff, 0xff,  
			//第X个led亮	:6     7    8      9    10  	
					0xff, 0xff, 0xff, 0xff, 0xff,  //控制第二级74HC595
					0xfe, 0xfd, 0xfb, 0xf7, 0xef };
		for (pos = 0; pos < 10; pos ++) 				//第pos个灯,实现流水灯效果
		{					
			Led_Show[1] = Waterfall_Led[pos];			//存放第一级74HC595数据,因为先进先出,所以第一级放在Led_Pos_Buf[1],而不是Led_Pos_Buf[0]
			Led_Show[0] = Waterfall_Led[pos+10]; 	//存放第二级74HC595的数据					
			HC595_Send_Multi_Byte(Led_Show,2);		//将当前数据发送到595	 
			delay_ms(500);		
		}	
}

 

### 回答1: Microsoft Visual C++ 2010 SP1 Redistributable Package x64是Microsoft公司开发的一个软件包,它包含了用于运行使用Microsoft Visual C++ 2010所开发的应用程序所需的运行时组件。这个运行时库是针对x64位系统的。 如果你安装了使用Microsoft Visual C++ 2010所开发的程序,那么你的计算机必须安装Microsoft Visual C++ 2010 SP1 Redistributable Package x64。 通常,这个软件包被认为是高度重要的,因为没有它,你将无法运行使用Microsoft Visual C++ 2010所开发的应用程序。 因为这个软件包是针对x64位系统开发的,所以它只能安装在使用64位操作系统的计算机上。如果你使用的是32位操作系统,则需要安装Microsoft Visual C++ 2010 SP1 Redistributable Package x86。 总之,Microsoft Visual C++ 2010 SP1 Redistributable Package x64是一个必需软件包,它为使用Microsoft Visual C++ 2010所开发的应用程序提供了必要的运行时组件,如果没有它,这些应用程序将无法正常运行。 ### 回答2: Microsoft Visual C++ 2010 SP1 Redistributable Package x64是一种软件程序包,它包含了在运行C++编写的应用程序时所需的Microsoft Visual C++库文件。这些库文件是由Microsoft Visual Studio 2010 SP1生成的,能够对32位和64位Windows操作系统提供支持。 这个软件包的安装非常简单,只需要运行安装程序,就可以向计算机系统中安装包含Visual C++库的必要组件。这些库是用于连接应用程序和操作系统的重要元素,它们可提供应用程序所需的功能,提高应用程序的稳定性和性能。同时,这个软件包可以防止一些C++程序崩溃或无法正常工作的问题,这是由于计算机系统缺少必要的库文件所导致的。 总体来说,Microsoft Visual C++ 2010 SP1 Redistributable Package x64是一个非常有用的工具,它可以帮助开发人员和常规用户在计算机系统上安装所需的必要组件,以确保软件正常工作。无论是对于开发人员还是对于最终用户,这个软件包都具有重要的意义。 ### 回答3: Microsoft Visual C++ 2010 SP1可再发行软件包x64是一个由Microsoft公司推出的重要软件包,它能够让用户在64位系统上运行和开发使用C++语言编写的应用程序。该软件包包含了Visual C++库的运行组件,这些组件是开发人员写C++程序所必须的基本工具。 这个软件包的推出是为了方便用户在64位Windows系统上运行或开发使用Visual C++ 2010 SP1编写的程序,同时还能够在开发过程中节省时间和精力,避免遗漏所必须的组件,从而对软件开发产生积极的影响。 红istributable是指独立版的支持库文件,它可以让用户在没有Visual Studio的情况下,在第三方应用程序中运行程序所需的组件。这个x64可再发行软件包提供了一个方便、快捷的方式,让用户在64位系统上使用和开发使用Visual C++ 2010 SP1编写的程序。无论是普通的用户还是程序开发人员,都可以受益于这个软件包的推出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiquhui666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值