#include "74hc595.h"
const T_HC595_PIN hc595 =
{
.sck_port = HC595_SCK_GPIO_Port,
.sck_pin = HC595_SCK_Pin,
.data_port = HC595_SI_GPIO_Port,
.data_pin = HC595_SI_Pin,
.rck_port = HC595_RCK_GPIO_Port,
.rck_pin = HC595_RCK_Pin,
.en_port = HC595_EN_GPIO_Port,
.en_pin = HC595_EN_Pin
};
void hc595Delay(uint16_t cnt)
{
while (--cnt);
}
void hc595Init(const T_HC595_PIN *pin)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
}
void hc595DeInit(const T_HC595_PIN *pin)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
}
void hc595LedOff(const T_HC595_PIN *pin)
{
hc595WriteData(pin, 0x00);
}
void hc595LedOn(const T_HC595_PIN *pin)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
hc595WriteData(pin, 0xff);
}
void hc595WriteData(const T_HC595_PIN *pin, uint8_t pdata)
{
uint8_t i = 0;
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
for (i = 0; i < 8; i++)
{
if ((pdata << i) & 0x80)
{
GPIO_WriteBit(pin->data_port, pin->data_pin, Bit_SET);
}
else
{
GPIO_WriteBit(pin->data_port, pin->data_pin, Bit_RESET);
}
hc595Delay(1);
GPIO_WriteBit(pin->sck_port, pin->sck_pin, Bit_RESET);
GPIO_WriteBit(pin->sck_port, pin->sck_pin, Bit_SET);
}
hc595Delay(1);
GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_RESET);
GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_SET);
hc595Delay(1);
GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_RESET);
}
void LED_AnnularPipelineLamp(const T_HC595_PIN *pin, uint8_t ch)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
switch (ch)
{
case 0:
hc595WriteData(pin, 0xF8);
break;
case 1:
hc595WriteData(pin, 0xF1);
break;
case 2:
hc595WriteData(pin, 0xE3);
break;
case 3:
hc595WriteData(pin, 0xC7);
break;
case 4:
hc595WriteData(pin, 0x8F);
break;
case 5:
hc595WriteData(pin, 0x1F);
break;
case 6:
hc595WriteData(pin, 0x3E);
break;
case 7:
hc595WriteData(pin, 0x7C);
break;
default:
break;
}
}
void LED_AnnularPipelineLamp_3(const T_HC595_PIN *pin, uint8_t ch)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
switch (ch)
{
case 0:
hc595WriteData(pin, 0x03);
break;
case 1:
hc595WriteData(pin, 0x06);
break;
case 2:
hc595WriteData(pin, 0x0C);
break;
case 3:
hc595WriteData(pin, 0x18);
break;
case 4:
hc595WriteData(pin, 0x30);
break;
case 5:
hc595WriteData(pin, 0x60);
break;
case 6:
hc595WriteData(pin, 0x81);
break;
default:
break;
}
}
void LED_TwowayDescent(const T_HC595_PIN *pin, uint8_t ch)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
switch (ch)
{
case 0:
hc595WriteData(pin, 0x01);
break;
case 1:
hc595WriteData(pin, 0x82);
break;
case 2:
hc595WriteData(pin, 0x44);
break;
case 3:
hc595WriteData(pin, 0x28);
break;
case 4:
hc595WriteData(pin, 0x10);
break;
default:
break;
}
}
void LED_CyclicMode(const T_HC595_PIN *pin, const uint8_t ch)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
switch (ch)
{
case 0:
hc595WriteData(pin, 0xFE);
break;
case 1:
hc595WriteData(pin, 0xFC);
break;
case 2:
hc595WriteData(pin, 0xF8);
break;
case 3:
hc595WriteData(pin, 0xF0);
break;
case 4:
hc595WriteData(pin, 0xE0);
break;
case 5:
hc595WriteData(pin, 0xC0);
break;
case 6:
hc595WriteData(pin, 0x80);
break;
case 7:
hc595WriteData(pin, 0x00);
break;
case 8:
hc595WriteData(pin, 0x01);
break;
case 9:
hc595WriteData(pin, 0x03);
break;
case 10:
hc595WriteData(pin, 0x07);
break;
case 11:
hc595WriteData(pin, 0x0F);
break;
case 12:
hc595WriteData(pin, 0x1F);
break;
case 13:
hc595WriteData(pin, 0x3F);
break;
case 14:
hc595WriteData(pin, 0x7F);
break;
case 15:
hc595WriteData(pin, 0xFF);
break;
default:
break;
}
}
uint8_t LedFlash_Tmr = 0;
void Batter_EleShow(const T_HC595_PIN *pin, const uint8_t Batter)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
if (Batter < 12)
{
if (Batter <= 10)
{
if (LedFlash_Tmr < 250 && ++LedFlash_Tmr < 2)
{
hc595WriteData(pin, 0x01);
}
else if (LedFlash_Tmr >= 2 && LedFlash_Tmr < 3)
{
hc595WriteData(pin, 0x00);
}
else
{
LedFlash_Tmr = 0;
}
}
else
{
LedFlash_Tmr = 0;
hc595WriteData(pin, 0x01);
}
}
else if (Batter >= 12 && Batter < 24)
{
hc595WriteData(pin, 0x03);
}
else if (Batter >= 24 && Batter < 36)
{
hc595WriteData(pin, 0x07);
}
else if (Batter >= 36 && Batter < 48)
{
hc595WriteData(pin, 0x0F);
}
else if (Batter >= 48 && Batter < 60)
{
hc595WriteData(pin, 0x1F);
}
else if (Batter >= 60 && Batter < 72)
{
hc595WriteData(pin, 0x3F);
}
else if (Batter >= 72 && Batter < 84)
{
hc595WriteData(pin, 0x7F);
}
else
{
hc595WriteData(pin, 0xFF);
}
}
#define ChargeValue 3
uint8_t time = 0;
void Batter_ChargeShow(const T_HC595_PIN *pin, const uint8_t Batter)
{
if (Batter < 12)
{
if (time < 250 && ++time < ChargeValue)
{
hc595WriteData(pin, 0x00);
}
else if (time >= ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x01);
}
else
{
time = 0;
}
}
else if (Batter >= 12 && Batter < 24)
{
if (time < 250 && ++time <= ChargeValue)
{
hc595WriteData(pin, 0x01);
}
else if (time > ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x03);
}
else
{
time = 0;
}
}
else if (Batter >= 24 && Batter < 36)
{
if (time < 250 && ++time <= ChargeValue)
{
hc595WriteData(pin, 0x03);
}
else if (time > ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x07);
}
else
{
time = 0;
}
}
else if (Batter >= 36 && Batter < 48)
{
if (time < 250 && ++time <= ChargeValue)
{
hc595WriteData(pin, 0x07);
}
else if (time > ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x0F);
}
else
{
time = 0;
}
}
else if (Batter >= 48 && Batter < 60)
{
if (time < 250 && ++time <= ChargeValue)
{
hc595WriteData(pin, 0x0F);
}
else if (time > ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x1F);
}
else
{
time = 0;
}
}
else if (Batter >= 60 && Batter < 72)
{
if (time < 250 && ++time <= ChargeValue)
{
hc595WriteData(pin, 0x1F);
}
else if (time > ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x3F);
}
else
{
time = 0;
}
}
else if (Batter >= 72 && Batter < 95)
{
if (time < 250 && ++time < ChargeValue)
{
hc595WriteData(pin, 0xFF);
}
else if (time >= ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x7F);
}
else
{
time = 0;
}
}
else
{
time = 0;
hc595WriteData(pin, 0xFF);
}
}
#ifndef __74HC595_HEADER__
#define __74HC595_HEADER__
#include "main.h"
#define HC595_SCK_Pin GPIO_Pin_1
#define HC595_SCK_GPIO_Port GPIOB
#define HC595_RCK_Pin GPIO_Pin_2
#define HC595_RCK_GPIO_Port GPIOB
#define HC595_SI_Pin GPIO_Pin_8
#define HC595_SI_GPIO_Port GPIOA
#define HC595_EN_Pin GPIO_Pin_4
#define HC595_EN_GPIO_Port GPIOA
typedef struct
{
GPIO_TypeDef* sck_port;
uint16_t sck_pin;
GPIO_TypeDef* data_port;
uint16_t data_pin;
GPIO_TypeDef* rck_port;
uint16_t rck_pin;
GPIO_TypeDef* en_port;
uint16_t en_pin;
} T_HC595_PIN;
extern const T_HC595_PIN hc595;
void hc595Init(const T_HC595_PIN *pin);
void hc595DeInit(const T_HC595_PIN *pin);
void hc595WriteData(const T_HC595_PIN *pin, uint8_t pdata);
void hc595LedOn(const T_HC595_PIN *pin);
void hc595LedOff(const T_HC595_PIN *pin);
void LED_AnnularPipelineLamp(const T_HC595_PIN *pin,uint8_t ch);
void LED_TwowayDescent(const T_HC595_PIN *pin, uint8_t ch);
void LED_CyclicMode(const T_HC595_PIN *pin, const uint8_t ch);
void Batter_EleShow(const T_HC595_PIN *pin, const uint8_t Batter);
void Batter_ChargeShow(const T_HC595_PIN *pin, const uint8_t Batter);
void LED_AnnularPipelineLamp_3(const T_HC595_PIN *pin, uint8_t ch);
void hc595Delay(uint16_t cnt);
#endif