以下为.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)        //先传输高位,通过与运算判断第八是否为1HC595_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,  //控制第一级74HC5950xff, 0xff, 0xff, 0xff, 0xff,  //第X个led亮  :6     7    8      9    10   0xff, 0xff, 0xff, 0xff, 0xff,  //控制第二级74HC5950xfe, 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);     }
}

【74HC595】STM32 74HC595驱动程序相关推荐

  1. STM32+DAC8830驱动程序

    1.DAC8830介绍 DAC8830是一款TI的DAC输出芯片,他支持16bit数据出入,同时建立时间为1us,支持标准的SPI接口,最快可支持50Mhz,如下为DAC8830的基本封装: 2.ST ...

  2. 三星K9F1G08U0E(128MB,NAND FLASH) STM32平台驱动程序(模拟时序)

    STM32平台下模拟时序驱动K9F1G08U0E,主要目的为了解.学习NAND FLASH的功能特性,没有使用STM32的FSMC(火龙开发板硬件为模拟时序驱动),纯粹自娱自乐,如对你有帮助,不胜荣幸 ...

  3. STM32实现74HC595控制

    一.前言 本文主要是实出74HC595的简单控制功能实现(学习笔记整理). 二.概述 (一)74HC595简述 74HC595是一个8位串行输入.平行输出的位移缓存器:平台行输出为三态输出. 在SCH ...

  4. esp32通过74HC595控制16个LED灯

    1. 74HC595介绍 74HC595是一个8位串行输入.并行输出的位移缓存器:并行输出为三态输出.在SCK 的上升沿,串行数据由数据脚(A)输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则 ...

  5. 单片机(二):3个IO扩展n*8个IO,基于74hc595与74hc165的8x8矩阵键盘

    3个IO通过一片74hc595扩展8个输出IO,3个IO通过一片74hc1655扩展8个输入IO,最终成为8X8的矩阵键盘.对于普通的矩阵键盘,再加入防止鬼键.消抖和按下与松开识别. 一.74hc59 ...

  6. ADS1015使用指南及STM32驱动程序

    ADS1015使用指南及驱动程序 ADS1015使用指南 简介 ADS1015的引脚介绍 ADS1015的寄存器介绍 寄存器相关配置 驱动程序 ADS1015使用指南 由于网上关于TI公司的ADS10 ...

  7. 机器人通用底盘stm32源码

    基于STM32F4型号单片机,依据自拟机器人通用底盘协议,开发了STM32底盘驱动程序,供开源使用,使用时请标明原作者嵌入式小白Woods. 作者使用控制板 如需使用 私信作者提供链接(非利益相关方, ...

  8. TI MSP432P401R GY-906非接触式温度传感驱动程序

    2022年电赛马上到了,笔者和队友这几天做了一下2020年的F题,简易温度测量和身份口罩学习的一个题目,总体完成情况还算可以,配合OpenMv,能够通过4个按键(上.下.确认.返回)进行八个页面之间的 ...

  9. TMF8801激光测距芯片驱动程序

    TMF8801激光测距芯片驱动程序 一.芯片介绍 TMF8801是2019年艾迈斯半导体推出的用于测量直接飞行时间(dToF)距离的集成式模块,号称全球体积最小(表示怀疑,不过体积确实非常小).这个传 ...

  10. [原创]基于proteus仿真16*64点阵屏带DS1302实钟芯片

    注:本人大一新生,未学习电路,单片机,C语言,汇编均为自学内存,故难免有所疏露,希望大家多多指点. 该项目为惠州学院计算机系嵌入式培训班硬件组的任务(本人是电子系的,但还是加入了呵). 设计思路: 1 ...

最新文章

  1. Effective Java:对于全部对象都通用的方法
  2. 在Win7下建立新账户的方法
  3. 一份超级全面的PHP面试题
  4. amoeba高可用mysql_amoeba for mysql 使用说明
  5. flutter - 如何在 dart/flutter 中收听流值
  6. android findviewbyid定义成静态,findViewById 为null???
  7. QT 中QPainter绘制文字、图片
  8. 锁屏界面显示某些设置已隐藏_iOS 14 隐藏功能,只要轻点手机背面就能截屏
  9. lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描
  10. DNSPod揭6省断网重大事故内幕:网游私服恶斗
  11. 自定义 Cordova插件(基础篇)
  12. DFS ZOJ 1002/HDOJ 1045 Fire Net
  13. Unity使用MikuMikuDance
  14. Spark调优—参数调优
  15. 使用PowerGUI管理你的VMware ESX
  16. 无线路由器设置成交换机
  17. 服务器操作系统有哪些?
  18. 二维码条形码生成打印软件C#源码,根据变量自动添加抬头
  19. java se1.6配套Jdk,javase 1.6与jdk1.6
  20. 本地化翻译软件测试,本地化测试 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

热门文章

  1. catia 二次开发:环境变量路径,检查路径存在,关闭文件,对象为空,获取pad对象,err,part的product,全局变量,常量,SystemService,input,选择文件 时间,函数调用
  2. 请结合实例说明欧洲中世纪哥特式建筑的风格特点
  3. 02-03-JSP-Maven-会话-MySQL事务
  4. [业务流程图]与[数据流程图]的比较
  5. pdf文件怎么合并在一起
  6. 那些烦人的VC++库、win10中的VC++库(全部)
  7. Window10 开启卓越性能模式
  8. matlab中nnt,Matlab语言的Neural Network Toolbox 及其在同步中
  9. 树莓派(Raspberry Pi)安装五笔输入法,五笔拼音混合输入法
  10. Adobe Acrobat Pro DC拆分PDF