STM32 74HC595驱动程序

2019-11-09来源: eefocus关键字:STM32  74HC595  驱动程序

以下为.h文件:

#ifndef __74HC595_H__

#define __74HC595_H__

#include "stm32f10x.h"  

 

 

 

 

 

#define SHCP_GPIO_PORT      GPIOA              

#define SHCP_GPIO_CLK    RCC_APB2Periph_GPIOA

#define SHCP_GPIO_PIN    GPIO_Pin_1       

 

#define STCP_GPIO_PORT      GPIOA              

#define STCP_GPIO_CLK    RCC_APB2Periph_GPIOA

#define STCP_GPIO_PIN    GPIO_Pin_0        

 

#define DS_GPIO_PORT        GPIOB              

#define DS_GPIO_CLK    RCC_APB2Periph_GPIOB

#define DS_GPIO_PIN    GPIO_Pin_1

 

#define HC595_SHCP_Low()      GPIO_ResetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )

#define HC595_SHCP_High()     GPIO_SetBits( SHCP_GPIO_PORT, SHCP_GPIO_PIN )

#define HC595_STCP_Low()      GPIO_ResetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )

#define HC595_STCP_High()     GPIO_SetBits( STCP_GPIO_PORT, STCP_GPIO_PIN )

#define HC595_Data_Low()      GPIO_ResetBits( DS_GPIO_PORT, DS_GPIO_PIN )

#define HC595_Data_High()     GPIO_SetBits( DS_GPIO_PORT, DS_GPIO_PIN )

 

 

void HC595_GPIO_Config(void);

void HC595_Send_Byte(u8 byte);

void HC595_CS(void);

void HC595_Send_Multi_Byte(u8 *data, u16 len);

 

 

#endif

以下为.c文件:


#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_gpio.h"

 

#include "74HC595.h"

void delay(uint16_t t);

 

 

/********  74HC595 GPIO 配置 *************************/

void HC595_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd( SHCP_GPIO_CLK | STCP_GPIO_CLK | DS_GPIO_CLK, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = SHCP_GPIO_PIN;

GPIO_Init(SHCP_GPIO_PORT, &GPIO_InitStructure);   // 初始化 SHCP 引脚

GPIO_InitStructure.GPIO_Pin = STCP_GPIO_PIN;

GPIO_Init(STCP_GPIO_PORT, &GPIO_InitStructure);   // 初始化 STCP 引脚

GPIO_InitStructure.GPIO_Pin = DS_GPIO_PIN;

GPIO_Init(DS_GPIO_PORT, &GPIO_InitStructure);     // 初始化 DS   引脚

 

GPIO_ResetBits(SHCP_GPIO_PORT, SHCP_GPIO_PIN);      // 引脚初始状态为高,便于产生上升沿

GPIO_ResetBits(STCP_GPIO_PORT, STCP_GPIO_PIN);  

GPIO_ResetBits(DS_GPIO_PORT, DS_GPIO_PIN);

}

 

 

/***

 *74HC595 发送一个字节 

 *即往74HC595的DS引脚发送一个字节

*/

void HC595_Send_Byte(u8 byte)

{

u8 i;

for (i = 0; i < 8; i ++)  //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位

{

 /****  步骤1:将数据传到DS引脚    ****/

if (byte & 0x80)        //先传输高位,通过与运算判断第八是否为1

HC595_Data_High();    //如果第八位是1,则与 595 DS连接的引脚输出高电平

else                    //否则输出低电平

HC595_Data_Low();

/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/

HC595_SHCP_Low();   // SHCP拉低

delay(1);           // 适当延时

HC595_SHCP_High();  // SHCP拉高, SHCP产生上升沿

delay(1);

byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1

}

}

 

/**

 *74HC595输出锁存 使能 

**/

void HC595_CS(void) 

{

/**  步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器  **/

HC595_STCP_Low();   // 将STCP拉低

delay(1);           // 适当延时

HC595_STCP_High();  // 再将STCP拉高,STCP即可产生一个上升沿

delay(1);

}

 

/**

 *发送多个字节

 *便于级联时数据的发送

 *级联N级,就需要发送N个字节控制HC595

***/

void HC595_Send_Multi_Byte(u8 *data, u16 len)

{

u8 i;

for (i = 0; i < len; i ++ ) // len 个字节

{

HC595_Send_Byte(data[i]);

}

HC595_CS(); //先把所有字节发送完,再使能输出

}

 

void delay(uint16_t t)

{

for (; t != 0; t --);

 

}

关于HC595_Send_Multi_Byte函数的使用要根据实际的硬件情况来,以下为一个例子,可以参考一下:

程序中的相关数据:


 

u8 Led_Buf[2] = {0xff, 0xff}; //存储要发送的指令字节,也就是灯的状态 Led_Buf[0]控制灯6-10;Led_Buf[1]控制灯1-5

