51单片机实操(8*8LED点阵屏静态显示爱心)(8*8LED点阵屏动态显示hello!)

1.LED点阵屏介绍

LED点阵屏由独立的LED组成,一般有8*8,16*18,LED以矩阵形式排列。

2.LED屏显示原理

LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已

LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同

LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

该实验数码管先确定列,再确定行。每一列是共阴接法,每一行是共阳接法。

3.74HC595串行移位寄存器

在开始实验之前,我们先介绍一下74HC595的bit流如果流向LED点阵屏。

当我们开始向74HC595写人1个字节,1字节相当于8bit.

具体步骤:1.SER置1,8个数据排好队依次移动位置。

                  2.SERCLK上升沿置1。bit流开始流动,bit流开始从高位向低位移动。

                  3.SERCLK上升沿置0。bit流动结束清0。

                  4.RCLK置1。当8Bit数据流占满位置时(一字节流动到位置后上升沿锁存)  

                  5.RCLK置0。把8位数据送到IO口。

                   

从上图我们可以看出,74HC595的QA-QH端口连接的是LED点阵屏的D0-D7。

4.LED点阵静态显示爱心

4.1delay.c

void Delay(unsigned char xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
	i = 195;
	j = 138;
	do
	{
		while (--j);
	} while (--i);
	xms--;
}
}

4.2delay.h

#ifndef  __DELAY_H__
#define  __DELAY_H__

void Delay(unsigned char xms);

#endif

4.3main函数

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

//74HC595特殊寄存器端口配置
sbit RCK=P3^5;//RCLK
sbit SCK=P3^6;//SRCLK  所有IO口初始化以后都是高电平,因此主程序中要置0
sbit SER=P3^4;//SER  74H595配置

//作用:74HC595写入一个字节(循环写入8个字节)
//参数:要写入的字节
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);//向右移位 8个数据排好队依次移动位置
		SCK=1;//上升沿置1,bit流开始流动
		SCK=0;//上升沿置1结束后要置0
	}
	RCK=1;//一字节流动到位置后上升沿锁存
	RCK=0;//锁存后置0
}//把8位数据送到IO口


//LED屏依次显示一列数据
//参数:list要选中的列:0-7,0在最左边
//参数  Data选择列显示的数据,高位在上,1为亮,0为灭

void MatrixLED_ShowColumn(unsigned char list,Data)  
	
{
	_74HC595_WriteByte(Data);
	P0=~(0x80>>list);//列选
	Delay(0);//位延迟
	P0=0xFF;//位清0;

//	if(list==0)(P0=~0X80);//取反后结果是0111 1111 第一列数码管亮
//	if(list==1)(P0=~0X40);
//	if(list==2)(P0=~0X20);
//	if(list==3)(P0=~0X10);
//	if(list==4)(P0=~0X08);
//	if(list==5)(P0=~0X04);
//	if(list==6)(P0=~0X02);
//	if(list==7)(P0=~0X01);
	
}


void main()
{
	SCK=0;//上升沿移位 一上电就要把它赋值为0
	RCK=0;//上升沿锁存 一上电就要把它赋值为0

	while(1)
	{
	MatrixLED_ShowColumn(0,0x70);//0x70代表74HC595送来的1bit流,1bit流随后流到了LED点阵屏第0列
	MatrixLED_ShowColumn(1,0x48);
	MatrixLED_ShowColumn(2,0x44);
	MatrixLED_ShowColumn(3,0x22);
	MatrixLED_ShowColumn(4,0x22);
	MatrixLED_ShowColumn(5,0x44);
	MatrixLED_ShowColumn(6,0x48);
	MatrixLED_ShowColumn(7,0x70);
	}
}

4.4成果展示

 5.LED点阵屏动态显示hello

5.1函数模块分类

这一部分我们把LED点阵屏模块封装成一个函数MatrixLED.c。同时还需要以下函数模块。Delay.c和Delay.h,MatrixLED.c和MatrixLED.h。以及主函数main.c。Delay.c和Delay.h和第四部分静态爱心制作一致。

