【原创】MC74HC595驱动

/**

******************************************************************************

* @file    V_MC74HC595.h

* @author  LuJ

* @version V3.5.0

* @date    2015-03-31

* @brief   移位寄存器头文件管理

******************************************************************************

* (C) Copyright Vango Technoglogy, Inc. 2015

******************************************************************************

*/

#ifndef __V_MC74HC595_H

#define __V_MC74HC595_H

#include "stm32f10x.h"

//位带操作,实现51类似的GPIO控制功能

//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).

#define V_74TCLK_OUT  *((volatile unsigned long *)((((GPIOF_BASE+12) & 0xF0000000)+0x2000000+(((GPIOF_BASE+12) &0xFFFFF)<<5)+(4<<2))))

#define V_74HCLK_OUT  *((volatile unsigned long *)((((GPIOF_BASE+12) & 0xF0000000)+0x2000000+(((GPIOF_BASE+12) &0xFFFFF)<<5)+(5<<2))))

#define V_74OE_OUT    *((volatile unsigned long *)((((GPIOF_BASE+12) & 0xF0000000)+0x2000000+(((GPIOF_BASE+12) &0xFFFFF)<<5)+(6<<2))))

#define V_74SDI_OUT   *((volatile unsigned long *)((((GPIOF_BASE+12) & 0xF0000000)+0x2000000+(((GPIOF_BASE+12) &0xFFFFF)<<5)+(7<<2))))

#define MC74HC595_OUT_V_SELA                 ((uint32_t)0x00000001)//MC74HC595移位寄存器

#define MC74HC595_OUT_V_SELB                 ((uint32_t)0x00000002)

#define MC74HC595_OUT_V_SELC                 ((uint32_t)0x00000004)

#define MC74HC595_OUT_V_SEL_EN               ((uint32_t)0x00000008)

#define MC74HC595_OUT_V_SEL_PWM1             ((uint32_t)0x00000010)

#define MC74HC595_OUT_V_SEL_PWM2             ((uint32_t)0x00000020)

#define MC74HC595_OUT_V_SEL_UART             ((uint32_t)0x00000040)

#define MC74HC595_OUT_V_RSTn                 ((uint32_t)0x00000080)

#define MC74HC595_OUT_V_VDCIN                ((uint32_t)0x00000100)

#define MC74HC595_OUT_V_V3V                  ((uint32_t)0x00000200)

#define MC74HC595_OUT_VT_MODE0               ((uint32_t)0x00000400)

#define MC74HC595_OUT_VT_MODE1               ((uint32_t)0x00000800)

#define MC74HC595_OUT_V_DVCC_ctr2            ((uint32_t)0x00001000)

#define MC74HC595_OUT_V_DVCC_ctr1            ((uint32_t)0x00002000)

#define MC74HC595_OUT_V_LDO33_ctr2           ((uint32_t)0x00004000)

#define MC74HC595_OUT_V_LDO33_ctr1           ((uint32_t)0x00008000)

#define MC74HC595_OUT_V_vPower_ctr1          ((uint32_t)0x00010000)

#define MC74HC595_OUT_V_vPower_ctr2          ((uint32_t)0x00020000)

#define MC74HC595_OUT_V_vPower_ctr3          ((uint32_t)0x00040000)

#define MC74HC595_OUT_V_SPI1_CS1             ((uint32_t)0x00080000)

#define MC74HC595_OUT_V_SPI1_CS2             ((uint32_t)0x00100000)

#define MC74HC595_OUT_V_W25Q_CS              ((uint32_t)0x00200000)

#define MC74HC595_OUT_V_DS3231_ctr1          ((uint32_t)0x00400000)

#define MC74HC595_OUT_V_DS3231_ctr2          ((uint32_t)0x00800000)

#define MC74HC595_OUT_V_LED1                 ((uint32_t)0x01000000)

#define MC74HC595_OUT_V_LED2                 ((uint32_t)0x02000000)

#define MC74HC595_OUT_V_LED3                 ((uint32_t)0x04000000)

#define Target_SET_DVCC_ctr1                 ((uint8_t)0x01)//DVCC控制,ctr1和ctr2不同时打开

