自己做了一塊74HC595的IO擴(kuò)展板卡,出于靈活考慮,沒(méi)有都采用級(jí)聯(lián)的方式,而是2組多芯片級(jí)聯(lián)的結(jié)構(gòu)。基于STM32平臺(tái)設(shè)計(jì)。
結(jié)構(gòu)示意圖
74HV595內(nèi)部結(jié)構(gòu)圖
頭文件:
#ifndef __74HC595_H__
#define __74HC595_H__
#include "main.h"
typedef struct{
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin;
}strHC595_Port;
//非級(jí)聯(lián)74HC595芯片組數(shù)
#define HC595_GROUP_NUMBER 2
/* 第一組芯片 */
//使能
#define HC595_OE1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_OE1_GPIO GPIOA
#define HC595_OE1_PIN GPIO_PIN_4
//鎖存
#define HC595_RCLK1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_RCLK1_GPIO GPIOA
#define HC595_RCLK1_PIN GPIO_PIN_6
//時(shí)鐘
#define HC595_SRCLK1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_SRCLK1_GPIO GPIOA
#define HC595_SRCLK1_PIN GPIO_PIN_7
//清除
#define HC595_SRCLR1_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_SRCLR1_GPIO GPIOA
#define HC595_SRCLR1_PIN GPIO_PIN_5
//數(shù)據(jù)
#define HC595_DATA1_RCC_GPIOX_EN __HAL_RCC_GPIOC_CLK_ENABLE()
#define HC595_DATA1_GPIO GPIOC
#define HC595_DATA1_PIN GPIO_PIN_4
/* 第二組芯片 */
//使能
#define HC595_OE2_RCC_GPIOX_EN __HAL_RCC_GPIOA_CLK_ENABLE()
#define HC595_OE2_GPIO GPIOB
#define HC595_OE2_PIN GPIO_PIN_3
//鎖存
#define HC595_RCLK2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_RCLK2_GPIO GPIOB
#define HC595_RCLK2_PIN GPIO_PIN_5
//時(shí)鐘
#define HC595_SRCLK2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_SRCLK2_GPIO GPIOB
#define HC595_SRCLK2_PIN GPIO_PIN_6
//清除
#define HC595_SRCLR2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_SRCLR2_GPIO GPIOB
#define HC595_SRCLR2_PIN GPIO_PIN_4
//數(shù)據(jù)
#define HC595_DATA2_RCC_GPIOX_EN __HAL_RCC_GPIOB_CLK_ENABLE()
#define HC595_DATA2_GPIO GPIOB
#define HC595_DATA2_PIN GPIO_PIN_7
extern void HC595_Init(void);
extern uint8_t HC595_write(uint8_t group,uint8_t nbit,uint32_t datas);
#endif /*__74HC595_H__*/
源文件:
#include "74HC595.h"
strHC595_Port HC595_OE_Port[HC595_GROUP_NUMBER]=
{
{HC595_OE1_GPIO,HC595_OE1_PIN},
{HC595_OE2_GPIO,HC595_OE2_PIN},
//元素個(gè)數(shù)與HC595_GROUP_NUMBER對(duì)應(yīng)
};
strHC595_Port HC595_RCLK_Port[HC595_GROUP_NUMBER]=
{
{HC595_RCLK1_GPIO,HC595_RCLK1_PIN},
{HC595_RCLK2_GPIO,HC595_RCLK2_PIN},
//元素個(gè)數(shù)與HC595_GROUP_NUMBER對(duì)應(yīng)
};
strHC595_Port HC595_SRCLK_Port[HC595_GROUP_NUMBER]=
{
{HC595_SRCLK1_GPIO,HC595_SRCLK1_PIN},
{HC595_SRCLK2_GPIO,HC595_SRCLK2_PIN},
//元素個(gè)數(shù)與HC595_GROUP_NUMBER對(duì)應(yīng)
};
strHC595_Port HC595_SRCLR_Port[HC595_GROUP_NUMBER]=
{
{HC595_SRCLR1_GPIO,HC595_SRCLR1_PIN},
{HC595_SRCLR2_GPIO,HC595_SRCLR2_PIN},
//元素個(gè)數(shù)與HC595_GROUP_NUMBER對(duì)應(yīng)
};
strHC595_Port HC595_DATA_Port[HC595_GROUP_NUMBER]=
{
{HC595_DATA1_GPIO,HC595_DATA1_PIN},
{HC595_DATA2_GPIO,HC595_DATA2_PIN},
//元素個(gè)數(shù)與HC595_GROUP_NUMBER對(duì)應(yīng)
};
//操作接口宏定義
#define HC595_OE_PIN(X) HC595_OE_Port[X].GPIO_Pin
#define HC595_OE_GPIO(X) HC595_OE_Port[X].GPIOx
#define HC595_OE_H(X) HAL_GPIO_WritePin(HC595_OE_GPIO(X), HC595_OE_PIN(X), GPIO_PIN_SET)
#define HC595_OE_L(X) HAL_GPIO_WritePin(HC595_OE_GPIO(X), HC595_OE_PIN(X), GPIO_PIN_RESET)
#define HC595_RCLK_PIN(X) HC595_RCLK_Port[X].GPIO_Pin
#define HC595_RCLK_GPIO(X) HC595_RCLK_Port[X].GPIOx
#define HC595_RCLK_H(X) HAL_GPIO_WritePin(HC595_RCLK_GPIO(X), HC595_RCLK_PIN(X), GPIO_PIN_SET)
#define HC595_RCLK_L(X) HAL_GPIO_WritePin(HC595_RCLK_GPIO(X), HC595_RCLK_PIN(X), GPIO_PIN_RESET)
#define HC595_SRCLK_PIN(X) HC595_SRCLK_Port[X].GPIO_Pin
#define HC595_SRCLK_GPIO(X) HC595_SRCLK_Port[X].GPIOx
#define HC595_SRCLK_H(X) HAL_GPIO_WritePin(HC595_SRCLK_GPIO(X), HC595_SRCLK_PIN(X), GPIO_PIN_SET)
#define HC595_SRCLK_L(X) HAL_GPIO_WritePin(HC595_SRCLK_GPIO(X), HC595_SRCLK_PIN(X), GPIO_PIN_RESET)
#define HC595_SRCLR_PIN(X) HC595_SRCLR_Port[X].GPIO_Pin
#define HC595_SRCLR_GPIO(X) HC595_SRCLR_Port[X].GPIOx
#define HC595_SRCLR_H(X) HAL_GPIO_WritePin(HC595_SRCLR_GPIO(X), HC595_SRCLR_PIN(X), GPIO_PIN_SET)
#define HC595_SRCLR_L(X) HAL_GPIO_WritePin(HC595_SRCLR_GPIO(X), HC595_SRCLR_PIN(X), GPIO_PIN_RESET)
#define HC595_DATA_PIN(X) HC595_DATA_Port[X].GPIO_Pin
#define HC595_DATA_GPIO(X) HC595_DATA_Port[X].GPIOx
#define HC595_DATA_H(X) HAL_GPIO_WritePin(HC595_DATA_GPIO(X), HC595_DATA_PIN(X), GPIO_PIN_SET)
#define HC595_DATA_L(X) HAL_GPIO_WritePin(HC595_DATA_GPIO(X), HC595_DATA_PIN(X), GPIO_PIN_RESET)
void HC595_delay_us(uint8_t t_us)
{
//修改為系統(tǒng)中對(duì)應(yīng)的微秒級(jí)延時(shí)函數(shù),根據(jù)實(shí)際需求可以換成更小的ns級(jí)延時(shí)
delay_us(t_us);
}
/*
*描述:初始化HC595_GROUP_NUMBER組芯片對(duì)應(yīng)的控制引腳
*/
void HC595_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
uint8_t i = 0;
/* GPIO Ports Clock Enable */
//第一組芯片引腳時(shí)鐘
HC595_OE1_RCC_GPIOX_EN;
HC595_RCLK1_RCC_GPIOX_EN;
HC595_SRCLK1_RCC_GPIOX_EN;
HC595_SRCLR1_RCC_GPIOX_EN;
HC595_DATA1_RCC_GPIOX_EN;
//第二組芯片引腳時(shí)鐘
HC595_OE2_RCC_GPIOX_EN;
HC595_RCLK2_RCC_GPIOX_EN;
HC595_SRCLK2_RCC_GPIOX_EN;
HC595_SRCLR2_RCC_GPIOX_EN;
HC595_DATA2_RCC_GPIOX_EN;
/*Configure GPIO pin */
for(i=0; i
-
STM32
+關(guān)注
關(guān)注
2289文章
11006瀏覽量
362128 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1878瀏覽量
132807 -
GPIO
+關(guān)注
關(guān)注
16文章
1267瀏覽量
53505 -
74HC595
+關(guān)注
關(guān)注
7文章
193瀏覽量
31443 -
擴(kuò)展板卡
+關(guān)注
關(guān)注
0文章
2瀏覽量
1249
發(fā)布評(píng)論請(qǐng)先 登錄
74HC595(串入并出)基本原理和使用例程
74HC595芯片的作用是什么
使用74HC595芯片真的能節(jié)省STM32的IO口嗎
單片機(jī)IO直連控制74HC595
74HC595怎么使用
如何實(shí)現(xiàn)74HC595驅(qū)動(dòng)數(shù)碼管顯示
74HC595多組芯片多組級(jí)聯(lián)代碼分享
MCU驅(qū)動(dòng)74hc595的方法
基于單片機(jī)的74HC595驅(qū)動(dòng)靜態(tài)數(shù)碼管(IO端口輸出擴(kuò)展)【匯編】
基于單片機(jī)的74HC595驅(qū)動(dòng)靜態(tài)數(shù)碼管(IO端口輸出擴(kuò)展)【C語(yǔ)言】
基于單片機(jī)的74HC595驅(qū)動(dòng)靜態(tài)數(shù)碼管(IO端口輸出擴(kuò)展)
IO口擴(kuò)展芯片74HC165和74HC595的使用實(shí)例代碼免費(fèi)下載

74HC595多組芯片多組級(jí)聯(lián)代碼

MCU驅(qū)動(dòng)74hc595

評(píng)論