74HC595级联电路编程篇(三)

article/2025/11/9 18:11:57

前面两篇文章已详细分析过74HC595的工作原理,接下来讲下用stm32去驱动两片74HC595控制16个LED实现流水灯效果。

这篇的代码是用IO模拟74HC595时序驱动的,下一篇文章,我们介绍下如何用SPI来驱动。直接贴上代码分析,代码很简单,每个语句的注释都说得很清楚了。。。。。。

 

开发平台:MDK5.14

MCU:STM32F103ZET6

 

74HC595头文件

 

#ifndef __595_H
#define	__595_H#include "stm32f10x.h"#define SHCP_GPIO_PORT      GPIOB			              
#define SHCP_GPIO_CLK 	    RCC_APB2Periph_GPIOB		
#define SHCP_GPIO_PIN	    GPIO_Pin_13			       #define STCP_GPIO_PORT      GPIOB			              
#define STCP_GPIO_CLK 	    RCC_APB2Periph_GPIOB		
#define STCP_GPIO_PIN	    GPIO_Pin_12			        #define DS_GPIO_PORT        GPIOB			              
#define DS_GPIO_CLK 	    RCC_APB2Periph_GPIOB		
#define DS_GPIO_PIN	    GPIO_Pin_15	#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 

 

74HC595驱动程序,说白了就是往74HC595发送数据

#include "595.h"  
#include "spi.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_2MHz;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(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 --);
}

主函数

#include "stm32f10x.h"   
//#include "spi.h"
#include "595.h"
#include "SysTick.h"u8 pos; // led位置
u8 Led_Pos_Buf[2] = {0x00, 0x00}; //存储要发送的指令字节//第pos个led亮:1     2    3      4    5     6     7     8
u8 Led[32] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, //控制第二级74HC5950x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //第一级的led全灭0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //第二级的led全灭0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};//控制第一级74HC595								int main(void)
{//	SPI_Config();HC595_GPIO_Config();SysTick_Init();while(1){for (pos = 0; pos < 16; pos ++) //第pos个灯,实现流水灯效果{SysTick_Delay_Ms(500);  //延时500毫秒Led_Pos_Buf[1] = Led[pos];//存放第一级74HC595数据,因为先进先出,所以第一级放在Led_Pos_Buf[1],而不是Led_Pos_Buf[0]Led_Pos_Buf[0] = Led[pos+16]; //存放第二级74HC595的数据HC595_Send_Multi_Byte(Led_Pos_Buf,2);//将当前数据发送到595}}
}

 

用洞洞板焊接了块实验板,成功做出了流水灯的效果。

 

太晚,洗洗睡吧,明天接着再写SPI驱动的文章。


http://chatgpt.dhexx.cn/article/Yos1VWOk.shtml

相关文章

51单片机——74HC595的应用(SPI实践)

目录 SPI总线 SPI总线概述 SPI总线分类 SPI 优点及缺点 SPI接口硬件原理 SPI四种工作模式 74HC595应用 74HC595芯片概述 74HC595封装及管脚功能 74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现 Proteus运行结构示意图 SPI总线 SPI总线概述 SPI&#…

74HC595介绍

74HC595介绍 介绍引脚介绍寄存器与数据移位寄存器存储寄存器时序图 介绍 74HC595是一个8位串行输入、并行输出的位移缓存器&#xff1a;并行输出为三态输出。在SCK 的上升沿&#xff0c;串行数据由SDL输入到内部的8位位移缓存器&#xff0c;并由Q7’输出&#xff0c;而并行输出…

【龙芯1B】:74HC595数码管或74HC138数码管程序开发

学习目标&#xff1a;解决龙芯1B&#xff1a;74HC595或74HC138数码管显示问题 首先我们要知道数码管的原理&#xff1b;以74HC595为例&#xff0c;74HC595是具有三态输出功能&#xff08;即具有高电平、低电平和高阻抗三种输出状态&#xff09;的门电路。输出寄存器可以直接清除…

【74HC595芯片】核心驱动代码

介绍 74HC595是一个8位串行输入、并行输出的位移缓存器&#xff1a;并行输出为三态输出。 在SCK 的上升沿&#xff0c;串行数据由SDL输入到内部的8位位移缓存器&#xff0c;并由Q7’输出&#xff0c;而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存…

MSP430G2553 HC595 数码管 SPI 显示 时分秒

// Timer A0 interrupt service routine #pragma vectorTIMER0_A0_VECTOR __interrupt void Timer_A(void) {t_count (t_count 1) % 500; //500次2ms就是1sif (t_count 1){rtc_sec;if (rtc_sec 60){rtc_sec 0;rtc_min;if (rtc_min 60){rtc_min 0;rtc_hour;if (rtc…

嵌入式开发--IO口扩展--74HC595

嵌入式开发–IO口扩展&#xff0c;输出引脚 嵌入式开发经常遇到IO口不够的情况&#xff0c;更换引脚更多的单片机是一种选择&#xff0c;但最近两年单片机的价格翻着跟斗的往上涨&#xff0c;替代方便也有&#xff0c;就是通过IO口扩展芯片来实现。 本段说明摘自明微电子的说…

STM32+74HC595:带领你10分钟用对74HC595

