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 --);

}

 

相关文章:

  • 2021-11-26
  • 2021-11-19
  • 2022-01-14
  • 2021-07-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-10
猜你喜欢
  • 2021-11-21
  • 2022-01-12
  • 2022-01-14
  • 2022-12-23
  • 2021-11-23
  • 2021-11-08
  • 2021-11-15
相关资源
相似解决方案