【51单片机】LED点阵屏(74HC595讲解)

🎊专栏【51单片机

🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。

🎆音乐分享【Waiting For Love

大一同学小吉,欢迎并且感谢大家指出我的问题🥰

目录

🍔74HC595图片

🍔74HC595原理

🍔”上升沿“是什么意思

🎆LED点阵屏显示图形 

🎈现象

 🎈代码(三部分)

main.c 

Delay.c

Delay.h

🎈代码分析

建议小白仔细阅读下面的内容


🍔74HC595有两种,一种是接高电平的,一种是接低电平的

下面进行讲解 

bb8e15babdf548b3a252ba4eb70e2aff.png 

🍔接高电平

714024fc56224458bb8af69b35be6dcb.png

🍔原理

给SERCLK这个上升沿移位给低电平(因为上电的时候默认是高电平):比如给SER输入一个值(第一个值是最高位),然后再给上升沿一位给高电平,进行移位,当给最到满了给上升沿锁存放置高电平,存放在右边,

QH’指的是多片级联,如果超过8位的时候就使用这个多片级联,这样就可以实现三位控制八位,十六位,三十二位等等这种,大大节省了io口,常常用于io口的扩展。


刚开始是空的,然后后面会从SER口传入数据 

9038b2af525d4012a5c7d54eb6938bdf.png

10c1a775d382449f8091c7087c3b47c8.png

RCLK有什么用呢 

看下图

f602d68d87b74369a9c7b657d070f786.png

就是把左边的复制到右边去,进行存储 

如果存满了,还从SER口传入数据 ,会怎么样呢

会从右边的QH',再开辟一个空间进行存储

74b21d9eec394d5e9f90a790d36b6b34.png

🍔”上升沿“是什么意思

在数字电路中,“上升沿”是指当一个数字信号由低电平变为高电平的瞬间。也就是说,在上升沿之前这个信号的电平始终是低电平,在上升沿之后这个信号的电平就变成了高电平。

与“上升沿”相对应的是“下降沿”,即当一个数字信号由高电平变为低电平的瞬间。在下降沿之前这个信号的电平始终是高电平,在下降沿之后这个信号的电平就变成了低电平。

在数字电路中,上升沿和下降沿通常被用作时序分析和时序控制的基础。比如,在移位寄存器中,时钟脉冲的上升沿通常被用来控制数据的向寄存器内部移动。当时钟脉冲发生上升沿时,数据就会被“锁存”到寄存器内部,然后在下一个时钟周期内再根据时钟脉冲的控制进行移位操作。 


 

🎆LED点阵屏显示图形 

🎈现象

83345b87750e4ba29b7d9ca3efc02570.jpeg

 🎈代码(三部分)

main.c 

#include <REGX52.H>
#include "Delay.h"

sbit RCK=P3^5;		//RCLK
sbit SCK=P3^6;		//SRCLK
sbit SER=P3^4;		//SER

#define MATRIX_LED_PORT		P0

/**
  * @brief  74HC595写入一个字节
  * @param  Byte 要写入的字节
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}

/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列,范围:0~7,0在最左边
  * @param  Data 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT=~(0x80>>Column);
	Delay(1);
	MATRIX_LED_PORT=0xFF;
}

void main()
{
	SCK=0;
	RCK=0;
	while(1)
	{
		MatrixLED_ShowColumn(0,0x3C);
		MatrixLED_ShowColumn(1,0x42);
		MatrixLED_ShowColumn(2,0xA9);
		MatrixLED_ShowColumn(3,0x85);
		MatrixLED_ShowColumn(4,0x85);
		MatrixLED_ShowColumn(5,0xA9);
		MatrixLED_ShowColumn(6,0x42);
		MatrixLED_ShowColumn(7,0x3C);
	}
}

Delay.c


void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

不明白这一段代码怎么写的同学建议看一下这一篇博客

【51单片机】使用STC烧录软件自动生成延时代码_在下小吉.的博客-CSDN博客

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

🎈代码分析

建议小白仔细阅读下面的内容

688b5c070299418fbca7f0fe7f090916.png

0d404789aff3416cbbe399905d153a72.png

73194f3e43ff43ea9b21257a2b4a8cb8.png

e3a880859e36497384f7415fb9915416.png

e21807c9a508457ebce7af8c9f972e62.png9f04a27d23534d9b8284d599b43814e4.png

0f1ca6917a1444fc9b260883a8657e91.png

4715f820e9b249699046fbfa41e412f9.png 


🍔接低电平 

39473f36728b4975878cff6d77dc6893.png

因为接的是低电平,所以和第一种情况刚好相反 

在上升沿之后这个信号的电平就变成了低电平(高电平 —>低电平)

所以

void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
    u8 a;

    🏳️‍🌈SRCLK = 1;
    🏳️‍🌈RCLK = 1;

    for(a=0;a<8;a++)         //发送8位数
    {
        SER = dat1 >> 7;         //从最高位开始发送
        dat1 <<= 1;

        🎈SRCLK = 0;             //发送时序
        _nop_();
        _nop_();
        🎈SRCLK = 1;    
    }

  

    🎊RCLK = 0;
    _nop_();
    _nop_();
    🎊RCLK = 1;
}
刚好相反

🍔现象 

61f64380980a4935bc9e67150a22538e.png

🍔连线 

1166db9372d547549a814a097ed4fcfd.jpeg

🍔代码例子以及分析

/**************************************************************************************
		              LED点阵--点亮一个点实验												  
实现现象:下载程序后,LED点阵左上角第一个点的LED被点亮果

			
注意事项:必须将74HC595模块的JP595短接片短接,否则不会出现现象																				  
***************************************************************************************/

#include "reg51.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

//--定义使用的IO口--//
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;


/*******************************************************************************
* 函 数 名         : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
* 函数功能		   : 通过595发送四个字节的数据
* 输    入         : dat1:第4个595输出数值
*                  * dat2: 第5个595输出数值
*                  * dat3:第2个595输出数值
*                  * dat4:第1个595输出数值
* 输    出         : 无
*******************************************************************************/
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
	u8 a;

	SRCLK = 1;
	RCLK = 1;

	for(a=0;a<8;a++)		 //发送8位数
	{
		SER = dat1 >> 7;		 //从最高位开始发送
		dat1 <<= 1;

		SRCLK = 0;			 //发送时序
		_nop_();
		_nop_();
		SRCLK = 1;	
	}

	for(a=0;a<8;a++)		 //发送8位数
	{
		SER = dat2 >> 7;		 //从最高位开始发送
		dat2 <<= 1;

		SRCLK = 0;			 //发送时序
		_nop_();
		_nop_();
		SRCLK = 1;	
	}

	for(a=0;a<8;a++)		 //发送8位数
	{
		SER = dat3 >> 7;		 //从最高位开始发送
		dat3 <<= 1;

		SRCLK = 0;			 //发送时序
		_nop_();
		_nop_();
		SRCLK = 1;	
	}

	for(a=0;a<8;a++)		 //发送8位数
	{
		SER = dat4 >> 7;		 //从最高位开始发送
		dat4 <<= 1;

		SRCLK = 0;			 //发送时序
		_nop_();
		_nop_();
		SRCLK = 1;	
	}

	RCLK = 0;
	_nop_();
	_nop_();
	RCLK = 1;
}


void main()
{	
	
	Hc595SendByte(0xff,0xfe,0x00,0x01);
	while(1)
	{
	
	}		
}

🍔注意

必须将74HC595模块的JP595短接片短接,否则不会出现现象    

就是下图的东西

d742b8f5365d481fa07de8dc086ecb93.png

 

    🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值