STM32+74HC595:帶領你10分鐘用對74HC595芯片
使用的是STM32CBT8,小模塊用起來性價比超級高,資源豐富,移植u/COS及HTTP、MQTT協議等等用起來簡直欲罷不能,搖搖欲仙!
BUT:IO口資源太少了,我想讓你驅動100個LED,你缺告訴我,我的要求太多,你滿足不了......
還好,找到了74HC595,但是網上很多資源講的我看了半天才總結、提煉并另辟蹊徑出來精髓
==========================================================
595具體使用的步驟:
第1步:目的:將要準備輸入的位數據移入74HC595數據輸入端上。
方法:送位數據到_595。
第2步:目的:將位數據逐位移入74HC595,即數據串入
方法:SH_CP__(S_CLK)產生一上升沿,將DS上的數據移入74HC595移位寄存器中,先送低位,后送高位。
第3步:目的:并行輸出數據。即數據并出
方法:ST_CP__(R_CLK)產生一上升沿,將由DS上已移入數據寄存器中的數據
送入到輸出鎖存器。
說明: 從上可分析:從SH_CP產生一上升沿(移入數據)和ST_CP產生一上升沿(輸出數據)是二個獨立過程,實際應用時互不干擾。即可輸出數據的 同時移入數據。
=============================================================
理論掌握那點其實已經夠了呢,不過我貼出代碼,更容易明白
/*--ZQP的74HC595的初始化*/
void HC595_Init()
{
GPIO_InitTypeDef GPIO_InitS;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitS.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitS.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitS.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(HC595_PORT, &GPIO_InitS);
GPIO_SetBits(HC595_PORT,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
}
void HC595SendData(unsigned int SendVal)
{
uint8_t i;
for (i=0; i<16; i++)
{
/*--step1、串行輸入引腳,所謂串行就是使數據在一根信號線上按順序一位一位地傳輸*/
if (((SendVal << i) & 0x8000) != 0 )
MOSIO_Pin14_DS_OUT=1;
else
MOSIO_Pin14_DS_OUT=0;
/*--step2、SHCP發(fā)生一次上升沿的時候,74HC595才會從DS引腳上取得當前的數據*/
S_CLK_Pin11_SHCP_OUT=0;
delay_us(100);
S_CLK_Pin11_SHCP_OUT=1;
}
/*--step3、當移位寄存器的8位數據全部傳輸完畢后,制造一次鎖存器時鐘引腳的上升沿(先拉低電平再拉高電平)*/
R_CLK_Pin12_STCP_OUT=0;
delay_us(100);
R_CLK_Pin12_STCP_OUT=1;
}
/////main函數
unsigned char tab[]={0xFF,0XFE};
unsigned int Val;
/*--Z QP的74HC595*/
Val=tab[1]&0x00ff; //--保存tab[1],并將將tab[1]放置在高8位
Val<<=8;
Val=Val+tab[0]; //--保存tab[0]放置在低8位
HC595SendData(Val);
如果你使用2個74HC595,兩個的級聯:<1的9引腳:_Q7S>連接<2的14引腳:_DS>;一切搞定!
實物連接的初期大概就是這樣子,還是很開心的