三、51单片机用74HC595控制LED点阵

1、LED点阵简介

1.1、什么是LED点阵

(1)外观

三、51单片机用74HC595控制LED点阵_第1张图片

(2)作用

LED点阵通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片等,LED点阵显示被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。

1.2、如何驱动LED点阵

以8*8LED点阵为例。

(1)单片机端口直接驱动。驱动8*8的点阵需要2个IO端口(16个IO口)。

(2)使用串转并移位锁存器驱动。如74HC595驱动,这种方式可以节约大量IO端口。

2、原理图

三、51单片机用74HC595控制LED点阵_第2张图片三、51单片机用74HC595控制LED点阵_第3张图片

 P595A接点阵COL(列) PIN(LED阴极),P595B接点阵ROW(行) PIN(LED阳极)。

3、74HC595芯片介绍

只是简略介绍,具体详细部分可结合数据手册和示例代码了解。

3.1、74HC595核心引脚

RCLK引脚:锁存时钟

SRCLK引脚:移位时钟

SER引脚:串行输入引脚

QA~QH引脚:并行输出引脚

QH`:串行输出口引脚,74HC595A的QH`输出引脚接74HC585B的SER串行输入引脚。

3.2、单片机与74HC595通信时序简介

(1)芯片与芯片之间进行通信,都是按照一定的时序进行的。

(2)时序就是芯片与芯片之间的通信引脚上电平变化,变化以时间轴为参考的变化顺序。

(3)时序是通信双方事先定义好的,通信的发送方必须按照时序来发送有意义的信息,通信的接收放按照时序去接收解析发送方发来的电平变化信息,然后就知道发送方要给接收方发送什么东西了。

(4)我们编程时:发送方是单片机,接收方是74HC595。因为595芯片本身不能编程,它的时序出厂时已经设定好了。因此单片机需要迁就595芯片,按照595线片的时序来给他发信息。

(5)74HC595芯片手册上有她的时序描述,参考描述便可明白595芯片的时序规则,然后将其用编程语言表述出来就是程序了。

(6)74HC595的时序关键是:SRCLK和RCLK。SRCLK是移位时钟,595芯片内部在每个SCLK的上升沿会对SER引脚进行一次采样输入,就向595内部输入了1位,如此循环8次就输入了8位二进制。RCLK是锁存时钟。

4、编程

4.1、编程点亮最上面一排

#include "reg52.h"

/*引脚位定义*/
sbit SER = P3^4;    		/*74HC595串行数据输入引脚*/
sbit RCLK_595 = P3^5;       /*74HC595的锁存时钟引脚*/
sbit SRCLK = P3^6;   		/*74HC595的移位时钟*/

 
void main(void)
{
	unsigned char i = 0;
	unsigned char P595A_OUT = 0x01;   // 接LED点阵行,阳级。
	unsigned char P595B_OUT = 0x00;   // 接LED点阵列,阴极。
	
	SER =0;
	RCLK_595 = 0;
	SRCLK = 0;
	
	for(i=0; i<8; i++)
	{
		SER = (P595A_OUT>>(7-i)) & 0x01;
		SRCLK = 0;
		SRCLK = 1;     // 上升沿进行一次数据移入
	}
	
	for(i=0; i<8; i++)
	{
		SER = (P595B_OUT>>(7-i)) & 0x01;
		SRCLK = 0;
		SRCLK = 1;     // 上升沿进行一次数据移入
	}
	RCLK_595 = 0;
	RCLK_595 = 1;    // 锁存时钟
	
	while(1)
	{
	
	
	}

}

注:keil中就算while循环中没有内容也需要嘉while,因为不加会导致程序跑飞,不断重启循环,导致结果与预期不符。

4.2、封装LED点阵显示函数

#include "reg52.h"


/*宏定义*/
#define uchar unsigned char


/*引脚位定义*/
sbit SER = P3^4;    		/*74HC595串行数据输入引脚*/
sbit RCLK_595 = P3^5;       /*74HC595的锁存时钟引脚*/
sbit SRCLK = P3^6;   		/*74HC595的移位时钟*/


/*函数声明*/
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT);   /*LEE点阵显示*/
 

void main(void)
{
	//LedLattice_Display(0x0f,0x00);   /*显示上面四行*/
	//LedLattice_Display(0xf0,0x00);   /*显示下面四行*/
	
	//LedLattice_Display(0xff,0xfe);   /*显示左边一列*/
	//LedLattice_Display(0xff,0x7f);   /*显示右边一列*/
	LedLattice_Display(0x01,0xfe);     /*点亮左上角一颗,0x01选择第一行,0x7f选择第一列*/
		 
	while(1)
	{
	
	}

}


/*
 *功能:LED点阵显示
 *参数:
 *	P595A_OUT:LED点阵行,阳极,最低为表示最上面一行  从上到下
 *	P595B_OUT:LED点阵列,阴极,最低位表示最左边一列  从左到右
 *返回值:无
 */
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT)
{
	unsigned char i = 0;
	//unsigned char P595A_OUT = 0x80;   // 接LED点阵行,阳级。
	//unsigned char P595B_OUT = 0x00;   // 接LED点阵列,阴极。
	
	SER =0;
	RCLK_595 = 0;
	SRCLK = 0;
	
	for(i=0; i<8; i++)
	{
		SER = (P595A_OUT>>(7-i)) & 0x01;
		SRCLK = 0;
		SRCLK = 1;     // 上升沿进行一次数据移入
	}
	
	for(i=0; i<8; i++)
	{
		SER = (P595B_OUT>>(7-i)) & 0x01;
		SRCLK = 0;
		SRCLK = 1;     // 上升沿进行一次数据移入
	}
	RCLK_595 = 0;
	RCLK_595 = 1;    // 锁存时钟

}

4.3、显示 “中” 字

(1)什么是字模

为了记录组成字的LED点阵亮灭信息,就是用取模软件生成这些信息。8*8的点阵一共64个点,一次需要64位二进制,即8个字节来记录这些信息。

(2)取模软件介绍。

三、51单片机用74HC595控制LED点阵_第4张图片

(3)取模方式

分为横向取模和纵向取模。

(4)代码。

在不熟练是可以先显示一行,在显示两行,找到规律后再用循环来进行显示。

#include "reg52.h"


/*宏定义*/
#define uchar unsigned char


/*引脚位定义*/
sbit SER = P3^4;    		/*74HC595串行数据输入引脚*/
sbit RCLK_595 = P3^5;       /*74HC595的锁存时钟引脚*/
sbit SRCLK = P3^6;   		/*74HC595的移位时钟*/


/*全局变量*/
uchar zhong[8] = {0x08,0x08,0x3E,0x2A,0x2A,0x3E,0x08,0x08};  /*横向取模*/


/*函数声明*/
void LedLattice_Display(uchar P595A_OUT, uchar P595B_OUT);   /*LEE点阵显示*/
 

void main(void)
{
	uchar i = 0;
		
	while(1)
	{
		for(i=0; i<8; i++)
		{
			LedLattice_Display(0x01<>(7-i)) & 0x01;
		SRCLK = 0;
		SRCLK = 1;     // 上升沿进行一次数据移入
	}
	
	for(i=0; i<8; i++)
	{
		SER = (P595B_OUT>>(7-i)) & 0x01;
		SRCLK = 0;
		SRCLK = 1;     // 上升沿进行一次数据移入
	}
	RCLK_595 = 0;
	RCLK_595 = 1;    // 锁存时钟

}

你可能感兴趣的:(51单片机_完,51单片机,单片机,嵌入式硬件)