#define Target_SET_DVCC_ctr2                 ((uint8_t)0x02)

#define Target_RESET_DVCC_ctr                ((uint8_t)0x80)

#define Target_SET_LDO33_ctr1                ((uint8_t)0x01)//LDO33控制

#define Target_SET_LDO33_ctr2                ((uint8_t)0x02)

#define Target_RESET_LDO33_ctr               ((uint8_t)0x80)

#define Target_SET_vPower_ctr1               ((uint8_t)0x01)//Target的电源供给控制

#define Target_SET_vPower_ctr2               ((uint8_t)0x02)

#define Target_SET_vPower_ctr3               ((uint8_t)0x04)

#define Target_RESET_vPower_ctr              ((uint8_t)0x80)

#define Target_SET_DS3231_ctr1               ((uint8_t)0x01)//DS3231秒脉冲和32KHz输出控制

#define Target_SET_DS3231_ctr2               ((uint8_t)0x02)

#define Target_RESET_DS3231_ctr              ((uint8_t)0x80)

#define STM32_SET_LED_1                      ((uint8_t)0x01)//STM32外围LED灯控制

#define STM32_SET_LED_2                      ((uint8_t)0x02)

#define STM32_SET_LED_3                      ((uint8_t)0x04)

#define STM32_RESET_LED_x                    ((uint8_t)0x80)

#define ADG1408_Type_SEGx                    ((uint8_t)0x01)//模拟开关类型选择,可选择SEG/UART/PWM1/PWM2

#define ADG1408_Type_UARTx                   ((uint8_t)0x02)

#define ADG1408_Type_PWM1                    ((uint8_t)0x04)

#define ADG1408_Type_PWM2                    ((uint8_t)0x08)

#define ADG1408_Type_AllClose                ((uint8_t)0x80)

#define ADG1408_Channel_1                    ((uint8_t)0x00)//模拟开关通道1-8选择

#define ADG1408_Channel_2                    ((uint8_t)0x01)

#define ADG1408_Channel_3                    ((uint8_t)0x02)

#define ADG1408_Channel_4                    ((uint8_t)0x03)

#define ADG1408_Channel_5                    ((uint8_t)0x04)

#define ADG1408_Channel_6                    ((uint8_t)0x05)

#define ADG1408_Channel_7                    ((uint8_t)0x06)

#define ADG1408_Channel_8                    ((uint8_t)0x07)

extern uint32_t mc74hc595_val;

void V_74HC595_Init(void);//初始化

void V_74HC595_ShiftOuput(u32 shift_val);

void T_ADG1408_Select(uint8_t ADG1408_Type_x,uint8_t ADG1408_Channel_x);

void T_Target_RSTn(void);

void T_Target_VDCIN(BitAction BitVal);

void T_Target_V3V(BitAction BitVal);

void T_Target_MODEx(BitAction BitMode0,BitAction BitMode1);

void T_Target_DVCC_ctr(uint8_t DVCC_ctr_x);

void T_Target_LDO33_ctr(uint8_t LDO33_ctr_x);

void T_Target_vPower_ctr(uint8_t vPower_ctr_x);

void T_ADS8332_SPI1_CS1(BitAction BitVal);

void T_TLV5618_SPI1_CS2(BitAction BitVal);

void W25Q80_W25Q_CS(BitAction BitVal);

void V_DS3231_ctr(uint8_t DS3231_ctr_x);

void STM32_V_LEDx(uint8_t STM32_SET_LED_x);

void V_74HC595_Test(void);

#endif

/**

******************************************************************************

* @file    V_MC74HC595.c

* @author  LuJ

* @version V3.5.0

* @date    2015-03-31

* @brief   MC74HC595移位寄存器 驱动

******************************************************************************

* (C) Copyright Vango Technoglogy, Inc. 2015

******************************************************************************

*/

#include "st_lib.h"

#include "V_MC74HC595.h"

uint32_t mc74hc595_val=0x07380980;//全局变量,控制移位寄存器输出状态

