生活随笔
收集整理的這篇文章主要介紹了
74HC595驱动程序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章原始地址:http://feotech.com/?p=44
一. 74HC595芯片介紹
74HC595是串口轉(zhuǎn)并口芯片,可輸出三種狀態(tài):高電平、低電平和高組態(tài)。
一片74HC595芯片可實現(xiàn)3根口線擴展為8根口線.也可采用多片74HC595進(jìn)行級聯(lián)的方式擴展輸出口線。
Q0~Q7: 并行數(shù)據(jù)數(shù)據(jù)輸出端;
GND: 接地引腳;
Q7S: 串行數(shù)據(jù)輸出(多芯片級聯(lián)時使用);
MR: 復(fù)位引腳,當(dāng)引腳接低電平時芯片內(nèi)部數(shù)據(jù)存儲寄存器數(shù)據(jù)清零復(fù)位.如不使用一般接高電平;
SHCP: 移位寄存器的時鐘輸入,當(dāng)接收到上升沿時移位寄存器內(nèi)部數(shù)據(jù)整體后移;
STCP: 數(shù)據(jù)存儲寄存器時鐘輸入,當(dāng)檢測到上升沿時使能數(shù)據(jù)存儲寄存器,將芯片接收到的數(shù)據(jù)輸出到Q0~Q7 ,Q7S引腳.可以將其理解為鎖存信號,當(dāng)數(shù)據(jù)發(fā)送給芯片完成后對該引腳發(fā)送上升沿;
OE: 輸出使能引腳,為高電平時芯片輸出引腳為高組態(tài),當(dāng)為低電平時芯片輸出引腳為高(低)電平.該引腳可用于同時控制并行輸出引腳的電平,如控制LED閃爍等.當(dāng)不使用該功能時通常接低電平;
DS: 串行數(shù)據(jù)輸入端
VCC: 電源引腳
從功能框圖中可以看出74HC595含有一個移位寄存器,一個存儲寄存器和一個三態(tài)輸出控制器。
在使用74HC595設(shè)計電路時應(yīng)注意不同廠家生產(chǎn)的芯片對時鐘最高頻率和高電平保持時間范圍都有不同要求.應(yīng)查看對應(yīng)廠家的芯片Data Sheet.本例程中使用的是Nexperia (NXP)所生產(chǎn)的74HCT595。
二. 74HC595硬件設(shè)計與74HC595驅(qū)動程序
1.單芯片工作模式
/********************************************************************************* @file LED.c* @author Ryan Zhao* @version V1.0.0* @date 2017-05-03* @brief 用于通過驅(qū)動芯片74HC595來控制LED.******************************************************************************* @attention* 注意CPU引腳的頻率應(yīng)在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的驅(qū)動引腳為JTAG,則將JTAG引腳禁用并配置為通用GPIO引腳.//如果驅(qū)動引腳為通用GPIO則需要注釋掉以下內(nèi)容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 將輸入的數(shù)據(jù)輸出到74HC595的引腳.* @param Input 1 byte data.* @retval None.
**/
void LED595SendData(unsigned char OutData)
{unsigned char i; //發(fā)送數(shù)據(jù)時做循環(huán)使用臨時變量for(i=0; i<8; i++) //將8位數(shù)據(jù)按位發(fā)送,先發(fā)送高字節(jié)后發(fā)送低字節(jié){LED595_CLK_RESET;//時鐘線低電平if( (OutData & 0x8000) == 0x8000)//判斷數(shù)據(jù)高低位{LED595_DATA_SET; //數(shù)據(jù)線高電平}else{LED595_DATA_RESET; //數(shù)據(jù)線低電平}OutData = OutData << 1; //數(shù)據(jù)左移1位LED595_CLK_SET; //時鐘線高電平}//上升沿輸出數(shù)據(jù)LED595_LATCH_RESET; LED595_LATCH_SET;
}
/********************************************************************************* @file LED595.h* @author Ryan Zhao* @version V1.0.0* @date 2017-05-03* @brief 用于通過驅(qū)動芯片74HC595來控制LED.******************************************************************************* @attention* 注意CPU引腳的切換速度應(yīng)在74HC595正常工作所允許的范圍.******************************************************************************
**/
//74HC595口線定義宏定義.當(dāng)驅(qū)動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)
函數(shù)使用
LED595SendData(0xFF); //74HC595輸出端全部為高電平,LED全部熄滅
LED595SendData(0x00); //74HC595輸出端全部為低電平,LED全部點亮
2.級聯(lián)工作模式
/********************************************************************************* @file LED.c* @author Ryan Zhao* @version V1.1.0* @date 2017-06-05* @brief 用于通過驅(qū)動芯片74HC595來控制LED.******************************************************************************* @attention** 注意CPU引腳的切換速度應(yīng)在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顯示函數(shù).* @param 要顯示的數(shù)據(jù).* @retval None.
**/
void LED595SendData(unsigned int OutData)
{unsigned char i; //發(fā)送數(shù)據(jù)時做循環(huán)使用臨時變量for (i = 0; i < 16; i++) //將16位數(shù)據(jù)按位發(fā)送{LED595_CLK_RESET; //時鐘線低電平if ((OutData & 0x8000) == 0x8000) //判斷數(shù)據(jù)高低位{LED595_DATA_SET; //發(fā)送數(shù)據(jù)高位}else{LED595_DATA_RESET; //發(fā)送數(shù)據(jù)低位}OutData = OutData << 1; //數(shù)據(jù)左移1位LED595_CLK_SET; //時鐘線高電平}//上升沿輸出數(shù)據(jù)LED595_LATCH_RESET;LED595_LATCH_SET;
}
/********************************************************************************* @file LED595.h* @author Ryan Zhao* @version V1.1.0* @date 2017-05-03* @brief 用于通過驅(qū)動芯片74HC595來控制LED.******************************************************************************* @attention** 注意CPU引腳的切換速度應(yīng)在74HC595正常工作所允許的范圍.*******************************************************************************
**//**********************物理層定義******************************/
//74HC595口線定義宏定義.當(dāng)驅(qū)動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)
函數(shù)使用
LED595SendData(0xFFFF); //74HC595輸出端全部為高電平,LED全部熄滅
LED595SendData(0x0000);//74HC595輸出端全部為低電平,LED全部點亮
總結(jié)
以上是生活随笔為你收集整理的74HC595驱动程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。