【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记

使用74HC595芯片驱动LED点阵屏的使用笔记

  • 1、控制显示LED点阵屏的思路
  • 2、74HC595芯片的学习
    • 2.1、74HC595芯片是什么?
    • 2.2、74HC595芯片各引脚解释以及分析
    • 2.3、74HC595芯片工作原理
    • 2.4、74HC595模块接线
    • 2.5、74HC595对应的代码:
  • 3、51单片机上使用LED点阵屏
  • 4、遇到问题(正在更新)
  • 5、参考文章
  • 6、第一次写博客杂感

纯小白写的文章,如有问题,欢迎评论区讨论,反驳,指正。
如果你只想了解74HC595如何使用,建议只看2.3。

1、控制显示LED点阵屏的思路

通过查看普中A2开发板的原理图(图1)可以知道,通过P0(P0_0、P0_1…P0_7)口和DPa、DPb…DPh来控制哪一颗LED点亮。我这个开发板上的点阵模块没有按照他给的原理图上的方向来放,根据我的测试,我的LED点阵模块应该是他给的模块逆时针旋转180°的方向,如图2所示。
举个例子:如果我想让第三行第四列的灯被点亮,那么我需要给DPc通高电平(1),给P0_4通低电平(0),即可让目标灯点亮。

图1 普中A2开发板中LED点阵原理图:【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第1张图片
图2 更改后的LED点阵原理图:
【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第2张图片
思路有了,那我们现在来看看怎么控制DPa、DPb…DPh和P0_0、P0_1…P0_7输入,P0口比较容易,这里就不做讲解。通过原理图可知,通过74HC595芯片来控制DPa、DPb…DPh的输入(图3),所以我们的问题就变成了如可去控制74HC595芯片,那下面就重点对74HC595芯片进行学习。

图3 74HC595(串转并)模块:
【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第3张图片

2、74HC595芯片的学习

2.1、74HC595芯片是什么?

我认为74HC595芯片是用三个输入端去控制N个输出端的芯片,同时让输出端一次性进行N个信号输出。我们这里只需要同时输出八个信号即可,如果想输出十六个、二十四个等等,那么就需要拓展74HC595(就是再接几块这样的芯片,一块能输出八个,需要多少个就外接多少个)。
如果理解困难的话,建议就把它认为成3个IO的输入去控制N个IO的输出即可。

2.2、74HC595芯片各引脚解释以及分析

