08:LED点阵

LED点阵

  • 1、什么是LED点阵
  • 2、如何驱动LED点整
  • 3、原理图分析
  • 4、74HC595的接法分析
  • 5、74HC595芯片分析
  • 6、编程实践(全屏点亮)

1、什么是LED点阵

08:LED点阵_第1张图片
如图为16x16的LED点阵,每一个点里面都有一个LED灯

08:LED点阵_第2张图片

上图为一个8x8点阵LED原理图(横向为正极,纵向为负极);点阵的优势就是8+8个IO口独立控制8*8个LED亮灭。

2、如何驱动LED点整

(1)单片机端口直接驱动:
要驱动8x8的点阵需要2个IO端口(16个IO口)、要驱动16x16的点阵需要4个IO端口(32个IO口)。
(2)使用串转并移位锁存器(74HC595)驱动:
08:LED点阵_第3张图片
从SER端口串行输入一个8位二进制,然后通过QA~QH并行输出(同时输出)。
所以要驱动16x16点阵只需要4个74HC495和4个IO口。但是实际上只需要3个IO口即可(数据口、SCLK、RCLK),因为595里面还有一个QH’端口(串行输出口),这样就可以把4个595 级联起来。

3、原理图分析

08:LED点阵_第4张图片

如图每一个8x8的点整都有POS和NEG;
(1)POS就是Positive正极,NEG是negetive负极。
由图得:图中2个74HC595(CD,下面为C,上面为D)的输出端口都接NEG1~16负极。那么正极如何接喃?

08:LED点阵_第5张图片

4、74HC595的接法分析

所以J17端口(POS1~8)正极连接到P595A,J18端口连接P595B。连接如下图:

08:LED点阵_第6张图片

(1)QA-QH8路并行输出接到点阵的一个端口
(2)QH’串行输出口接下一个74HC595的串行输入SER(串联顺序按照ABCD)
(3)SER串行输入接:第一个595的SER通过跳线帽JP595接P3.4,后面的每一个SER接前一个的QH’。这样就构成了ABCD4个595芯片依次串联。所以将来编程时整个4个74HC595的串行数据都是从P3.4出来的(一共由32位)。
(4)SCLK (SRCLK)接P3.6
(5)RCLK接P3.5
总结:
(1)SCLK和RCLK是一样的接法,都在接在P3.5和P3.6上。
(2)总共涉及到的IO口有3个:P3.4、P3.5、P3.6
(3外部接线重点:2个8片杜邦线+1个跳线帽

5、74HC595芯片分析

(1)芯片与芯片之间的通信,都是按照一定的时序进行的。
(2)时序就是芯片与芯片之间的通信引脚上电平变化以时间轴为参考的变化顺序
(3)时序是通信双方事先定义好的,通信的发送方必须按照时序来发送有意义的信息,通信的接收放按照时序去接收解析发送方发来的电平变化信息,然后就知道发送方要给我发送什么东西了。
(4)我们编程时:发送方是单片机,接收方是74HC595。因为595芯片本身是不能编程的,他的时序芯片出厂时已经设定好了。因此我们单片机必须迁就595芯片,按照595芯片的时序来给他发信息。
(5)所以我们要先搞清楚74HC595的时序规则。595的芯片手册上就有它的时序描述(时序图),参考描述就可以明白595芯片的时序规则,然后将其用编程语言表述出来就是程序了。
(6)74HC595的时序关键是:SCLK和RCLK。SCLK是移位时钟,595芯片内部在每个SCLK的上升沿会对SER引脚进行一次采样输入,就向595内部输入了1位,如此循环8次就输入了8位二进制。RCLK是锁存时钟,QA-QH的8位并行输出信号在RCLK的上升沿进行一次锁存更新。

【注】小知识
sbit定义位变量
(1)之前编程都是直接操作一个IO端口,可以用端口名(P0、P1)来整体操作一个IO端口中的8个引脚。但是这种方法不能操控单独1个IO口。
(2)今天编程需要单独操作1个IO引脚,譬如要操作P3.4,但是直接写P3.4的话语言是不认识的,而必须使用sbit关键字来定义一个引脚。

sbit SER =P3^4 ;

6、编程实践(全屏点亮)

#include 

sbit SER =  P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟


void main (void)
{
		unsigned char i,d1,d2,d3,d4;
		
		d1 = 0;
		d2 = 0;
		d3 = 0XFF;//全为高电平
		d4 = 0XFF;//全为高电平
		
		RCLK = 0;
		SCLK = 0;
		
		for(i=0 ;i<=7 ;i++)
		{
			SER = d1 >> 7; //将d1的最高位赋值给SER
			SCLK = 0;
			SCLK = 1; //对SER引脚进行一次采样
			d1 = d1 << 1; //将d1的次高位移到最高位
		}
		//至此已经在8个SCLK上升沿把dl的8位依次全部发出去了
		//但是还没有进行锁存,所以QA-QH还没东西

		for(i=0 ;i<=7 ;i++)
		{
			SER = d2 >> 7;
			SCLK = 0;
			SCLK = 1;
			d2 = d2 << 1;
		}
		//至此已经把d1和d2都发出去了,并且d1已经被d2挤到第2个595芯片里面去了

		for(i=0 ;i<=7 ;i++)
		{
			SER = d3 >> 7;
			SCLK = 0;
			SCLK = 1;
			d3 = d3 << 1;
		}
		//至此已经把d1、d2、d3都发出去了,并且d1已经被d2、d3挤到第3个595芯片里面去了

		for(i=0 ;i<=7 ;i++)
		{
			SER = d4 >> 7;
			SCLK = 0;
			SCLK = 1;
			d4 = d4 << 1;
		}
		//至此已经把d1、d2、d3、d4都发出去了,并且d1已经被d2、d3、d4挤到第4个595芯片里面去了

		RCLK = 0;
		RCLK = 1; //进行锁存,全部并行同一时间输出
		
		//按照我们写的程序,d1和d2是负极,d3和d4是正极。

}

结果展示:

08:LED点阵_第7张图片
利用函数进行代码改进:

#include 

sbit SER =  P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟

void shixu (unsigned char d)
{
	unsigned char i;
	
	for(i=0 ;i<=7 ;i++)
		{
			SER = d >> 7; //将d的最高位赋值给SER
			SCLK = 0;
			SCLK = 1; //对SER引脚进行一次采样
			d = d << 1; //将d的次高位移到最高位
		}
}
//时序代码

void main (void)
{
		unsigned char d1,d2,d3,d4;
		
		d1 = 0;
		d2 = 0;
		d3 = 0XFF;
		d4 = 0XFF;
		
		RCLK = 0;
		SCLK = 0;
		
		shixu(d1);
		shixu(d2);
		shixu(d3);
  	    shixu(d4);	

		RCLK = 0;
		RCLK = 1; //进行锁存,全部并行同一时间输出
		
		//按照我们写的程序,d1和d2是负极,d3和d4是正极。

}

你可能感兴趣的:(第一季51单片机,单片机,嵌入式硬件,c语言)