/**

* 函数功能:移位寄存器IO配置.初始化PF4/PF5/PF6/PF7为输出口,并使能这两个口的时钟

* 输入参数:无

* 输出参数:无

* 全局变量:无

* 作者:LuJ

* 修改日期:2015/03/31

* 备注:无

*/

void V_74HC595_Init(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_TypeDef* GPIOx;

uint16_t GPIO_Pin_x;

GPIOx = GPIOF;

GPIO_Pin_x = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//移位寄存器硬件对应IO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//使能PF端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;//74HC595端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz

GPIO_Init(GPIOx, &GPIO_InitStructure);//根据设定参数初始化GPIOx

GPIO_ResetBits(GPIOx,GPIO_Pin_x);//输出低

}

/**

* 函数功能:移位寄存器移位输出

* 输入参数:shift_val:待输入的移位值,输入后移位寄存器输出设定的状态

* 输出参数:无

* 全局变量:无

* 作者:LuJ

* 修改日期:2015/03/31

* 备注:高位先移入,低位后移入

*/

void V_74HC595_ShiftOuput(u32 shift_val)

{

uint8_t i,j;

j=26;

V_74TCLK_OUT=0;//输出低

V_74HCLK_OUT=0;

V_74OE_OUT=0;

V_74SDI_OUT=0;

for(i=0;i<27;i++,j--)

{

if(((shift_val>>j)&0x01)==0x01)

{

V_74SDI_OUT=1;

}

else

{

V_74SDI_OUT=0;

}

V_74TCLK_OUT=0;

V_74TCLK_OUT=1;//产生一个上升沿,移数据

}

V_74HCLK_OUT=0;

V_74HCLK_OUT=1;

}

/**

* 函数功能:模拟开关通道选择

* 输入参数:ADG1408_Type_x:模拟开关选择,可选择SEG/UART/PWM1/PWM2四种

*           ADG1408_Channel_x:选择通道,1-8通道可选

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/03/31

* 备注:可以同时选择SEG/UART/PWM1/PWM2组合,PWM1/PWM2不会同时选择

*/

void T_ADG1408_Select(uint8_t ADG1408_Type_x,uint8_t ADG1408_Channel_x)

{

uint32_t temp=0x00000000;

if((ADG1408_Channel_x<ADG1408_Channel_1) || (ADG1408_Channel_x>ADG1408_Channel_8))

return;

if(((ADG1408_Type_x&ADG1408_Type_PWM1)==ADG1408_Type_PWM1) && ((ADG1408_Type_x&ADG1408_Type_PWM2)==ADG1408_Type_PWM2))//不能同时打开

return;

temp &=(~(MC74HC595_OUT_V_SEL_EN|MC74HC595_OUT_V_SEL_UART|MC74HC595_OUT_V_SEL_PWM1|MC74HC595_OUT_V_SEL_PWM2));

if((ADG1408_Type_x&ADG1408_Type_SEGx)==ADG1408_Type_SEGx)

temp|=MC74HC595_OUT_V_SEL_EN;//SEG

if((ADG1408_Type_x&ADG1408_Type_UARTx)==ADG1408_Type_UARTx)

temp|=MC74HC595_OUT_V_SEL_UART;//UART

if((ADG1408_Type_x&ADG1408_Type_PWM1)==ADG1408_Type_PWM1)

temp|=MC74HC595_OUT_V_SEL_PWM1;//PWM1

if((ADG1408_Type_x&ADG1408_Type_PWM2)==ADG1408_Type_PWM2)

temp|=MC74HC595_OUT_V_SEL_PWM2;//PWM2

switch(ADG1408_Channel_x)

{

case ADG1408_Channel_1:

temp|=ADG1408_Channel_1;

break;

case ADG1408_Channel_2:

temp|=ADG1408_Channel_2;

break;

case ADG1408_Channel_3:

temp|=ADG1408_Channel_3;

break;

case ADG1408_Channel_4:

temp|=ADG1408_Channel_4;

break;

case ADG1408_Channel_5:

temp|=ADG1408_Channel_5;

break;

case ADG1408_Channel_6:

temp|=ADG1408_Channel_6;

break;

case ADG1408_Channel_7:

temp|=ADG1408_Channel_7;

break;

case ADG1408_Channel_8:

temp|=ADG1408_Channel_8;

break;

default:

break;

}

mc74hc595_val &=(~(MC74HC595_OUT_V_SELA|MC74HC595_OUT_V_SELB|MC74HC595_OUT_V_SELC|MC74HC595_OUT_V_SEL_EN\

|MC74HC595_OUT_V_SEL_UART|MC74HC595_OUT_V_SEL_PWM1|MC74HC595_OUT_V_SEL_PWM2));

mc74hc595_val|=temp;

V_74HC595_ShiftOuput(mc74hc595_val);//更新模拟开关控制

}

