You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.3 KiB

#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);
}