#include "74hc595.h"
/******************
功 能:定义HC595的功能引脚
备 注:变更引脚,由MX配置完成
*******************/
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 //芯片使能
};
/******************
函数名:hc595Delay
功 能:实现us级延迟
形 参:cnt--us值
返回值:无
备 注:
*******************/
void hc595Delay(uint16_t cnt)
{
while (--cnt);
}
/******************************
函数名:hc595Init
功 能:初始化hc595的使能脚(EN),默认工作状态
形 参:pin--hc595引脚结构体
返回值:
备 注:0--器件屏蔽 1--器件工作
*******************************/
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);//打开使能脚
}
/******************************
函数名:hc595DeInit
功 能:初始化hc595的使能脚(EN),默认休息状态
形 参:pin--hc595引脚结构体
返回值:
备 注:0--器件屏蔽 1--器件工作
*******************************/
void hc595DeInit(const T_HC595_PIN *pin)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
}
/***************************************下面是对LED的应用*****************************************************/
/*********************************************
函数名:hc595LedOff
功 能:关闭全部LED
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
void hc595LedOff(const T_HC595_PIN *pin)
{
hc595WriteData(pin, 0x00);
}
/*********************************************
函数名:hc595LedOn
功 能:开灯全部LED
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
void hc595LedOn(const T_HC595_PIN *pin)
{
GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
hc595WriteData(pin, 0xff);
}
/*********************************************
函数名:hc595WriteData
功 能:对hc595器件写入1字节,代表8个io口的输出状态
形 参:pin--hc595引脚结构体 pdata--数据字节
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
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);//HC595_SI=1
}
else
{
GPIO_WriteBit(pin->data_port, pin->data_pin, Bit_RESET);//HC595_SI=0
}
hc595Delay(1);
GPIO_WriteBit(pin->sck_port, pin->sck_pin, Bit_RESET);//HC595_sck=0
GPIO_WriteBit(pin->sck_port, pin->sck_pin, Bit_SET);//HC595_sck=1
}
hc595Delay(1);
GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_RESET);//HC595_rck=0
GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_SET);//HC595_rck=1
hc595Delay(1);
GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_RESET);//HC595_rck=0
}
/*********************************************
函数名:LED_AnnularPipelineLamp
功 能:LED环形流水灯,0->7顺时针 7->0逆时针
形 参:pin--hc595引脚结构体 ch--通道
返回值:
备 注:8个led灯连接到HC595器件
作 者:薛建强
时 间:2019/06/22
**********************************************/
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;
}
}
/*********************************************
函数名:LED_AnnularPipelineLamp_3
功 能:LED环形流水灯,0->7顺时针 7->0逆时针 3个灯流水
形 参:pin--hc595引脚结构体 ch--通道
返回值:
备 注:8个led灯连接到HC595器件
作 者:薛建强
时 间:2019/06/22
**********************************************/
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, 0x07);
// break;
// case 1:
// hc595WriteData(pin, 0x0E);
// break;
// case 2:
// hc595WriteData(pin, 0x1C);
// break;
// case 3:
// hc595WriteData(pin, 0x38);
// break;
// case 4:
// hc595WriteData(pin, 0x70);
// break;
// case 5:
// hc595WriteData(pin, 0xE0);
// break;
// case 6:
// hc595WriteData(pin, 0xC1);
// break;
// case 7:
// hc595WriteData(pin, 0x83);
// break;
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;
// case 7:
// hc595WriteData(pin, 0x03);
// break;
default:
break;
}
}
/*********************************************
函数名:LED_TwowayDescent
功 能:双路流水灯
形 参:pin--hc595引脚结构体 ch--通道
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
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;
}
}
/*********************************************
函数名:LED_CyclicMode
功 能:DV循环模式下的效果
形 参:pin--hc595引脚结构体 ch--通道
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
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;
}
}
/*********************************************
函数名:Batter_EleShow
功 能:电量显示
形 参:pin--hc595引脚结构体 Batter--电量的百分比
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
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) // 1格
{
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 // 5% ~ 12% 显示最后一格电量
{
LedFlash_Tmr = 0;
hc595WriteData(pin, 0x01);
}
}
else if (Batter >= 12 && Batter < 24) // 2格
{
hc595WriteData(pin, 0x03);
}
else if (Batter >= 24 && Batter < 36) // 3格
{
hc595WriteData(pin, 0x07);
}
else if (Batter >= 36 && Batter < 48) // 4格
{
hc595WriteData(pin, 0x0F);
}
else if (Batter >= 48 && Batter < 60) // 5格
{
hc595WriteData(pin, 0x1F);
}
else if (Batter >= 60 && Batter < 72) // 6格
{
hc595WriteData(pin, 0x3F);
}
else if (Batter >= 72 && Batter < 84) // 7格
{
hc595WriteData(pin, 0x7F);
}
else // 8格
{
hc595WriteData(pin, 0xFF);
}
}
/*********************************************
函数名:Batter_ChargeShow
功 能:电池充电显示
形 参:pin--hc595引脚结构体 Batter--电量的百分比
返回值:
备 注:
作 者:薛建强
时 间:2019/06/22
**********************************************/
#define ChargeValue 3 // 充电时间值
uint8_t time = 0; // 充电指示电路
void Batter_ChargeShow(const T_HC595_PIN *pin, const uint8_t Batter)
{
if (Batter < 12) // 1格
{
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) // 2格
{
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) // 3格
{
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) // 4格
{
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) // 5格
{
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) // 6格
{
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) // 7格
{
if (time < 250 && ++time < ChargeValue)
{
hc595WriteData(pin, 0xFF);
}
else if (time >= ChargeValue && time < 2 * ChargeValue)
{
hc595WriteData(pin, 0x7F);
}
else
{
time = 0;
}
}
else // 8格
{
time = 0;
hc595WriteData(pin, 0xFF);
}
}