u8 Led_All_Off[2] = {0xff, 0xff}; //LED灯全灭

u8 Led_All_On[2] = {0x00, 0x00}; //LED灯全亮

 

 

HC595_Send_Multi_Byte(Led_All_On,2);//10路灯全开

HC595_Send_Multi_Byte(Led_All_Off,2);//10路灯全关

实现流水灯效果:


/******************************************************    

 *流水灯程序

*******************************************************/

void LED_ShowOneToOne(void)

{

u8 pos; // led位置

u8 Led_Show[2] = {0xff, 0xff}; //存储要发送的指令字节, Led_Show[0]控制灯6-10; Led_Show[1]控制灯1-5

//第X个led亮 :1     2    3      4    5    

u8 Waterfall_Led[20] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef,  //控制第一级74HC595

0xff, 0xff, 0xff, 0xff, 0xff,  

//第X个led亮 :6     7    8      9    10  

0xff, 0xff, 0xff, 0xff, 0xff,  //控制第二级74HC595

0xfe, 0xfd, 0xfb, 0xf7, 0xef };

for (pos = 0; pos < 10; pos ++) //第pos个灯,实现流水灯效果

{

Led_Show[1] = Waterfall_Led[pos]; //存放第一级74HC595数据,因为先进先出,所以第一级放在Led_Pos_Buf[1],而不是Led_Pos_Buf[0]

Led_Show[0] = Waterfall_Led[pos+10]; //存放第二级74HC595的数据

HC595_Send_Multi_Byte(Led_Show,2); //将当前数据发送到595  

delay_ms(500);

}

}


关键字:STM32  74HC595  驱动程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479524.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 TM1640芯片驱动程序
下一篇:STM32 MFRC522 IC读卡 程序及原理图

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8L低功耗调试总结
STM8L低功耗调试资料准备功耗数据目标实现低功耗资料准备在调试STM单片机相关功能时,习惯性的进入到STM官方论坛进行资料下载。调试STM8功耗也不例外,找到STM8L的应用笔记,选择最热,先看看官方提供的STM8入门文档,入门资料可以选择中文或者英文(STM8L和STM8AL入门)。资料里面有一段话,对功耗调试相当重要:6.6 不使用的 I/O 和特性微控制器都是为多种应用设计的,通常一个应用不会使用 100 % 的微控制器资源。为了避免不必要的功率消耗 (对电池供电应用特别重要),同时提高 EMC 性能,闲置时钟、计数器或 I/O 都不应浮空。 I/O 应该外部强制 (上拉或者下拉到闲置 I/O 引脚),并且不使用的功能应
发表于 2019-11-14
STM8L低功耗调试总结
STM8的停机模式
首先,STM8有三种低功耗模式,即等待、活跃停机和停机。具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过!一、进入的方式:等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。二、具体进入的步骤:1、首先,你声明一个标志位,名字自己取。这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。我这里用fPowerOn_flag,如下:bool fPowerOn_flag = FALSE;有了这个标志位以后就写下面的部分了:int
发表于 2019-11-14
halt低功耗模式
1. stm8l152有5种低功耗模式,wait mode, low power run mode, low power wait mode, active-halt mode, halt mode.2. 在halt模式下,cpu和外设时钟停止,可以通过外部中断或者复位来唤醒。3. 本实验设计为:led灯亮,紧接着进入halt模式,有按键时,中断,快速唤醒,led灯灭。     PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能     //所有IO输出低电平    GPIO_Init(GPIOA
发表于 2019-11-14
STM8L051低功耗模式测试文档
STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。WAIT  mode  在等待模式,CPU的时钟是停止的,被选择的外设继续运行。WAIT mode 分为两种方式:WFE,WFI。WFE是等待事件发生,才从等待模式中唤醒。WFI是等待中断发生,才从等待模式中唤醒。low power run mode  在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,Flash和EEPROM都要停止运行。电压被配置成Ultra Low Power
发表于 2019-11-14
stm8l 低功耗 halt_active模式
第一次尝试做低功耗,芯片stm8l,用的半halt模式1、关于唤醒,可以用外部中断和RTC(stm8l不同的模式用的唤醒方式均不同)2、关于省电,如果没达到理想的电流,一般都是gpio口问题,没用到的都悬浮输入或输出低都是可以的,用到的统一量一下电平,看看哪个状态不对
发表于 2019-11-14
STM8L EXITB一个端口两个中断的实现
void EXTI_Config(void){     EXTI_DeInit();       EXTI_SetPinSensitivity(EXTI_Pin_5,EXTI_Trigger_Falling);     ITC_SetSoftwarePriority(EXTI5_IRQn, ITC_PriorityLevel_1);    GPIO_Init(KEY_PORT, KEY_RT_PIN, GPIO_Mode_In_PU_IT);    EXTI_SetPinSensitivity(
发表于 2019-11-14
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved