初次使用HC595來擴展接口驅動LED,結果出現595不受控,不管是輸出0xff,還是0x00,LED都是有的滅,有的亮搞不懂怎么回事?求大佬指點!
- c文件
- #include "stm32f10x.h"
- #include "stm32f10x_rcc.h"
- #include "stm32f10x_gpio.h"
- #include "74HC595.h"
- void delay(uint16_t t);
- //HC595_Send_Multi_Byte(Led_All_On,2);//10路燈全開
- //HC595_Send_Multi_Byte(Led_All_Off,2);//10路燈全關
- 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燈全亮
- /******** 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_2MHz;
- 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 --);
- }
- /******************************************************
- *流水燈程序
- *******************************************************/
- 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);
- }
- }
-
-
- H文件
- #ifndef __74HC595_H
- #define __74HC595_H
- #include "stm32f10x.h"
- #include "delay.h"
- #define SHCP_GPIO_PORT GPIOB
- #define SHCP_GPIO_CLK RCC_APB2Periph_GPIOB
- #define SHCP_GPIO_PIN GPIO_Pin_4
- #define STCP_GPIO_PORT GPIOB
- #define STCP_GPIO_CLK RCC_APB2Periph_GPIOB
- #define STCP_GPIO_PIN GPIO_Pin_5
- #define DS_GPIO_PORT GPIOB
- #define DS_GPIO_CLK RCC_APB2Periph_GPIOB
- #define DS_GPIO_PIN GPIO_Pin_3
- #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);
- extern u8 Led_Buf[2] ; //存儲要發送的指令字節,也就是燈的狀態 Led_Buf[0]控制燈6-10;Led_Buf[1]控制燈1-5
- extern u8 Led_All_Off[2]; //LED燈全滅
- extern u8 Led_All_On[2]; //LED燈全亮
- #endif
復制代碼
我在main函數中初始化595,然后使用HC595_Send_Multi_Byte函數控制結果如圖,一點都不受控,請問哪里出問題了。
int main(void){
HC595_GPIO_Config();
HC595_Send_Multi_Byte(Led_All_Off,1);
}
main程序大致如上。
請問該怎么解決。
或者哪位大佬發一個基于stm32f1的控制595 的程序,最好是驗證過的,網上大部分都試過沒有用。
|