#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_LATCH_PORT (Pn_Type*)PE #define SEGMENT_74HC595D_LATCH_PIN_NUM 11 #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_1_COM1 : 1; uint8_t HC595_1_COM2 : 1; uint8_t HC595_1_COM3 : 1; uint8_t HC595_1_COM4 : 1; uint8_t HC595_1_COM5 : 1; uint8_t HC595_1_RESERVED : 3; uint8_t HC595_2; uint8_t HC595_3; }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_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; //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); switch(SegmentOutputStep) { case SEGMENT_OUTPUT_COM1: HC595_OutputData.HC595_Data.HC595_1_COM1 = true; break; case SEGMENT_OUTPUT_COM2: HC595_OutputData.HC595_Data.HC595_1_COM2 = true; break; case SEGMENT_OUTPUT_COM3: HC595_OutputData.HC595_Data.HC595_1_COM3 = true; break; case SEGMENT_OUTPUT_COM4: HC595_OutputData.HC595_Data.HC595_1_COM4 = true; break; case SEGMENT_OUTPUT_COM5: HC595_OutputData.HC595_Data.HC595_1_COM5 = true; break; } HC595_OutputData.HC595_Data.HC595_3 = Segment_OutputBuff[SegmentOutputStep][SEGMENT_F1]; HC595_OutputData.HC595_Data.HC595_2 = Segment_OutputBuff[SegmentOutputStep][SEGMENT_F2]; 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_COM1; } } static void Segment_Output_Data(uint8_t* pTxData, uint8_t TxSize) { SPI13_Transmit(pTxData, TxSize); }