9-LED点阵

9-1 点阵LED

LED点阵模块原理图

一共有8*8=64个LED。通过行(DP)和列(P0)一起控制选择LED。其中行(DP)要通过74HC595(串转并)模块进行转换才能选择,类似38译码器。

image-20230513110830989

74HC595模块原理图

image-20230513111230304

74HC595 工作原理

以下是将8位DP赋值的过程:在SER中输入1,然后上升沿移位SERCLK给1(默认0),高电平会让SER的数据下移,下移后将SERCLK清零,归零到默认状态,接着继续给SER赋值,循环操作8次后,就存了8位数据。最后将上升沿锁存RCLK给1(默认0),左边的数据就会赋给LED点阵中对应的列序号(DP)。

  • 数据的高位在下,低位在上。下图中应为1010 0000

image-20230513112143408

9-1 LED点阵显示固定图像

  • 代码思想如下:

初始化后74HC595的接口SER,SERCLK和RCLK都为1,需要清零后才能顺利执行

把8位填充用代码

  • 行选与列选:点阵LED的行给1就会亮,给0会灭。列是以0为选中。注意行与列的区别。(一列+多行 控制一列的灯亮,亮完后行 列要清零,否则下一次选择行列会出现上一次的数据就会错乱)

  • 快速按照8列进行赋值:1段选 位选 2(延时 位清零)段选 位选 …………8 (延时 位清零)段选 位选

程序结果图 第五行的前四个灯亮(可以根据自己需要显示的灯 进行调用LED_ShowColumn(unsigned char column,unsigned char Data),按列显示,一共需要8次调用)

image-20230525142902494

main代码如下
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5;			//上升沿锁存 (RCLK用符号指向L口,方便写代码)
sbit SRCLK=P3^6;		//SRCLK	,上升沿
sbit SER=P3^4;			//SER

/**
  * @brief  			//通过74HC595来选择LED点阵的 多行,行以值1为亮
  * @param  			//要输入的数据
  * @retval 			//无
  */
void _74HC595_Write(unsigned char Byte)
{
	int i=0;
		for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);
		SRCLK=1;			//所有数据向下移一位
		SRCLK=0;			//清零
	}
	RCK=1;					//数据锁存
	RCK=0;					//清零
}


/**
  * @brief  选中LED点阵的 1列,按列显示
  * @param  column 	要选择的列,范围:1~8,选中1~8列,第一列在左边
	* @param  data 		要显示的 行
  * @retval 
  */
void LED_ShowColumn(unsigned char column,unsigned char Data)
{
	_74HC595_Write(Data);		//显示该列要亮的每一行
	P0=~(0x80>>(column-1));		//选中列(ps:P0是列选择字段 8位=1字节,从左到右,P0_7是第一位,字段0为选中列)
	Delay(1);		
	P0=0xff;			//列选清零(ps:准备下一次选行列不会出现上次数据的混乱)
}


void main()
{
	RCK=0;			//锁存清零
	SRCLK=0;		//开始要清零才能操作,因为L口会自己初始化为1
	while(1)
	{
		LED_ShowColumn(5,0xf0);	//(ps:在循环内一直显示,否侧会被清零)
	}
}
Delay.c代码如下
#include <REGX52.H>
void Delay(int num)		//@12.000MHz
{
	unsigned char i, j;
	while(num--){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void ShowLed(int led,int number)
{
		char exchange[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

	switch(led)	//
	{
		case 1:P2_4=0 ;P2_3=0 ;P2_2=0 ;break;
		case 2:P2_4=0 ;P2_3=0 ;P2_2=1 ;break;
		case 3:P2_4=0 ;P2_3=1 ;P2_2=0 ;break;
		case 4:P2_4=0 ;P2_3=1 ;P2_2=1 ;break;
		case 5:P2_4=1 ;P2_3=0 ;P2_2=0 ;break;
		case 6:P2_4=1 ;P2_3=0 ;P2_2=1 ;break;
		case 7:P2_4=1 ;P2_3=1 ;P2_2=0 ;break;
		case 8:P2_4=1 ;P2_3=1 ;P2_2=1 ;break;
	}
	P0=exchange[number];
	Delay(1);
	P0=0X00;
}

Delay.h代码如下
#include<stdio.h>
void ShowLed(int led,int number);
void Delay(int num);

9-2 LED流动图

原理解释

要输出下面这个图像(HELLO)流动,就要存入一个数组,数组存放了每一帧的图像,每一帧的图像显示的行+列都记录在数组对应位置中,循环数组即可.(有软件提供,可以不用自己写)

image-20230525150426215

使用软件生成数组

image-20230525154655933

/– 调入了一幅图像:这是您新建的图像 –/
/– 宽度x高度=32x8 –/
0x00,0x00,0x00,0xFF,0x99,0x99,0xDB,0x7E,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0xC3,
0xE7,0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,

main代码如下
#include <REGX52.H>
#include "LED_Show.h"
sbit RCK=P3^5;			//上升沿锁存 (RCLK用符号指向L口,方便写代码)
sbit SRCLK=P3^6;		//SRCLK	,上升沿
sbit SER=P3^4;			//SER
char H[]={0x00,0x00,0x00,0xFF,0x99,0x99,0xDB,0x7E,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0xC3,
0xE7,0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x99,0x99,0xDB,0x7E,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0xC3,
0xE7,0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,
	};

void main()
{
	unsigned char i,Offset=0,Count=0;
	RCK=0;			//锁存清零
	SRCLK=0;		//开始要清零才能操作,因为L口会自己初始化为1
	while(1)
	{
		for(i=0;i<8;i++)	
		{
			LED_ShowColumn(i,H[i+Offset]);
		}
		Count++;		//扫描后会灭,要保持不停的快速扫描	
		if(Count>15)
		{
			Count=0;
			Offset++;		
			if(Offset==32)
			{
				Offset=0;
			}
		}
	}
}

LED_Show.C
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5;			//上升沿锁存 (RCLK用符号指向L口,方便写代码)
sbit SRCLK=P3^6;		//SRCLK	,上升沿
sbit SER=P3^4;			//SER

/**
  * @brief  			//通过74HC595来选择LED点阵的 多行
  * @param  			//要输入的数据
  * @retval 			//无
  */
void _74HC595_Write(unsigned char Byte)
{
	int i=0;
		for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);
		SRCLK=1;			//所有数据向下移一位
		SRCLK=0;			//清零
	}
	RCK=1;					//数据锁存
	RCK=0;					//清零
}


/**
  * @brief  选中LED点阵的 1列,按列显示
  * @param  column 	要选择的列,范围:1~8,选中1~8列,第一列在左边
	* @param  data 		要显示的 行
  * @retval 
  */
void LED_ShowColumn(unsigned char column,unsigned char Data)
{
	Delay(1);		
	P0=0xff;			//列选清零
	_74HC595_Write(Data);		//显示该列要亮的每一行
	P0=~(0x80>>(column-1));		//P0是列选择字段 8位=1字节,从左到右,P0_7是第一位,字段0为选中列
	
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值