生活随笔
收集整理的這篇文章主要介紹了
74HC595驱动程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章原始地址:http://feotech.com/?p=44
一. 74HC595芯片介紹
74HC595是串口轉并口芯片,可輸出三種狀態:高電平、低電平和高組態。
一片74HC595芯片可實現3根口線擴展為8根口線.也可采用多片74HC595進行級聯的方式擴展輸出口線。
Q0~Q7: 并行數據數據輸出端;
GND: 接地引腳;
Q7S: 串行數據輸出(多芯片級聯時使用);
MR: 復位引腳,當引腳接低電平時芯片內部數據存儲寄存器數據清零復位.如不使用一般接高電平;
SHCP: 移位寄存器的時鐘輸入,當接收到上升沿時移位寄存器內部數據整體后移;
STCP: 數據存儲寄存器時鐘輸入,當檢測到上升沿時使能數據存儲寄存器,將芯片接收到的數據輸出到Q0~Q7 ,Q7S引腳.可以將其理解為鎖存信號,當數據發送給芯片完成后對該引腳發送上升沿;
OE: 輸出使能引腳,為高電平時芯片輸出引腳為高組態,當為低電平時芯片輸出引腳為高(低)電平.該引腳可用于同時控制并行輸出引腳的電平,如控制LED閃爍等.當不使用該功能時通常接低電平;
DS: 串行數據輸入端
VCC: 電源引腳
從功能框圖中可以看出74HC595含有一個移位寄存器,一個存儲寄存器和一個三態輸出控制器。
在使用74HC595設計電路時應注意不同廠家生產的芯片對時鐘最高頻率和高電平保持時間范圍都有不同要求.應查看對應廠家的芯片Data Sheet.本例程中使用的是Nexperia (NXP)所生產的74HCT595。
二. 74HC595硬件設計與74HC595驅動程序
1.單芯片工作模式
/********************************************************************************* @file LED.c* @author Ryan Zhao* @version V1.0.0* @date 2017-05-03* @brief 用于通過驅動芯片74HC595來控制LED.******************************************************************************* @attention* 注意CPU引腳的頻率應在74HC595正常工作所允許的范圍.******************************************************************************
**/
/**
* @brief 74HC595 的引腳初始化.
* @param None.
* @retval None.
*/
void LED595Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//如果74HC595的驅動引腳為JTAG,則將JTAG引腳禁用并配置為通用GPIO引腳.//如果驅動引腳為通用GPIO則需要注釋掉以下內容GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG功能,保留SWDGPIO_InitStructure.GPIO_Pin = LED595_DATA_PIN | LED595_LATCH_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,LED595_DATA_PIN | LED595_LATCH_PIN);//Data PinGPIO_InitStructure.GPIO_Pin = LED595_DATA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_DATA_PORT, &GPIO_InitStructure); //Clk PinGPIO_InitStructure.GPIO_Pin = LED595_CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_CLK_PORT, &GPIO_InitStructure); //Latch PinGPIO_InitStructure.GPIO_Pin = LED595_LATCH_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_LATCH_PORT, &GPIO_InitStructure);
}
/*** @brief 將輸入的數據輸出到74HC595的引腳.* @param Input 1 byte data.* @retval None.
**/
void LED595SendData(unsigned char OutData)
{unsigned char i; //發送數據時做循環使用臨時變量for(i=0; i<8; i++) //將8位數據按位發送,先發送高字節后發送低字節{LED595_CLK_RESET;//時鐘線低電平if( (OutData & 0x8000) == 0x8000)//判斷數據高低位{LED595_DATA_SET; //數據線高電平}else{LED595_DATA_RESET; //數據線低電平}OutData = OutData << 1; //數據左移1位LED595_CLK_SET; //時鐘線高電平}//上升沿輸出數據LED595_LATCH_RESET; LED595_LATCH_SET;
}
/********************************************************************************* @file LED595.h* @author Ryan Zhao* @version V1.0.0* @date 2017-05-03* @brief 用于通過驅動芯片74HC595來控制LED.******************************************************************************* @attention* 注意CPU引腳的切換速度應在74HC595正常工作所允許的范圍.******************************************************************************
**/
//74HC595口線定義宏定義.當驅動74HC595引腳改變時,只需更改底層引腳宏定義即可
#define LED595_DATA_PORT GPIOB
#define LED595_DATA_PIN GPIO_Pin_3
#define LED595_CLK_PORT GPIOB
#define LED595_CLK_PIN GPIO_Pin_5
#define LED595_LATCH_PORT GPIOB
#define LED595_LATCH_PIN GPIO_Pin_4
//74HC595口線高低電平宏定義
#define LED595_DATA_SET GPIO_SetBits(LED595A_DATA_PORT,LED595A_DATA_PIN)
#define LED595_DATA_RESET GPIO_ResetBits(LED595A_DATA_PORT,LED595A_DATA_PIN)
#define LED595_CLK_SET GPIO_SetBits(LED595A_CLK_PORT,LED595A_CLK_PIN)
#define LED595_CLK_RESET GPIO_ResetBits(LED595A_CLK_PORT,LED595A_CLK_PIN)
#define LED595_LATCH_SET GPIO_SetBits(LED595A_LATCH_PORT,LED595A_LATCH_PIN)
#define LED595_LATCH_RESET GPIO_ResetBits(LED595A_LATCH_PORT,LED595A_LATCH_PIN)
函數使用
LED595SendData(0xFF); //74HC595輸出端全部為高電平,LED全部熄滅
LED595SendData(0x00); //74HC595輸出端全部為低電平,LED全部點亮
2.級聯工作模式
/********************************************************************************* @file LED.c* @author Ryan Zhao* @version V1.1.0* @date 2017-06-05* @brief 用于通過驅動芯片74HC595來控制LED.******************************************************************************* @attention** 注意CPU引腳的切換速度應在74HC595正常工作所允許的范圍.*******************************************************************************
**/
/**
* @brief 74HC595 的引腳初始化.
* @param None.
* @retval None.
*/
void LED595Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//Data PinGPIO_InitStructure.GPIO_Pin = LED595_DATA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_DATA_PORT, &GPIO_InitStructure);//Clk PinGPIO_InitStructure.GPIO_Pin = LED595_CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_CLK_PORT, &GPIO_InitStructure);//Latch PinGPIO_InitStructure.GPIO_Pin = LED595_LATCH_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED595_LATCH_PORT, &GPIO_InitStructure);
}/*** @brief LED顯示函數.* @param 要顯示的數據.* @retval None.
**/
void LED595SendData(unsigned int OutData)
{unsigned char i; //發送數據時做循環使用臨時變量for (i = 0; i < 16; i++) //將16位數據按位發送{LED595_CLK_RESET; //時鐘線低電平if ((OutData & 0x8000) == 0x8000) //判斷數據高低位{LED595_DATA_SET; //發送數據高位}else{LED595_DATA_RESET; //發送數據低位}OutData = OutData << 1; //數據左移1位LED595_CLK_SET; //時鐘線高電平}//上升沿輸出數據LED595_LATCH_RESET;LED595_LATCH_SET;
}
/********************************************************************************* @file LED595.h* @author Ryan Zhao* @version V1.1.0* @date 2017-05-03* @brief 用于通過驅動芯片74HC595來控制LED.******************************************************************************* @attention** 注意CPU引腳的切換速度應在74HC595正常工作所允許的范圍.*******************************************************************************
**//**********************物理層定義******************************/
//74HC595口線定義宏定義.當驅動74HC595引腳改變時,只需更改底層引腳宏定義即可
#define LED595_DATA_PORT GPIOC
#define LED595_DATA_PIN GPIO_Pin_5
#define LED595_CLK_PORT GPIOB
#define LED595_CLK_PIN GPIO_Pin_0
#define LED595_LATCH_PORT GPIOB
#define LED595_LATCH_PIN GPIO_Pin_1//74HC595口線高低電平宏定義
#define LED595_DATA_SET GPIO_SetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define LED595_DATA_RESET GPIO_ResetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define LED595_CLK_SET GPIO_SetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define LED595_CLK_RESET GPIO_ResetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define LED595_LATCH_SET GPIO_SetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
#define LED595_LATCH_RESET GPIO_ResetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
#define LED595_DATA_PORT GPIOC
#define LED595_DATA_PIN GPIO_Pin_5
#define LED595_CLK_PORT GPIOB
#define LED595_CLK_PIN GPIO_Pin_0
#define LED595_LATCH_PORT GPIOB
#define LED595_LATCH_PIN GPIO_Pin_1//74HC595口線高低電平宏定義
#define LED595_DATA_SET GPIO_SetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define LED595_DATA_RESET GPIO_ResetBits(LED595_DATA_PORT,LED595_DATA_PIN)
#define LED595_CLK_SET GPIO_SetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define LED595_CLK_RESET GPIO_ResetBits(LED595_CLK_PORT,LED595_CLK_PIN)
#define LED595_LATCH_SET GPIO_SetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
#define LED595_LATCH_RESET GPIO_ResetBits(LED595_LATCH_PORT,LED595_LATCH_PIN)
函數使用
LED595SendData(0xFFFF); //74HC595輸出端全部為高電平,LED全部熄滅
LED595SendData(0x0000);//74HC595輸出端全部為低電平,LED全部點亮
總結
以上是生活随笔為你收集整理的74HC595驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。