历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-09 来源:eefocus

以下为.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);

}

}


推荐阅读

史海拾趣

Aeroflex Metelics / Hi-Rel Components公司的发展小趣事

Aeroflex Metelics / Hi-Rel Components是一家专注于高可靠性电子组件的制造商,为航空航天、国防、医疗和工业等领域提供高性能的组件和解决方案。以下是该公司发展的五个相关故事:

  1. 公司成立和早期发展: Aeroflex Metelics / Hi-Rel Components的历史可以追溯到1960年代初,当时该公司作为Metelics的一部分,成立于美国马萨诸塞州的劳伦斯市。最初,公司主要生产用于微波和射频应用的二极管和其他电子元件,为国防和航空航天等行业提供关键的部件。

  2. 技术创新和产品多样化: Aeroflex Metelics / Hi-Rel Components致力于技术创新和产品多样化,不断推出符合行业标准和客户需求的新产品。公司的产品范围逐渐扩展,包括功率放大器、混频器、开关和整流器等,涵盖了广泛的应用领域。

  3. 质量管理和认证: 为确保产品质量和可靠性,Aeroflex Metelics / Hi-Rel Components严格执行质量管理体系,并获得了多项国际认证,如ISO 9001和AS9100。公司在生产过程中采用先进的工艺和测试技术,确保产品符合客户的高要求和严格标准。

  4. 全球供应链和市场拓展: 随着业务规模的扩大和市场需求的增长,Aeroflex Metelics / Hi-Rel Components不断优化全球供应链,并在美国和其他地区建立了多个生产基地和销售办事处。公司通过广泛的销售网络和服务体系,加强了对客户的支持和服务,并开拓了新的市场领域。

  5. 成为行业领先供应商: 多年来,Aeroflex Metelics / Hi-Rel Components凭借其卓越的技术、丰富的经验和优质的产品,成为航空航天、国防和医疗等行业的重要供应商之一。公司在高可靠性电子组件领域的领先地位得到了进一步巩固,为客户提供了高品质、可靠的解决方案,赢得了良好的声誉和市场地位。

Dae Ryung Electronic Co Ltd公司的发展小趣事

随着技术实力的增强,Dae Ryung Electronic Co Ltd公司开始积极拓展市场。公司制定了国际化战略,逐步进入国际市场。通过参加国际展会、与海外企业建立合作关系等方式,公司成功打开了海外市场的大门。同时,公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步提升了市场竞争力。

百蓉(ECE)公司的发展小趣事

面对智能制造的浪潮,百蓉公司积极拥抱变革。他们引进了先进的自动化设备,对生产线进行了全面升级,实现了从手工制造向智能制造的转变。这一转型不仅提高了生产效率,还大幅提升了产品质量和产品的一致性,使得百蓉的产品在市场上更具竞争力。

Ceratech Corporation公司的发展小趣事

随着电子行业的快速发展,对电感产品的需求也日益增长。Ceratech Corporation公司敏锐地捕捉到了这一市场机遇,决定拓展电感产品线。公司投入大量研发资源,成功开发出一系列新型电感产品,这些产品不仅性能优异,而且具有广泛的应用范围。通过不断拓展电感产品线,Ceratech Corporation进一步巩固了其在电子行业的地位。

Chemi-Con公司的发展小趣事

随着电子行业的快速发展,Chemi-Con公司不断加大对研发的投入,致力于技术创新和产品升级。公司研发团队在铝电解电容器的基础上,不断推出性能更优、体积更小、寿命更长的产品,满足了市场对于高效、可靠电容器的迫切需求。此外,Chemi-Con还积极拓展产品线,涉足了多层陶瓷电容器、薄膜电容器等多个领域,为客户提供更加丰富的选择。

EUPEC [eupec GmbH]公司的发展小趣事

面对未来市场的机遇和挑战,EUPEC制定了明确的发展战略。公司将继续加大技术创新和研发投入力度,推动电力半导体技术的进步和应用拓展。同时,EUPEC还将加强与国际知名企业的合作与交流,不断提升自身的竞争力和影响力。在应对市场变化和挑战的过程中,EUPEC将始终坚持以客户为中心的理念,为客户提供更优质的产品和服务。

请注意,以上故事是基于EUPEC公司的发展历程和相关信息进行概括和编写的,并非完全基于事实的直接叙述。如需更详细和准确的信息,请参考相关官方资料或新闻报道。

问答坊 | AI 解惑

资料下载---如何用ZIGBEE进行"定位"开发

GPS只能在室外定位,但若需要在室内实现定位功能怎么办呢?利用ZIGBEE技术实现定位就是一种不错的解决方案,同时该技术也可在室外实现定位。 资料下载-- http://www.wxlsoc.com/download/shows.aspx?id=28…

查看全部问答>

请问这个文件用什么软件打开啊

我想问问各位高手下面这个文件用什么软件能够打开?…

查看全部问答>

传输线和反射的经典文章

传输线和反射的经典文章…

查看全部问答>

请教windows mobile 中文开发环境搭建步骤

如题,我用的是vs 2005, 请教高手们如何搭建中文的 mobile开发环境,多谢指教。…

查看全部问答>

求教:如何查看skype for ppc 依赖哪些库文件啊

求教各位高手,我现在想让skype在wince 5.0 上跑起来 ,我在网上看到说要找到skype for ppc 依赖哪些库文件  ,请问如何察看阿  , 我用vc下depends 和evc下depends 察看的  ,怎么出来的都是windows XP 下的库文件 ...…

查看全部问答>

退出程序,不能关闭进程

WINCE 6.0, VS2005 程序是一个任务管理器,几个对话框,主要操作是CTabCtrl加载几个对话框,(对话框由dialog create),在几个dialog中分别做的是1.每隔一段时间获得CPU和内存的状态,画图 2.获得当前运行的进程,显示于列表中 3.获得当前可见的 ...…

查看全部问答>

新手帖 单片机控制CPLD读取SRAM

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity read_write is port( clk : in std_logic ;       mcu_oe    : in    std_logic;        ...…

查看全部问答>

电磁场屏蔽的机理 续

与前面已讲述的电场屏蔽及磁场屏蔽的机理不同,电磁屏 蔽对于电磁波的衰减有三种不同的机理: x 当电磁波在到达屏蔽体表面时,由于空气与金属的交界面上 阻抗的不连续,对入射波产生的反射。这种反射不要求屏蔽 材料必须有一定厚度,只要求交界 ...…

查看全部问答>

介绍一下KEIL C51所支持的C语言和汇编语言混合编程的方法!

     51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。在嵌入 ...…

查看全部问答>