原理圖如下
?代碼如下"xl74hc595.c"
#include "xl74hc595.h"
#include "gpio.h"
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os.h"
void HC595_CS(void)
{
/** 步驟3:STCP產(chǎn)生一個上升沿,移位寄存器的數(shù)據(jù)移入存儲寄存器 **/
HC595_STCP_Low(); // 將STCP拉低
osDelay(1); // 適當(dāng)延時
HC595_STCP_High(); // 再將STCP拉高,STCP即可產(chǎn)生一個上升沿
osDelay(1);
}
void HC595_SendByte(uint8_t byte)
{
uint8_t i;
for (i = 0; i < 8; i ++) //一個字節(jié)8位,傳輸8次,一次一位,循環(huán)8次,剛好移完8位
{
/**** 步驟1:將數(shù)據(jù)傳到DS引腳 ****/
if (byte & 0x80) //先傳輸高位,通過與運算判斷第八是否為1
HC595_Data_High(); //如果第八位是1,則與 595 DS連接的引腳輸出高電平
else //否則輸出低電平
HC595_Data_Low();
/*** 步驟2:SHCP每產(chǎn)生一個上升沿,當(dāng)前的bit就被送入移位寄存器 ***/
HC595_SHCP_Low(); // SHCP拉低
osDelay(1); // 適當(dāng)延時
HC595_SHCP_High(); // SHCP拉高, SHCP產(chǎn)生上升沿
osDelay(1);
byte <<= 1; // 左移一位,將低位往高位移,通過 if (byte & 0x80)判斷低位是否為1
}
}
void XL74HC595_MultiWrite(uint8_t *data, uint8_t Length)//混合寫數(shù)據(jù)
{
uint8_t i;
for (i = 0; i < Length; i ++ ) // len 個字節(jié)
{
HC595_SendByte(data[i]);
}
HC595_CS(); //先把所有字節(jié)發(fā)送完,再使能輸出
}
"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);//混合寫數(shù)據(jù);
#endif
GPIO初始化
具體IO口根據(jù)實際需求進行修改
支持任意長度的的595芯片級聯(lián)文章來源:http://www.zghlxwxcb.cn/news/detail-735025.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-735025.html
到了這里,關(guān)于stm32 74hc595級聯(lián)編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!