以下為.h文件:
#ifndef __74HC595_H__
#define __74HC595_H__
#include "stm32f10x.h"
#define SHCP_GPIO_PORT GPIOA
#define SHCP_GPIO_CLK RCC_APB2Periph_GPIOA
#define SHCP_GPIO_PIN GPIO_Pin_1
#define STCP_GPIO_PORT GPIOA
#define STCP_GPIO_CLK RCC_APB2Periph_GPIOA
#define STCP_GPIO_PIN GPIO_Pin_0
#define DS_GPIO_PORT GPIOB
#define DS_GPIO_CLK RCC_APB2Periph_GPIOB
#define DS_GPIO_PIN GPIO_Pin_1
#define HC595_SHCP_Low() GPIO_ResetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )
#define HC595_SHCP_High() GPIO_SetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )
#define HC595_STCP_Low() GPIO_ResetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )
#define HC595_STCP_High() GPIO_SetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )
#define HC595_Data_Low() GPIO_ResetBits( DS_GPIO_PORT, DS_GPIO_PIN )
#define HC595_Data_High() GPIO_SetBits( DS_GPIO_PORT, DS_GPIO_PIN )
void HC595_GPIO_Config(void);
void HC595_Send_Byte(u8 byte);
void HC595_CS(void);
void HC595_Send_Multi_Byte(u8 *data, u16 len);
#endif
以下為.c文件:
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "74HC595.h"
void delay(uint16_t t);
/******** 74HC595 GPIO 配置 *************************/
void HC595_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( SHCP_GPIO_CLK | STCP_GPIO_CLK | DS_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = SHCP_GPIO_PIN;
GPIO_Init(SHCP_GPIO_PORT, &GPIO_InitStructure); // 初始化 SHCP 引腳
GPIO_InitStructure.GPIO_Pin = STCP_GPIO_PIN;
GPIO_Init(STCP_GPIO_PORT, &GPIO_InitStructure); // 初始化 STCP 引腳
GPIO_InitStructure.GPIO_Pin = DS_GPIO_PIN;
GPIO_Init(DS_GPIO_PORT, &GPIO_InitStructure); // 初始化 DS 引腳
GPIO_ResetBits(SHCP_GPIO_PORT, SHCP_GPIO_PIN); // 引腳初始狀態為高,便于產生上升沿
GPIO_ResetBits(STCP_GPIO_PORT, STCP_GPIO_PIN);
GPIO_ResetBits(DS_GPIO_PORT, DS_GPIO_PIN);
}
/***
*74HC595 發送一個字節
*即往74HC595的DS引腳發送一個字節
*/
void HC595_Send_Byte(u8 byte)
{
u8 i;
for (i = 0; i < 8; i ++) //一個字節8位,傳輸8次,一次一位,循環8次,剛好移完8位
{
/**** 步驟1:將數據傳到DS引腳 ****/
if (byte & 0x80) //先傳輸高位,通過與運算判斷第八是否為1
HC595_Data_High(); //如果第八位是1,則與 595 DS連接的引腳輸出高電平
else //否則輸出低電平
HC595_Data_Low();
/*** 步驟2:SHCP每產生一個上升沿,當前的bit就被送入移位寄存器 ***/
HC595_SHCP_Low(); // SHCP拉低
delay(1); // 適當延時
HC595_SHCP_High(); // SHCP拉高, SHCP產生上升沿
delay(1);
byte <<= 1; // 左移一位,將低位往高位移,通過 if (byte & 0x80)判斷低位是否為1
}
}
/**
*74HC595輸出鎖存 使能
**/
void HC595_CS(void)
{
/** 步驟3:STCP產生一個上升沿,移位寄存器的數據移入存儲寄存器 **/
HC595_STCP_Low(); // 將STCP拉低
delay(1); // 適當延時
HC595_STCP_High(); // 再將STCP拉高,STCP即可產生一個上升沿
delay(1);
}
/**
*發送多個字節
*便于級聯時數據的發送
*級聯N級,就需要發送N個字節控制HC595
***/
void HC595_Send_Multi_Byte(u8 *data, u16 len)
{
u8 i;
for (i = 0; i < len; i ++ ) // len 個字節
{
HC595_Send_Byte(data[i]);
}
HC595_CS(); //先把所有字節發送完,再使能輸出
}
void delay(uint16_t t)
{
for (; t != 0; t --);
}
關于HC595_Send_Multi_Byte函數的使用要根據實際的硬件情況來,以下為一個例子,可以參考一下:
程序中的相關數據:
u8 Led_Buf[2] = {0xff, 0xff}; //存儲要發送的指令字節,也就是燈的狀態 Led_Buf[0]控制燈6-10;Led_Buf[1]控制燈1-5
u8 Led_All_Off[2] = {0xff, 0xff}; //LED燈全滅
u8 Led_All_On[2] = {0x00, 0x00}; //LED燈全亮
HC595_Send_Multi_Byte(Led_All_On,2);//10路燈全開
HC595_Send_Multi_Byte(Led_All_Off,2);//10路燈全關
實現流水燈效果:
/******************************************************
*流水燈程序
*******************************************************/
void LED_ShowOneToOne(void)
{
u8 pos; // led位置
u8 Led_Show[2] = {0xff, 0xff}; //存儲要發送的指令字節, Led_Show[0]控制燈6-10; Led_Show[1]控制燈1-5
//第X個led亮 :1 2 3 4 5
u8 Waterfall_Led[20] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, //控制第一級74HC595
0xff, 0xff, 0xff, 0xff, 0xff,
//第X個led亮 :6 7 8 9 10
0xff, 0xff, 0xff, 0xff, 0xff, //控制第二級74HC595
0xfe, 0xfd, 0xfb, 0xf7, 0xef };
for (pos = 0; pos < 10; pos ++) //第pos個燈,實現流水燈效果
{
Led_Show[1] = Waterfall_Led[pos]; //存放第一級74HC595數據,因為先進先出,所以第一級放在Led_Pos_Buf[1],而不是Led_Pos_Buf[0]
Led_Show[0] = Waterfall_Led[pos+10]; //存放第二級74HC595的數據
HC595_Send_Multi_Byte(Led_Show,2); //將當前數據發送到595
delay_ms(500);
}
}
上一篇:STM32 TM1640芯片驅動程序
下一篇:STM32 MFRC522 IC讀卡 程序及原理圖
推薦閱讀
史海拾趣
機頂盒,全稱為數字視頻變換盒,是現代家庭娛樂中不可或缺的重要設備。從廣義上講,任何與電視機連接的網絡終端設備均可視為機頂盒,其發展歷程涵蓋了從模擬頻道增補器到數字衛星、地面及有線電視機頂盒的廣泛范疇。而從狹義角度看,機頂盒特指那些具備數字處理能力的設備,如IPTV機頂盒、DVB-S衛星機頂盒、DVB-T地面機頂盒及DVB-C有線電視機頂盒等。
機頂盒的核心功能在于接收并轉換數字電視信號,使之能在傳統或智能電視上播放。它不僅能接收來自有線電纜、衛星天線及寬帶網絡的信號,還能提供電子節目指南、網頁瀏覽等增值服務。通過機頂盒,用戶能夠享受到高清乃至4K超高清的電視節目,體驗更為細膩的畫面和震撼的音效。此外,機頂盒還具備網絡交互能力,支持在線購物、觀看網絡視頻、玩游戲等多元化活動,使電視機從單向接收信息的設備轉變為智能互動終端。
隨著技術的不斷進步,機頂盒正朝著高清化、智能化方向發展。未來,機頂盒將不僅限于基本的信號接收與解碼功能,還將融入更多智能推薦、語音識別等先進技術,為用戶提供更加個性化、便捷的娛樂體驗。總之,機頂盒作為連接電視與互聯網的橋梁,正以其豐富的功能和廣泛的應用場景,不斷滿足用戶日益增長的娛樂需求。
近年來,Holy Stone不斷加大在技術研發和產品創新方面的投入。公司致力于研發適用于節能產品應用所需的被動元件,幫助客戶提升產品能源轉換效率。在全球汽車電子化發展的背景下,Holy Stone正式跨入車用電子供應鏈,以提供優質元件的能力協助汽車電子達到最佳數位化。這些技術創新不僅推動了公司產品的升級換代,還為公司開拓了新的市場領域和增長點。
以上五個故事展示了Holy Stone公司在電子行業中的發展歷程和成就,每個故事都體現了公司在不同方面的努力和成果。
EnOcean GmbH成立于2001年,總部設在慕尼黑附近的奧伯興。自創立之初,公司就專注于無線無源傳輸技術的研發,旨在提供一種無需外部電源、低維護成本的無線傳感器解決方案。這種技術的核心在于能量轉換器,能夠收集環境中的微弱能量(如光能、振動能等),轉化為電能供傳感器使用。隨著技術的不斷完善,EnOcean逐漸在電子行業中嶄露頭角。
安普康的成功離不開其獨特的企業文化和優秀的團隊。公司注重員工的培訓和發展,為員工提供廣闊的職業發展空間和良好的福利待遇。同時,公司還積極營造積極向上、團結協作的工作氛圍,使得員工能夠充分發揮自己的才能和潛力。這種企業文化不僅吸引了大量優秀人才加入安普康,也使得公司在面對市場挑戰時能夠保持強大的凝聚力和戰斗力。
請注意,這些故事是基于已知信息創作的,并不代表安普康公司的真實發展歷程。如需了解安普康公司的真實故事,建議查閱公司官方發布的資料或相關新聞報道。
1937年,在美國的科羅拉多州,BAND-IT公司應運而生。當時,電子行業正處于快速發展的初期,對高質量緊固件的需求日益增長。BAND-IT創始人敏銳地捕捉到了這一機遇,開始設計和制造不銹鋼帶和扎扣,以及C00169標準綁帶機。這些產品迅速在電子行業中獲得了認可,成為電纜、電線束等部件緊固的理想選擇。初創時期的BAND-IT面臨著資金短缺、市場競爭激烈等挑戰,但憑借其創新的產品和卓越的品質,逐漸在電子行業中站穩了腳跟。
隨著電子技術在深海鉆探領域的應用不斷加深,對緊固件的耐腐蝕性和可靠性提出了更高要求。1947年,克爾麥吉石油工業公司完成了歷史性的32號船淺灘區油井鉆探,該油井遠離陸地,需要在惡劣的鹽水環境中運輸石油。BAND-IT公司憑借其卓越的不銹鋼緊固件產品,成功滿足了這一特殊需求。其不銹鋼扎帶和扎扣能夠在高鹽度、高濕度的環境下保持穩定的性能,為深海鉆探的順利進行提供了有力保障。
一、前言 在原油開采過程中,初次采油一般依靠地底壓力讓原油自噴而出;此后由于地下壓力減小,不得不往地下注水將油驅出,稱二次采油。當前,中國多數油田處于二次采油晚期,每百噸采出液體中,含水量高達95%,綜合原油采收率只有30%多一些,6 ...… 查看全部問答∨ |
|
定義模塊 CODE: module Design(端口1,端口2,端口3……); 1)引用時,嚴格按照模塊定義的端口順序來連接,不用標明原模塊定義時規定的端口名。 CODE: Design u_1(u_1的端口1,u_1的端口2,u_1的端口3,u_1的端口……);//和Desi ...… 查看全部問答∨ |
|
本書是為使讀者從零起步,快速掌握以PLC(可編程邏輯控制器)為核心的電氣控制電路的設計與應用技術而編寫的。. 本書首先重點介紹了常用低壓電器、電動機基本控制電路,并對一些實用電氣控制電路進行了簡要分析。然后以歐姆龍CPM1A系列的PLC為例, ...… 查看全部問答∨ |
|
承接 1、各種通信軟件、模塊的設計現,Linux/Vxworks底層驅動設計實現。 3、行業軟件[銀行/電信/電力/其他]及模塊開發。 2、網站設計推廣。 本團隊擁有多名資深通信行業軟件工程師、硬件工程師,擁有豐富的項目開發管理經驗,大部分擁有5年以上 ...… 查看全部問答∨ |
|