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.
221 lines
6.9 KiB
221 lines
6.9 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_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;
|
|
}
|
|
|