使用的是STM32CBT8&#xff0c;小模块用起来性价比超级高&#xff0c;资源丰富&#xff0c;移植u/COS及HTTP、MQTT协议等等用起来简直欲罢不能&#xff0c;摇摇欲仙&#xff01; BUT&#xff1a;IO口资源太少了&#xff0c;我想让你驱动100个LED&#xff0c;你缺告诉我&#x…

74HC595芯片实现原理及跑马灯数码管应用程序-----day2

74HC595芯片应用-----day2 1.CMOS移位寄存器–74HC595 可串行输出控制下一级级联芯片。![在这里插入图片描述](https://img-blog.csdnimg.cn/2facff61a1d948d4a7c ![在这里插入图片描述](https://img-blog.csdnimg.cn/79b3b2b43dcc4b91ae4ec2c986149990.png 基础概念&#xff1…

【STM32学习】(14)两个74HC595控制四个数码管显示

74HC595是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号&#xff0c;常用在各种数码管以及点阵屏的驱动芯片&#xff0c; 使用74HC595可以节约单片机mcu的io口资源&#xff0c;用3个io就可以控制8个数码管的引脚&#xff0c;他还具有一定的驱动能力&…

基于STM32单片机的流水灯控制-74HC595

基于STM32单片机的流水灯控制-74HC595 冰果派-棉花糖V1.0开发板 文章目录 基于STM32单片机的流水灯控制-74HC595冰果派-棉花糖V1.0开发板[toc] 一 任务二 硬件电路如何设计1. IO口不够用2.74HC595D 三 程序怎么编写1.单片机怎么把数据给5952.写程序&#xff08;595驱动&#x…

STM32+74HC595

74HC595功能是将串行数据&#xff08;由SHCP\CLK、DS\DATA输入串行数据&#xff09;转换并行数据&#xff08;芯片上的QA~QH八个数据输出口&#xff09;; 具体工作方式是&#xff1a;由CLK提供时钟&#xff0c;DATA输入高低电平&#xff08;数据&#xff09;&#xff0c;CLK每…

74HC595的使用

介绍 74HC595是一个8位串行输入、并行输出的位移缓存器&#xff1a;并行输出为三态输出。在SCK 的上升沿&#xff0c;串行数据由SDL输入到内部的8位位移缓存器&#xff0c;并由Q7’输出&#xff0c;而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器…

stm32驱动hc595

根据网上资料&#xff1a; 595具体使用的步骤:第一步&#xff1a;目的&#xff1a;将要准备输入的位数据移入74HC595数据输入端上。方法&#xff1a;送位数据到_595。第二步&#xff1a;目的&#xff1a;将位数据逐位移入74HC595&#xff0c;即数据串入方法&#xff1a;SH产生一…

STM32实现74HC595控制

一、前言 本文主要是实出74HC595的简单控制功能实现&#xff08;学习笔记整理&#xff09;。 二、概述 &#xff08;一&#xff09;74HC595简述 74HC595是一个8位串行输入、平行输出的位移缓存器&#xff1a;平台行输出为三态输出。 在SCHCP的上升沿输入&#xff0c;在STCP的…

STM32学习记录——74HC595四位数码管显示

数模管作为STM32的一个重要外设&#xff0c;由于其成本低、稳定&#xff0c;被用于许多场景中。本篇文章来介绍下四位数码管的使用方法。 数码管显示 一、数码管的分类二、74HC595芯片&#xff08;串入并出&#xff09;三、原理图四、代码主要操作五、代码分析1.void HC595_GPI…

【74HC595】STM32 74HC595驱动程序

以下为.h文件&#xff1a; #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 #defin…

RK3588+FPGA+Cameralink高速相机解决方案

1. 视频接入&#xff0c;其中可见使用LVDS&#xff0c;红外使用cameralink 2. H264低倍率压缩编码本地存储 3. H264压缩使用同步422接口或者网口UDP协议输出实时码流 4. 使用串口进行通讯&#xff0c;进行类似于可见、红外或者激光器或者地面控制软件等之间的通讯 5. 使用网…

【芯片使用】74HCHC595

实验平台&#xff1a;普中A2开发板&#xff0c;STC89C51RC芯片&#xff0c;11.0592M晶振。 文章目录 前言一、代码1.main.c2.HC595.c2.HC595.h 总结 前言 74HC595是一个8位串行输入、并行输出的位移缓存器&#xff1a;并行输出为三态输出。在SCK 的上升沿&#xff0c;串行数据…

HC595驱动数码管

74HC595是一个8位串行输入、并行输出的位移缓存器 引脚定义 Q0~Q7&#xff1a;并行输出 Q7’&#xff1a;串行输出 SH_CP&#xff1a;移位寄存器时钟输入 ST_CP&#xff1a;存储寄存器时钟输入 DS&#xff1a;串行输入 原理图 举例 共阴极数码管控制 #define uchar unsign…

保护手机号码不被应用窃取的有力措施

在使用手机过程中&#xff0c;经常遇到很多应用软件私自获取我们的手机号码并传播出去&#xff0c;导致我们手机经常接到很多莫名其妙的电话。 我们今天分享一种能够彻底屏蔽手机号码被非法获取的有效非法&#xff0c;也就是使用琢石模拟器对手机号码进行模拟&#xff0c;让应用…