使用f103控制74hc595级联LED矩阵的具体方法

一、元件清单

主控stm32f103c8t6核心板

74hc595移位寄存器

3mm方形蓝色LED灯珠

10*10双面喷锡洞洞板

触摸开关

mpu6050(未使用)

二、制作过程

        1.焊接LED立方体

直接上图 

79b380fa3d954e83bf0e9a153c01487a.jpg

648468c711a4462692783ea49cf3b9c8.jpg

最好买一个这样的模板方便焊接

将每一个灯珠的正极向右面掰弯,负极向前面掰弯,并且使正负极不在同一平面内

将灯珠在模板内摆放为矩形,使其每一行的正极相连,每一列的负极相连,从而做出一层的灯珠

检查每一层灯珠是否正常亮起

将每一层的正极向上弯折90°

将做好的每一层的正极对应焊接起来,最好找个人帮你举起来

用细铜棒焊接在正极上用于塑性,这一步与上一步是最关键的两步,关系到焊接出来的灯珠的美观程度

我的作品只是制作了两个这样的立方体

        2.焊接硬件电路

为了方便焊接,我将595芯片焊在了反面(最后发现焊在反面更难操作了,建议大家不要学我)

将所有的芯片的数据输入时钟线RCK,移位寄存器锁存时钟线SCK分别相连,

将上一级595的串行数据输出QH`与下一级的串行数据输入SI相连

手绘的草图,这样连接空间利用率高,但是对焊接操作要求非常高,不建议使用上图的连接方法

洞洞板背面

(如果使用stm32进行控制,则给595芯片3.3v的电压,使用51进行控制则给595芯片5v电压)

移位寄存器清零MR脚不能悬空,如果要使用这个引脚的话可以单独引出来,但是给595输入八个0也可以达到相同效果,因此我将它接到了3.3v

使出使能端OE接到gnd

        3.电源管理

使用升压充电一体板加锂电池的组合给系统供电

如果不使用锂电池也可以,找一根没用的usb线,剪断之后单独用充电宝供电

        4.驱动编写

void delay(uint16_t t);
 
/********  74HC595 GPIO 配置 *************************/
//
//
//
//
//
//

/***
 *74HC595 发送一个字节 
 *即往74HC595的DS引脚发送一个字节
 *SHCP即SCK
 *STCP即CLK
*/
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_nByte(u8 *data, u16 len)
{
	u8 i;
	for (i = 0; i < len; i ++ ) // len 个字节
	{
		HC595_Send_Byte(data[i]);
	}
	
	HC595_CS(); //先把所有字节发送完,再使能输出
}

/**
 *发送单个字节
 *便于级联时数据的发送
 *级联N级,就需要发送N个字节控制HC595
***/
void HC595_Send_Multi_Byte(u16 data)
{
	HC595_Send_Byte(data);	
	HC595_CS(); //先把所有字节发送完,再使能输出
}
 
void delay(uint16_t t)
{
	for (; t != 0; t --);
}

使用stm32gpio模拟595所需的三种信号

(模拟方案方便移植)

h文件

#ifndef __74HC595_H__
#define __74HC595_H__
#include "stm32f10x.h"  
 
#define SHCP_GPIO_PORT      GPIOC			              
#define SHCP_GPIO_CLK 	    RCC_APB2Periph_GPIOC		
#define SHCP_GPIO_PIN	    GPIO_Pin_14		       
 
#define STCP_GPIO_PORT      GPIOC		              
#define STCP_GPIO_CLK 	    RCC_APB2Periph_GPIOC		
#define STCP_GPIO_PIN	    GPIO_Pin_15		        
 
#define DS_GPIO_PORT        GPIOC			              
#define DS_GPIO_CLK 	    RCC_APB2Periph_GPIOC		
#define DS_GPIO_PIN	        GPIO_Pin_13	
 
#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_nByte(u8 *data, u16 len);
void HC595_Send_Multi_Byte(u8 data);
 
#endif

详细的代码效果放在这里

链接:https://pan.baidu.com/s/1mlRYudTzvNbe7Gi3ZLy57g?pwd=CCKT 
提取码:CCKT

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值