5.2main.c函数

注意:主函数的意思是首先将LED屏上前8列的数字显示出来,显示出来以后,我们定义一个count,将count计数到20,相当于将LED屏上的数字延迟20s(我们姑且将20的单位当作秒),20s以后,图片偏移量开始增加,从0移植增加到40,(为什么是40呢,我们要保证偏移量能够将数组里的除了前8位数字全部过一遍,hello字符全部显示)同时随着偏移量的增加,LED点阵屏上的动画向左移动,当移动了40列以后,offset清0,又从头开始。
void main()

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



unsigned  char code Animation[]={
//加code相当于放在单片机的flash里面,一般数据放在单片机的RAM里面,由于flash空间大,我们一般选择放在flash里面,放在Flash里面就不可以更改了。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,
0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0x00,
0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0x0E,
0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//上面是hello字节每一列字节表示
};


//主函数的意思是首先将LED屏上前8列的数字显示出来,显示出来以后,我们定义一个count,将count计数到20,相当于将LED屏上的数字延迟20s(我们姑且将20的单位当作秒),20s以后,图片偏移量开始增加,从0移植增加到40,(为什么是40呢,我们要保证偏移量能够将数组里的除了前8位数字全部过一遍,hello字符全部显示)同时随着偏移量的增加,LED点阵屏上的动画向左移动,当移动了40列以后,offset清0,又从头开始。
void main()
{
	unsigned  char i,count=0;
	unsigned  char offset=1;//图片的偏移量
  void MatrixLED_Init();
	while(1)
	{
		for(i=0;i<8;i++)
		{
				MatrixLED_ShowColumn(i,Animation[i+offset]);
		}
		count++;
		if(count>20)//将LED屏上的数字扫描20遍,相当于延时
		{
			count=0;//扫描20次后,清0.
  		offset++;//将LED屏上的数字向左移动
			if(offset>40)//当图片偏移量大于40时,偏移量清0
			{
					offset=0;
			}
			
		}
			
	}
}

5.3MatrixLED.c函数

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


sbit RCK=P3^5;//RCLK
sbit SCK=P3^6;//SRCLK  所有IO口初始化以后都是高电平,因此主程序中要置0
sbit SER=P3^4;//SER  74H595配置


//LED点阵屏初始化
void MatrixLED_Init()
{
	SCK=0;//上升沿移位 一上电就要把它赋值为0
	RCK=0;//上升沿锁存 一上电就要把它赋值为0

}



//作用:74HC595写入一个字节(循环写入8个字节)
//参数:要写入的字节
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);//向右移位 8个数据排好队依次移动位置
		SCK=1;//上升沿置1,bit流开始流动
		SCK=0;//上升沿置1结束后要置0
	}
	RCK=1;//一字节流动到位置后上升沿锁存
	RCK=0;//锁存后置0
}//把8位数据送到IO口





//LED屏依次显示一列数据
//参数:list要选中的列:0-7,0在最左边
//参数  Data选择列显示的数据,高位在上,1为亮,0为灭
void MatrixLED_ShowColumn(unsigned char list,Data)  
	
{
	_74HC595_WriteByte(Data);
	P0=~(0x80>>list);//位选
	Delay(0);//位延迟
	P0=0xFF;//位清0;
//	if(list==0)(P0=~0X80);//取反后结果是0111 1111 第一列数码管亮
//	if(list==1)(P0=~0X40);
//	if(list==2)(P0=~0X20);
//	if(list==3)(P0=~0X10);
//	if(list==4)(P0=~0X08);
//	if(list==5)(P0=~0X04);
//	if(list==6)(P0=~0X02);
//	if(list==7)(P0=~0X01);
	
}

5.4MatrixLED.h函数

#ifndef  __MATRIXLED_H__
#define  _MATRIXLED_H__


void MatrixLED_Init();
void _74HC595_WriteByte(unsigned char Byte);
void MatrixLED_ShowColumn(unsigned char list,Data);

#endif

5.5成果展示

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值