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成果展示

下面是一个简单的单片机 8x8 点阵屏滚动显示的代码示例,使用了移位寄存器和定时器/计数器实现: ```c #include <reg52.h> #define LED_ROW P0 // 设置点阵屏的行(P0口) #define LED_COL P1 // 设置点阵屏的列(P1口) unsigned char code LED_TABLE[10][8] = { {0x3C, 0x42, 0x81, 0x81, 0x81, 0x42, 0x3C, 0x00}, // 0 {0x00, 0x21, 0x21, 0xFF, 0x01, 0x01, 0x00, 0x00}, // 1 {0x21, 0x43, 0x85, 0x89, 0x91, 0x61, 0x41, 0x00}, // 2 {0x42, 0x81, 0x89, 0x89, 0x89, 0x76, 0x00, 0x00}, // 3 {0x0F, 0x10, 0x20, 0x40, 0xFF, 0x00, 0x00, 0x00}, // 4 {0xF1, 0x89, 0x89, 0x89, 0x89, 0x8F, 0x00, 0x00}, // 5 {0x7E, 0x89, 0x89, 0x89, 0x89, 0x72, 0x00, 0x00}, // 6 {0x01, 0x01, 0x81, 0x89, 0x25, 0x13, 0x01, 0x00}, // 7 {0x76, 0x89, 0x89, 0x89, 0x89, 0x76, 0x00, 0x00}, // 8 {0x06, 0x89, 0x89, 0x89, 0x49, 0x3E, 0x00, 0x00} // 9 }; void delay(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 120; j++); } void display(unsigned char *p) { unsigned char i, j; for(i = 0; i < 8; i++) { LED_ROW = 0x00; // 先将行输出设置为0 LED_COL = ~p[i]; // 将列输出设置为该行应该显示的数据 for(j = 0; j < 8; j++) { LED_ROW = (LED_ROW << 1) | 0x01; // 移位并设置最低位为1 delay(1); } } } void main() { unsigned char i, j; while(1) { for(i = 0; i < 10; i++) { for(j = 0; j < 8; j++) { display(&LED_TABLE[i][j]); // 显示当前数字 delay(50); // 延时一定时间 } delay(100); // 停留一定时间再进行下一个数字的显示 } } } ``` 该代码的思路是循环显示数字 0~9,在每个数字的显示过程中,先将该数字的每一行数据按列依次输出,然后每隔一定时间(50ms)左移一位,实现滚动效果。在每个数字显示完毕后,停留一定时间(100ms)再进行下一个数字的显示。需要注意的是,该代码只是一个简单的示例,实际使用中需要根据具体的硬件和需求进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值