/**

* 函数功能:产生一个Target复位信号,复位Target

* 输入参数:无

* 输出参数:无

* 全局变量:修改mc74hc595_val,然后复原

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:拉低Target的RSTn一定时间来复位Target

*/

void T_Target_RSTn(void)

{

mc74hc595_val &=(~MC74HC595_OUT_V_RSTn);

V_74HC595_ShiftOuput(mc74hc595_val);//拉低RSTn

//mininum = 5 ms

Delay_ms(8);

mc74hc595_val |=MC74HC595_OUT_V_RSTn;

V_74HC595_ShiftOuput(mc74hc595_val);//拉高RSTn

}

/**

* 函数功能:控制VDCIN的高低电平

* 输入参数:BitVal:设置VDCIN的电平,可设置为Bit_RESET和Bit_SET两种状态

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:Target的掉电检测

*/

void T_Target_VDCIN(BitAction BitVal)

{

assert_param(IS_GPIO_BIT_ACTION(BitVal));

if (BitVal != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_V_VDCIN;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_V_VDCIN);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新VDCIN设置数据

}

/**

* 函数功能:控制V3V的高低电平

* 输入参数:BitVal:设置V3V的电平,可设置为Bit_RESET和Bit_SET两种状态

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:Target的电源电压设置

*/

void T_Target_V3V(BitAction BitVal)

{

assert_param(IS_GPIO_BIT_ACTION(BitVal));

if (BitVal != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_V_V3V;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_V_V3V);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新V3V设置数据

}

/**

* 函数功能:控制Target的MODE0/MODE1的高低电平

* 输入参数:BitMode0:设置MODE0的电平,可设置为Bit_RESET和Bit_SET两种状态

*           BitMode1:设置MODE1的电平

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:Target启动模式设置,一般时候MODE0=0,MODE1=1;

*/

void T_Target_MODEx(BitAction BitMode0,BitAction BitMode1)

{

assert_param(IS_GPIO_BIT_ACTION(BitMode0));

assert_param(IS_GPIO_BIT_ACTION(BitMode1));

if (BitMode0 != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_VT_MODE0;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_VT_MODE0);

}

if (BitMode1 != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_VT_MODE1;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_VT_MODE1);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新MODE0/MODE1设置数据

}

/**

* 函数功能:控制Target的DVCC

* 输入参数:DVCC_ctr_x:设置Target的DVCC,给它灌电压还是拉电压

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:DVCC管脚处理

*/

void T_Target_DVCC_ctr(uint8_t DVCC_ctr_x)