在原理图中可以看到有带上划线的OE(不会打那个符号,下文简称为-OE-),RCLK,带上划线的SRCLR(下文简称-SRCLR-) ,SRCLK,SER,GND,VCC,QA,QB…QH,QH`。

-OE-:较为正式的叫法是“输出使能控制脚”,也就是使能按键。我理解的使能是,如字面意思,“使”谁“能”干什么,这里就可以理解为使74HC595能工作。因为带了个上划线,所以当给这个引脚通低电位的时候,那就是可以开始工作。
RCLK:较为正式的叫法是“锁存寄存器时钟”。其我理解的意思就是将要输出的数据给锁定起来,并且从实际功能上可以发现,当这里给到1后,会将数据输出出去,输出给QA,QB…QH。一般简写为”RCK“。
-SRCLR-:较为正式的叫法是“移位寄存器清零管脚”。我的理解是当给这里输入低电平时,它会将移位寄存器进行清零,因为原理图上给它直接通了高电位,我不知道怎么改,所以并没有测试出它的具体效果。
SRCLK:较为正式的叫法是”移位寄存器时钟,上升沿移位”。我的理解是将已经输入的数据进行移位,给即将准备输入的数据腾位置,让新的数据能够放进来。一般简写为”SCK“。
SER:较为正式的叫法是“串行输出端”。我的理解是就是即将要输入的数据,也就是要被储存起来的0或1。
GND:这个都肯定知道,逻辑地。
VCC:这个就是逻辑电源。
QA,QB…QH:较为正式的叫法是“并行数据输出端”,这个就是对应的输出,就是一次性将8位数据并行输出的。
QH’:可通过这里去拓展输出,需要输出多少位就外接8的倍数个。比如我需要输出24位,那我这一块本来就能输出8位,只需要再外接两块,加起来就是输出24位,具体怎么外扩,我没有工具,没有测试过,但从网上收集到的资料来看,只要将它们的RCLK、SRCLK、SER接起来即可。

单看以上这么多参数不是很好理解,那就举个例子,让上面这些数据能够连起来去理解。
我们用霰弹枪来举例,如果我们一把霰弹枪能够一次性打出八颗子弹(这里不是指一次性打出来八颗弹珠,而是一梭子就是八颗子弹,在不重新装弹的情况能够一次性打出八颗子弹),我们使用这把霰弹枪之前,需要先将保险丝打开,也就是将使能-OE-接地,使它能够被使用;接着就是给枪里装子弹,我们需要给霰弹枪弹舱一次装入一颗子弹,也就是对应的SER=0或1,然后再装下一颗,在装下一颗的时候,我们需要将上一颗子弹压入,这个压入的动作其实就对应我们的SCK,装载够八颗的时候,我们就可以发射了,按下扳机(就是RCK=1),枪响,子弹出膛,第一次射出也就是对应的QH,第二次就是QF,第三次…,八次射击完成,也就是数据发送完毕。如果一杆枪不够用的话,就是用工具将两杆枪连到一起,这里的工具就是QH‘,由于我没用过,所以下面不再举例。
这个例子是从别人的文章里学的,我给他完善了一下,又加入了我的理解,感觉还可以,原例子来自:https://blog.csdn.net/weixin_41445387/article/details/80500046

2.3、74HC595芯片工作原理

我感觉工作原理还是得配图来理解才可以,所以我们下面直接用图来看吧,见图4。
图4 74HC595芯片工作原理流程图:
【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第4张图片
其实我感觉上面这张图讲的挺详细的。

2.4、74HC595模块接线

通过图3可知,如果想让74HC595工作,那么就需要将OE接地,那么对应J24就应该如图5连接:
图5
【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第5张图片

2.5、74HC595对应的代码:

#include 
#include 

sbit SCK = P3^6;	//移位
sbit RCK = P3^5;	//输出
sbit SER = P3^4;	//输入

/**
  *@effect: 这个方法一次将给到的Byte输出给被控制端
  *@Byte: 要传出的8位数据
  *@return: 无
**/
void send74HC595Byte(char Byte) 
{
	char i ;
	for (i = 0;i < 8;i++)
	{
		SER = Byte>>7;	//输入给74HC595
		Byte = Byte<<1; //这两行代码可以从左向右去拿数据。如果输入的是1001 0110,那么第一次循环就会
						//拿到1,第二次就会拿到0,第三次0,第四次1...
		SCK = 1; //移位
		_nop_();
		_nop_(); //两个振荡(机器)周期,等下移位这个动作
		SCK = 0; //结束移位
	}
	RCK = 1; //将数据输出
	_nop_();
	_nop_(); //两个振荡(机器)周期,等下输出这个动作
	RCK = 0; //结束数据输出
}

3、51单片机上使用LED点阵屏

到此我们已经能够控制点阵屏上任意一盏灯的亮灭了,那么就简单的在单片机上显示个字母R吧。

根据图(图6)可知,亮标点的灯即可,那么程序如下:
图6
【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第6张图片
对应程序:

//LED点阵屏显示图形

//在LED点阵屏上显示字母R
//这里的具体知识我写在了博客上,见链接:
//

#include 
#include 
#include 

sbit SCK = P3^6;	//移位
sbit RCK = P3^5;	//输出
sbit SER = P3^4;	//输入

/**
  *@effect: 这个方法一次将给到的Byte输出给被控制端
  *@Byte: 要传出的8位数据
  *@return: 无
**/
void send74HC595Byte(char Byte) 
{
	char i ;
	for (i = 0;i < 8;i++)
	{
		SER = Byte>>7;	//输入给74HC595
		Byte = Byte<<1; //这两行代码可以从左向右去拿数据。如果输入的是1001 0110,那么第一次循环就会拿到1,第二
										//次就会拿到0,第三次0,第四次1...
		SCK = 1; //移位
		_nop_();
		_nop_(); //两个振荡(机器)周期,等下移位这个动作
		SCK = 0; //结束移位
	}
	RCK = 1; //将数据输出
	_nop_();
	_nop_(); //两个振荡(机器)周期,等下输出这个动作
	RCK = 0; //结束数据输出
	P0 = 0xff; //将P0口置为0,防止下次操作时,点亮整排灯
}

void main()
{	
	while(2>1)
	{
		send74HC595Byte(0xff);
		P0_5 = 0;
		send74HC595Byte(0x98);
		P0_4 = 0;
		send74HC595Byte(0x94);
		P0_3 = 0;
		send74HC595Byte(0x92);
		P0_2 = 0;
		send74HC595Byte(0x61);
		P0_1 = 0;
	}
}

效果见图7。
图7:

【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记_第7张图片

4、遇到问题(正在更新)

5、参考文章

CSDN:
①https://blog.csdn.net/weixin_41445387/article/details/80500046
②https://blog.csdn.net/qq_51523386/article/details/114282584
③https://blog.csdn.net/qlexcel/article/details/117159467
B站:
①https://www.bilibili.com/video/BV1Mb411e7re?p=21 (这个老师讲的特别好,强烈建议看一看他讲的这块,链接粘贴进去就是那个视频(9-1,9-2))

6、第一次写博客杂感

大早上起来在翻74HC595的使用方法的时候,脑子一热,不如我自己总结个,再写一篇,虽知道这一写就是一整天,从早上弄到吃晚饭,甚至遇到问题的模块还没写(遇到的问题有点迷糊,还不能完美解决,所以没写出来)。
我看好多文章都谈到了“时序”,因为我是刚开始接触这些东西,所以时序图我并不懂(以前是纯机械的,所以数电模电,信号没学过),我就没往上加,哪位大神如果知道时序图怎么看,怎么学的话,我希望能私信我,给我些建议,要是大神太忙就算了,毕竟一个人的时间、精力就那么多嘛,哈哈。
码了一天,码了4500字,这比写论文还累啊,就为了把74HC595模块为了搞的比较明白,花了三四天的时间,有点小痛苦,哈哈,但回过头来看还是挺值的。

你可能感兴趣的:(51单片机,单片机,嵌入式硬件,c语言,学习方法)