74HC595级联电路编程篇(三) 您所在的位置:网站首页 74hc595级联程序范例 74HC595级联电路编程篇(三)

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

2023-06-29 20:15| 来源: 网络整理| 查看: 265

前面两篇文章已详细分析过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) //先传输高位,通过与运算判断第八是否为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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有