原理图如下
代码如下"xl74hc595.c"
#include "xl74hc595.h"
#include "gpio.h"
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os.h"
void HC595_CS(void)
{
/** 步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
HC595_STCP_Low(); // 将STCP拉低
osDelay(1); // 适当延时
HC595_STCP_High(); // 再将STCP拉高,STCP即可产生一个上升沿
osDelay(1);
}
void HC595_SendByte(uint8_t byte)
{
uint8_t 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拉低
osDelay(1); // 适当延时
HC595_SHCP_High(); // SHCP拉高, SHCP产生上升沿
osDelay(1);
byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
}
}
void XL74HC595_MultiWrite(uint8_t *data, uint8_t Length)//混合写数据
{
uint8_t i;
for (i = 0; i < Length; i ++ ) // len 个字节
{
HC595_SendByte(data[i]);
}
HC595_CS(); //先把所有字节发送完,再使能输出
}
"xl74hc595.h" 代码如下
#ifndef XL74HC595_H
#define XL74HC595_H
#include "main.h"
#include "gpio.h"
#define HC595_SHCP_Low() HAL_GPIO_WritePin(HC595_SCK_GPIO_Port,HC595_SCK_Pin,0)
#define HC595_SHCP_High() HAL_GPIO_WritePin(HC595_SCK_GPIO_Port,HC595_SCK_Pin,1)
#define HC595_STCP_Low() HAL_GPIO_WritePin(HC595_RCK_GPIO_Port,HC595_RCK_Pin,0)
#define HC595_STCP_High() HAL_GPIO_WritePin(HC595_RCK_GPIO_Port,HC595_RCK_Pin,1)
#define HC595_Data_Low() HAL_GPIO_WritePin(HC595_SI_GPIO_Port,HC595_SI_Pin,0)
#define HC595_Data_High() HAL_GPIO_WritePin(HC595_SI_GPIO_Port,HC595_SI_Pin,1)
extern XL74HC595 hc595Data;
void HC595_SendByte(uint8_t byte);
void XL74HC595_MultiWrite(uint8_t *data, uint8_t Length);//混合写数据;
#endif
GPIO初始化
具体IO口根据实际需求进行修改
支持任意长度的的595芯片级联文章来源:https://www.toymoban.com/news/detail-735025.html
文章来源地址https://www.toymoban.com/news/detail-735025.html
到了这里,关于stm32 74hc595级联编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!