历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | STM32 74HC595驱动程序

发布者:Chunjie2022 来源: 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  驱动程序 引用地址:STM32 74HC595驱动程序

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

推荐阅读

11月6日,2018亚洲国际物流技术与运输系统展览会在上海新国际博览中心正式开幕,作为物流自动化的关键部分,物流搬运机器人自然必不可少,这次展会又有哪些新品来袭?一起去看看吧!新松新松此次发布了三款基于最新激光轮廓导航技术所架构的移动机器人产品,相关产品具有快速部署,灵活高效等特点,无需对环境进行二次改造。昆船昆船新型智能分拣AGV,采用...
ht1632c点阵模块STM32F103RC(mini)杜邦线工程代码:https://download.csdn.net/download/goolete/10922678驱动代码:https://download.csdn.net/download/goolete/10922879取模软件:https://download.csdn.net/download/goolete/10922876(取模软件用之前必须破解,否则生成为乱码,破解文件在压缩包里)HT1632C点阵模块使用手册V1.0:https://download.c...
  也许很多人都有这样的疑惑,接上电源时LED灯珠明明是好的,可是为什么使用数字万用表二极管档测量时,有的能亮,有的却不亮,为什么?  白光照明LED灯珠的工作电压比较高,一般3V左右,而且LED灯珠个体有差异,有的偏低、有的偏高,其工作电压一般2.6V~3.2V之间。  数字万用表二极管档的工作原理为采用输出约1mA的恒流源方式测量二极管,该恒流源...
广告摘要声明广告【文/石头】根据国家统计局最新公布的全国工业机器人产量数据显示,2021年9月工业机器人产量为29006套,同比增长19.05%;1-9月工业机器人累计产量为268694套,同比增长57.8%。后疫情时期,我国工业机器人应用市场实现了快速发展,作为工业机器人产业链上游的减速机市场需求规模也随之增长。高工机器人产业研究所(GGII)数据显示,2020年...

史海拾趣

问答坊 | AI 解惑

AD574构成高精度数字电压表

AD574A是美国模拟数字公司(Analog)推出的单片高速12位逐次比较型A/D转换器,内置双极性电路构成的混合集成转换显片,具有外接元件少,功耗低,精度高等特点,并且具有自动校零和自动极性转换功能,只需外接少量的阻容件即可构成一个完整的A/D ...…

查看全部问答∨

运算放大器交流参数和应用

运算放大器交流参数和应用…

查看全部问答∨

[板级测试标准] 寻求GSM和EVDO的板级测试方法

小弟请教各位一个问题:     在GSM或者EVDO模块在焊接到手机电路板上之前,据说需要经过一个板级测试,目的是保证线路正常以及GSM/EVDO模块的基本功能及性能是正常的。     据说这种板级测试是有行业标准的,不知各位有没有 ...…

查看全部问答∨

wince的多线程内存泄漏问题,请高手帮忙

按钮事件 void CleakerDlg::OnBnClickedButton1() {         HANDLE a = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadData, NULL, 0, NULL);           } 线程函数 void WINAPI ...…

查看全部问答∨

CAN总线问题

   我现在被CAN总线的通信问题绊倒了,有哪位路过明白的指导下呗,解决的会再加分哦    我现在研究串口转CAN模块与路由之间的无线通信:我通过PC机发送命令通过串口转CAN模块(两个)将数据发到路由器,路由器收到命令后天线 ...…

查看全部问答∨

home screen plugin如何部署到device上?

WM5,开发了一个home screen的plugin,生成了dll文件,我应该如何部署到device上呢? 在PPC上的today screen可以进行注册表修改,将plugin部署进去。 那么sp的home screen应该怎么做呢?…

查看全部问答∨

关于线程函数CreateThread中参数的问题

大哥大姐们好~!     我在EVC中,想用CreateThread()这个函数创建一个线程。我程序是这样字写的     hReadThread = CreateThread(0,0,ReadThread,this,0,&m_dwReadThreadID);     其中,hReadThread是HANDLE类 ...…

查看全部问答∨

急求68HC912DT128的合作

寻找68HC912DT128单片机的开发合作…

查看全部问答∨

基于STM32的噪声监测分析仪怎样实现

基于STM32的噪声监测分析仪,大致过程是这样的:噪声信号通过电容式话筒被采集,经过一步放大,再经AD转换就成为电信号,通过FFT就可以实现分析。只知道这些,不知道电容式话筒怎样和ARM板子联系,都需要什么工作,尽量具体点,新手,求各位大侠指 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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