{

mc74hc595_val &=(~(MC74HC595_OUT_V_DVCC_ctr1|MC74HC595_OUT_V_DVCC_ctr2));

if (DVCC_ctr_x == Target_SET_DVCC_ctr1)

{

mc74hc595_val |=MC74HC595_OUT_V_DVCC_ctr1;

}

else if (DVCC_ctr_x == Target_SET_DVCC_ctr2)

{

mc74hc595_val |=MC74HC595_OUT_V_DVCC_ctr2;

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新DVCC控制信号

}

/**

* 函数功能:控制Target的LDO33

* 输入参数:LDO33_ctr_x:设置Target的LDO33,给它灌电压还是拉电压

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:LDO33管脚处理

*/

void T_Target_LDO33_ctr(uint8_t LDO33_ctr_x)

{

mc74hc595_val &=(~(MC74HC595_OUT_V_LDO33_ctr1|MC74HC595_OUT_V_LDO33_ctr2));

if (LDO33_ctr_x == Target_SET_LDO33_ctr1)

{

mc74hc595_val |=MC74HC595_OUT_V_LDO33_ctr1;

}

else if (LDO33_ctr_x == Target_SET_LDO33_ctr2)

{

mc74hc595_val |=MC74HC595_OUT_V_LDO33_ctr2;

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新DVCC控制信号

}

/**

* 函数功能:控制Target的电源供给

* 输入参数:vPower_ctr_x:设置Target的总电源

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:在正常测试时候,打开ctr1,在低功耗测试时,打开ctr2,这两个电源不要同时打开

*/

void T_Target_vPower_ctr(uint8_t vPower_ctr_x)

{

if(((vPower_ctr_x&Target_SET_vPower_ctr1) == Target_SET_vPower_ctr1) \

&& ((vPower_ctr_x&Target_SET_vPower_ctr2) == Target_SET_vPower_ctr2))

return;

mc74hc595_val &=(~(MC74HC595_OUT_V_vPower_ctr1|MC74HC595_OUT_V_vPower_ctr2));

if ((vPower_ctr_x&Target_SET_vPower_ctr1) == Target_SET_vPower_ctr1)//主电源

{

mc74hc595_val |=MC74HC595_OUT_V_vPower_ctr1;

}

else if ((vPower_ctr_x&Target_SET_vPower_ctr2) == Target_SET_vPower_ctr2)

{

mc74hc595_val |=MC74HC595_OUT_V_vPower_ctr2;

}

if ((vPower_ctr_x&Target_SET_vPower_ctr3) == Target_SET_vPower_ctr3)//后备电源

{

mc74hc595_val |=MC74HC595_OUT_V_vPower_ctr3;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_V_vPower_ctr3);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新Target电源控制信号

}

/**

* 函数功能:控制ADS8332的片选信号,低电平有效

* 输入参数:BitVal:设置ADS8332的CS信号,可设置为Bit_RESET和Bit_SET两种状态

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:无

*/

void T_ADS8332_SPI1_CS1(BitAction BitVal)

{

assert_param(IS_GPIO_BIT_ACTION(BitVal));

if (BitVal != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_V_SPI1_CS1;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_V_SPI1_CS1);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新ADS8332的片选设置数据

}

/**

* 函数功能:控制TLV5618的片选信号,低电平有效

* 输入参数:BitVal:设置ADS8332的CS信号,可设置为Bit_RESET和Bit_SET两种状态

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:无

*/

void T_TLV5618_SPI1_CS2(BitAction BitVal)

{

assert_param(IS_GPIO_BIT_ACTION(BitVal));

if (BitVal != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_V_SPI1_CS2;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_V_SPI1_CS2);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新TLV5618的片选设置数据

}

/**

* 函数功能:控制W25Q80BV的片选信号,低电平有效

* 输入参数:BitVal:设置W25Q80BV的CS信号,可设置为Bit_RESET和Bit_SET两种状态

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:无

*/

void W25Q80_W25Q_CS(BitAction BitVal)

{

assert_param(IS_GPIO_BIT_ACTION(BitVal));

if (BitVal != Bit_RESET)

{

mc74hc595_val |=MC74HC595_OUT_V_W25Q_CS;

}

else

{

mc74hc595_val &=(~MC74HC595_OUT_V_W25Q_CS);

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新W25Q80BV的片选设置数据

}

/**

* 函数功能:控制DS3231的秒脉冲和32KHz输出

* 输入参数:DS3231_ctr_x:选择输出秒脉冲还是32kHz

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/03

* 备注:Target_SET_DS3231_ctr1选择秒脉冲输出,Target_SET_DS3231_ctr2选择32kHZ输出,

*       Target_RESET_DS3231_ctr同时关闭两者

*/

void V_DS3231_ctr(uint8_t DS3231_ctr_x)

{

mc74hc595_val &=(~(MC74HC595_OUT_V_DS3231_ctr1|MC74HC595_OUT_V_DS3231_ctr2));

if (DS3231_ctr_x == Target_SET_DS3231_ctr1)

{

mc74hc595_val |=MC74HC595_OUT_V_DS3231_ctr1;

}

else if (DS3231_ctr_x == Target_SET_DS3231_ctr2)

{

mc74hc595_val |=MC74HC595_OUT_V_DS3231_ctr2;

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新DS3231的秒脉冲和32KHz输出情况

}

/**

* 函数功能:STM32外围LED灯控制

* 输入参数:STM32_SET_LED_x:选择需要点亮的LED灯,可以以(STM32_SET_LED_1|STM32_SET_LED_2)同时点亮LED1和LED2

* 输出参数:无

* 全局变量:修改mc74hc595_val

* 作者:LuJ

* 修改日期:2015/04/07

* 备注:STM32_RESET_LED_x关闭所有LED灯

*/

void STM32_V_LEDx(uint8_t STM32_SET_LED_x)

{

mc74hc595_val |=(MC74HC595_OUT_V_LED1|MC74HC595_OUT_V_LED2|MC74HC595_OUT_V_LED3);//灭掉所有LED

if ((STM32_SET_LED_x&STM32_SET_LED_1) == STM32_SET_LED_1)

{

mc74hc595_val &=~MC74HC595_OUT_V_LED1;

}

if ((STM32_SET_LED_x&STM32_SET_LED_2) == STM32_SET_LED_2)

{

mc74hc595_val &=~MC74HC595_OUT_V_LED2;

}

if ((STM32_SET_LED_x&STM32_SET_LED_3) == STM32_SET_LED_3)

{

mc74hc595_val &=~MC74HC595_OUT_V_LED3;

}

V_74HC595_ShiftOuput(mc74hc595_val);//更新STM32的LED灯

}

/**

* 函数功能:移位寄存器移位输出测试

* 输入参数:无

* 输出参数:无

* 全局变量:无

* 作者:LuJ

* 修改日期:2015/03/31

* 备注:在主函数中调用即可看到STM32的3个LED实现跑马灯

*/

void V_74HC595_Test(void)

{

u32 i;

V_74HC595_Init();//初始化与MC74HC595连接的硬件接口

while (1)

{

STM32_V_LEDx(STM32_SET_LED_1|STM32_SET_LED_2);

for(i=0;i<8000000;i++);

STM32_V_LEDx(STM32_SET_LED_2|STM32_SET_LED_3);

for(i=0;i<8000000;i++);

STM32_V_LEDx(STM32_SET_LED_3|STM32_SET_LED_1);

for(i=0;i<8000000;i++);

}

}

时间: 2024-10-08 05:35:37

【原创】MC74HC595驱动的相关文章

【原创】驱动枚举之QueryServiceStatus

BOOL WINAPI QueryServiceStatus( _In_ SC_HANDLE hService, _Out_ LPSERVICE_STATUS lpServiceStatus ); 函数作用:获取指定驱动的当前状态 参数: 1. hService:服务句柄, OpenService 或 CreateService 的返回值获得,需要用SERVICE_QUERY_STATUS权限 2. lpServiceStatus:返回值,用于接收结构体SERVICE_STATUS 返回值: 成

【原创】驱动枚举之EnumServicesStatusEx

BOOL WINAPI EnumServicesStatusEx( _In_ SC_HANDLE hSCManager, _In_ SC_ENUM_TYPE InfoLevel, _In_ DWORD dwServiceType, _In_ DWORD dwServiceState, _Out_opt_ LPBYTE lpServices, _In_ DWORD cbBufSize, _Out_ LPDWORD pcbBytesNeeded, _Out_ LPDWORD lpServicesRe

【原创】驱动卸载之ControlService函数

BOOL WINAPI ControlService( _In_ SC_HANDLE hService, _In_ DWORD dwControl, _Out_ LPSERVICE_STATUS lpServiceStatus ); 函数作用:给指定的服务发送一个控制码 参数: 1. hService: OpenService 或CreateService function返回的服务句柄: 2. dwControl:要发送的控制码,控制码可以是下列系统定义的控制码:也可以是用户自定义的控制码,范

【巨杉数据库SequoiaDB】企业级和开源领域“两开花”,巨杉引领国产数据库创新

2019年12月15日,OSC 源创会·年终盛典在深圳圆满举行.巨杉数据库作为业界领先的金融级分布式数据库厂商, 获得 "2019年开源数据库先锋企业" 及 "2019 GVP-Gitee最有价值开源项目" 两项殊荣. ? SequoiaDB 巨杉数据库始终坚持自研路线,并于2014年正式开源,是国内最早的开源数据库之一.经过8年的自主研发和技术发展,迭代发展出了技术领先.产品安全稳定.通用性强的金融级产品.今年 SequoiaDB 发布两个主要的版本,近期发布的3

【黑金原创教程】【FPGA那些事儿-驱动篇I 】连载导读

前言: 无数昼夜的来回轮替以后,这本<驱动篇I>终于编辑完毕了,笔者真的感动到连鼻涕也流下来.所谓驱动就是认识硬件,还有前期建模.虽然<驱动篇I>的硬件都是我们熟悉的老友记,例如UART,VGA等,但是<驱动篇I>贵就贵在建模技巧的升华,亦即低级建模II. 话说低级建模II,读过<建模篇>的朋友多少也会面熟几分,因为它是低级建模的进化形态.许久以前,笔者就有点燃低级建模II的念头,但是懒惰的性格让笔者别扭许久.某天,老大忽然说道:"让咱们大干一场吧

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验六:数码管模块

实验六:数码管模块 有关数码管的驱动,想必读者已经学烂了 ... 不过,作为学习的新仪式,再烂的东西也要温故知新,不然学习就会不健全.黑金开发板上的数码管资源,由始至终都没有改变过,笔者因此由身怀念.为了点亮多位数码管从而显示数字,一般都会采用动态扫描,然而有关动态扫描的信息请怒笔者不再重复.在此,同样也是动态扫描,但我们却用不同的思路去理解. 图6.1 6位数码管. 如图6.1所示,哪里有一排6位数码管,其中包好8位DIG信号还有6位SEL信号.DIG为digit,即俗称的数码管码,如果数码管

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验三:按键模块② — 点击与长点击

实验三:按键模块② - 点击与长点击 实验二我们学过按键功能模块的基础内容,其中我们知道按键功能模块有如下操作: l 电平变化检测: l 过滤抖动: l 产生有效按键. 实验三我们也会z执行同样的事情,不过却是产生不一样的有效按键: l 按下有效(点击): l 长按下有效(长点击). 图3.1 按下有效,时序示意图. 图3.2 长按下有效,时序示意图. 如图3.1所示,按下有效既是"点击",当按键被按下并且消抖完毕以后,isSClick信号就有被拉高一个时钟(Short Click).

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二:按键模块① - 消抖

实验二:按键模块① - 消抖 按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在<建模篇>出现过,而且还惹来一堆麻烦.事实上,笔者这是在刁难各位同学,好让对方的惯性思维短路一下,但是惨遭口水攻击 ... 面对它,笔者宛如被甩的男人,对它又爱又恨.不管怎么样,如今 I'll be back,笔者再也不会重复一样的悲剧. 按键消抖说傻不傻说难不难.所谓傻,它因为原理不仅简单(就是延迟几下下而已),而且顺序语言(C语言)也有无数不尽的例子.所谓难,那是因为人们很难从单片机的思维跳出来 ... 此外,

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验四:按键模块③ — 单击与双击

实验四:按键模块③ — 单击与双击 实验三我们创建了“点击”还有“长点击”等有效按键的多功能按键模块.在此,实验四同样也是创建多功能按键模块,不过却有不同的有效按键.实验四的按键功能模块有以下两项有效按键: l 单击(按下有效): l 双击(连续按下两下有效). 图4.1 单击有效按键,时序示意图. 实验四的“单击”基本上与实验三的“点击”一模一样,既按键被按下,经过消抖以后isSClick信号被拉高一个时钟,结果如图4.1所示,过程非常单调.反之,“双击”实现起来,会比较麻烦一些,因为我们还要