

1.sn74hc595.h
c
#ifndef __SN74HC595_H
#define __SN74HC595_H
#include "main.h" // N32 GPIO 头文件
//SER =PA3 =Output
//RCLX =PA1 =Output
//SRCLX=PA5 =Output
#define HC595_SER_PORT GPIOA
#define HC595_SER_PIN GPIO_PIN_3 // PA3
#define HC595_RCLK_PORT GPIOA
#define HC595_RCLK_PIN GPIO_PIN_1 // PA1
#define HC595_SRCLK_PORT GPIOA
#define HC595_SRCLK_PIN GPIO_PIN_5 // PA5
/* 电平操作宏 - 使用 N32 标准库 API */
#define SER_HIGH() GPIO_SetBits(HC595_SER_PORT, HC595_SER_PIN)
#define SER_LOW() GPIO_ResetBits(HC595_SER_PORT, HC595_SER_PIN)
#define RCLK_HIGH() GPIO_SetBits(HC595_RCLK_PORT, HC595_RCLK_PIN)
#define RCLK_LOW() GPIO_ResetBits(HC595_RCLK_PORT, HC595_RCLK_PIN)
#define SRCLK_HIGH() GPIO_SetBits(HC595_SRCLK_PORT, HC595_SRCLK_PIN)
#define SRCLK_LOW() GPIO_ResetBits(HC595_SRCLK_PORT, HC595_SRCLK_PIN)
void HC595_Init(void);
void HC595_Delay(void);
void HC595_SendData(uint16_t data);
void HC595_SetLed(uint8_t ledNo, uint8_t value);
extern uint16_t g_ulTowerData;
#endif
2.sn74hc595.c
c
#include "sn74hc595.h"
#include "delay.h"
uint16_t g_ulTowerData = 0x0000;
#define HC595_DELAY_US 1
/**
* @brief 发送 16 位数据到 595
*/
void HC595_SendData(uint16_t data)
{
uint8_t i;
// 起始保护
RCLK_LOW();
systick_delay_us(HC595_DELAY_US);
SRCLK_LOW();
systick_delay_us(HC595_DELAY_US);
// 逐位发送(MSB First)
for(i = 0; i < 16; i++)
{
// 设置 SER 数据
if(data & 0x8000) SER_HIGH();
else SER_LOW();
data <<= 1;
systick_delay_us(HC595_DELAY_US);
// SRCLK 上升沿
SRCLK_HIGH();
systick_delay_us(HC595_DELAY_US);
SRCLK_LOW();
systick_delay_us(HC595_DELAY_US);
}
// RCLK 上升沿锁存
RCLK_HIGH();
systick_delay_us(HC595_DELAY_US);
RCLK_LOW();
systick_delay_us(HC595_DELAY_US);
}
/**
* @brief 设置指定 输出 状态 0~7
*/
void HC595_SetLed(uint8_t ledNo, uint8_t value)
{
if(ledNo >= 8) return;
if(value == 0)
g_ulTowerData &= ~(0x0001 << (ledNo));
else
g_ulTowerData |= (0x0001 << (ledNo));
HC595_SendData(g_ulTowerData);
}
/**
* @brief 直接设置16位数据(如果扩展到了2个74HC595)
*/
void HC595_SetData(uint16_t data)
{
g_ulTowerData = data;
HC595_SendData(data);
}
/**
* @brief 获取当前输出状态
* @return 当前16位输出状态
*/
uint16_t HC595_GetData(void)
{
return g_ulTowerData;
}
生成的代码:
c
GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
/* Enable the GPIO clock*/
RCC_EnableAHB1PeriphClk(RCC_AHB_PERIPHEN_GPIOA, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO,ENABLE);
GPIO_ResetBits(GPIOA,GPIO_PIN_5);
GPIO_SetBits(GPIOA, GPIO_PIN_3 | GPIO_PIN_1);
GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL;
GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW;
GPIO_InitStructure.GPIO_Current = GPIO_DS_2mA;
GPIO_InitStructure.GPIO_Alternate = GPIO_NO_AF;
GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_1;
GPIO_InitPeripheral(GPIOA,&GPIO_InitStructure);