#include "segment_74hc595d.h" #include "segment.h" #include "timer12.h" #include "spi13.h" #include "systick_timer.h" typedef enum { LSB_FIRST, MSB_FIRST, }LSB_MSB_MODE; #define SEGMENT_74HC595D_SDATA_PORT (Pn_Type*)PE #define SEGMENT_74HC595D_SDATA_PIN 8 #define SEGMENT_74HC595D_SDATA_HIGH HAL_GPIO_SetPin(SEGMENT_74HC595D_SDATA_PORT,_BIT(SEGMENT_74HC595D_SDATA_PIN)) #define SEGMENT_74HC595D_SDATA_LOW HAL_GPIO_ClearPin(SEGMENT_74HC595D_SDATA_PORT,_BIT(SEGMENT_74HC595D_SDATA_PIN)) #define SEGMENT_74HC595D_SCK_PORT (Pn_Type*)PE #define SEGMENT_74HC595D_SCK_PIN 9 #define SEGMENT_74HC595D_SCK_HIGH HAL_GPIO_SetPin(SEGMENT_74HC595D_SCK_PORT,_BIT(SEGMENT_74HC595D_SCK_PIN)) #define SEGMENT_74HC595D_SCK_LOW HAL_GPIO_ClearPin(SEGMENT_74HC595D_SCK_PORT,_BIT(SEGMENT_74HC595D_SCK_PIN)) #define SEGMENT_74HC595D_LATCH_PORT (Pn_Type*)PE #define SEGMENT_74HC595D_LATCH_PIN_NUM 10 #define SEGMENT_74HC595D_LATCH_H HAL_GPIO_SetPin(SEGMENT_74HC595D_LATCH_PORT, _BIT(SEGMENT_74HC595D_LATCH_PIN_NUM)) #define SEGMENT_74HC595D_LATCH_L HAL_GPIO_ClearPin(SEGMENT_74HC595D_LATCH_PORT, _BIT(SEGMENT_74HC595D_LATCH_PIN_NUM)) #define SEGMENT_74HC595D_LATCH_T HAL_GPIO_TogglePin(SEGMENT_74HC595D_LATCH_PORT, _BIT(SEGMENT_74HC595D_LATCH_PIN_NUM)) typedef union { struct { uint8_t HC595_4; uint8_t HC595_3; uint8_t HC595_5_F1C1 : 1; uint8_t HC595_5_F1C2 : 1; uint8_t HC595_5_F2C1 : 1; uint8_t HC595_5_F2C2 : 1; uint8_t HC595_5_F3C1 : 1; uint8_t HC595_5_F3C2 : 1; uint8_t HC595_5_F4C1 : 1; uint8_t HC595_5_F4C2 : 1; uint8_t HC595_2; uint8_t HC595_1; }HC595_Data; uint8_t HC595_TxBuff[SEGMENT_74HC595D_IC_TOTAL_NUM]; }HC595_OUTPUT_DATA; static SEGMENT_OUTPUT_STEP SegmentOutputStep; static HC595_OUTPUT_DATA HC595_OutputData; static LSB_MSB_MODE HC595_OutputMode = MSB_FIRST; static uint32_t ToggleTickCount; static bool isToggle = false; uint8_t Segment_Buff[SEGMENT_OUTPUT_MAX][SEGMENT_74HC595D_IC_DATA_NUM]; bool Segment_Toggle_In; bool Segment_Toggle_Out; static void Segemet_Output_Process(void); static void Segment_Output_Data(uint8_t* pTxData, uint8_t TxSize); void Segment_Initialization(void) { HAL_GPIO_ConfigOutput(SEGMENT_74HC595D_SDATA_PORT, SEGMENT_74HC595D_SDATA_PIN, PUSH_PULL_OUTPUT); HAL_GPIO_ConfigPullup(SEGMENT_74HC595D_SDATA_PORT, SEGMENT_74HC595D_SDATA_PIN, PUPDx_EnablePU); HAL_GPIO_ConfigOutput(SEGMENT_74HC595D_SCK_PORT, SEGMENT_74HC595D_SCK_PIN, PUSH_PULL_OUTPUT); HAL_GPIO_ConfigPullup(SEGMENT_74HC595D_SCK_PORT, SEGMENT_74HC595D_SCK_PIN, PUPDx_EnablePU); HAL_GPIO_ConfigOutput(SEGMENT_74HC595D_LATCH_PORT, SEGMENT_74HC595D_LATCH_PIN_NUM, PUSH_PULL_OUTPUT); HAL_GPIO_ConfigPullup(SEGMENT_74HC595D_LATCH_PORT, SEGMENT_74HC595D_LATCH_PIN_NUM, PUPDx_EnablePU); SEGMENT_74HC595D_LATCH_H; SEGMENT_74HC595D_SCK_LOW; SEGMENT_74HC595D_SDATA_HIGH; //Segmet_Output_Process(); ToggleTickCount = millis(); isToggle = false; Timer12_Set_Match_Interrupt_Callback(Segemet_Output_Process); } static void Segemet_Output_Process(void) { static uint8_t temp = 0; memset(HC595_OutputData.HC595_TxBuff, 0, SEGMENT_74HC595D_IC_TOTAL_NUM); if((millis() - ToggleTickCount) >= SEGMENT_TOGGLE_TIME) { ToggleTickCount = millis(); isToggle = !isToggle; } switch(SegmentOutputStep) { case SEGMENT_OUTPUT_F1C1: HC595_OutputData.HC595_Data.HC595_5_F1C1 = true; break; case SEGMENT_OUTPUT_F1C2: HC595_OutputData.HC595_Data.HC595_5_F1C2 = true; break; case SEGMENT_OUTPUT_F2C1: HC595_OutputData.HC595_Data.HC595_5_F2C1 = true; break; case SEGMENT_OUTPUT_F2C2: HC595_OutputData.HC595_Data.HC595_5_F2C2 = true; break; case SEGMENT_OUTPUT_F3C1: HC595_OutputData.HC595_Data.HC595_5_F3C1 = true; break; case SEGMENT_OUTPUT_F3C2: HC595_OutputData.HC595_Data.HC595_5_F3C2 = true; break; case SEGMENT_OUTPUT_F4C1: HC595_OutputData.HC595_Data.HC595_5_F4C1 = true; break; case SEGMENT_OUTPUT_F4C2: HC595_OutputData.HC595_Data.HC595_5_F4C2 = true; break; } HC595_OutputData.HC595_Data.HC595_1 = Segment_OutputBuff[SegmentOutputStep][0]; HC595_OutputData.HC595_Data.HC595_2 = Segment_OutputBuff[SegmentOutputStep][1]; HC595_OutputData.HC595_Data.HC595_3 = Segment_OutputBuff[SegmentOutputStep][2]; HC595_OutputData.HC595_Data.HC595_4 = Segment_OutputBuff[SegmentOutputStep][3]; if(Segment_Toggle_In == true && isToggle == true) { if(SegmentOutputStep == DUST_SENSOR_PM40_SELECT_1 || SegmentOutputStep == DUST_SENSOR_PM40_SELECT_2) { HC595_OutputData.HC595_Data.HC595_1 = 0x00; HC595_OutputData.HC595_Data.HC595_2 = 0x00; } } if(Segment_Toggle_Out == true && isToggle == true) { if(SegmentOutputStep == DUST_SENSOR_PM40_SELECT_1 || SegmentOutputStep == DUST_SENSOR_PM40_SELECT_2) { HC595_OutputData.HC595_Data.HC595_3 = 0x00; HC595_OutputData.HC595_Data.HC595_4 = 0x00; } } SEGMENT_74HC595D_LATCH_L; Segment_Output_Data(HC595_OutputData.HC595_TxBuff, SEGMENT_74HC595D_IC_TOTAL_NUM); SEGMENT_74HC595D_LATCH_H; SegmentOutputStep++; if(SegmentOutputStep >= SEGMENT_OUTPUT_MAX) { SegmentOutputStep = SEGMENT_OUTPUT_F1C1; } } static void Segment_Output_Data(uint8_t* pTxData, uint8_t TxSize) { uint8_t Temp; uint8_t i, j; if(HC595_OutputMode == LSB_FIRST) { for(i = 0 ; i < TxSize ; i++) { Temp = pTxData[i]; for(j = 0 ; j < 8 ; j++) { if((Temp & 0x01)) { SEGMENT_74HC595D_SDATA_HIGH; } else { SEGMENT_74HC595D_SDATA_LOW; } SEGMENT_74HC595D_SCK_HIGH; SEGMENT_74HC595D_SCK_LOW; Temp = Temp >> 1; } } } else { for(i = 0 ; i < TxSize ; i++) { Temp = pTxData[i]; for(j = 0 ; j < 8 ; j++) { if((Temp & 0x80)) { SEGMENT_74HC595D_SDATA_HIGH; } else { SEGMENT_74HC595D_SDATA_LOW; } SEGMENT_74HC595D_SCK_HIGH; SEGMENT_74HC595D_SCK_LOW; Temp = Temp << 1; } } } SEGMENT_74HC595D_SDATA_HIGH; }