51-LED点阵屏

1.LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字,图片,视频等。

点阵屏的驱动关键:移位寄存器74HC595;

可位寻址:可以对寄存器中的某一位进行定义;例如:ET1=1;

不可位寻址:不能对寄存器中的某一位进行单独的定义,不可以控制其中某一位,不能对其中的一位进行定义;例如TMOD=0x80;

2. 74HC595原理图:

主要的三个控制接口是RCLK、SRCLK、SER;

---信号给到SER,SER接收信号,上升沿SERCLK高电位移位,每接收一个就向下移位一次,接收完置0;接收之前一定要定义初始值0电位;上升沿RCLK高电位1向右移位锁存,锁存完以后置0;接收之前也要定义初始值0电位;

#include <REGX52.H>

sbit RCK=P3^5;
sbit SCK=P3^6;
sbit SER=P3^4;
void _74HC595_writebyte(unsigned char byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}
void main()
{
	SCK=0;
	RCK=0;
	_74HC595_writebyte(0xAA);
	while(1)
	{
		
	}
}

3.  LED点阵屏---显示笑脸

sbit是重新定义的意思;库里面已经有的定义,在此基础上从新定义;例如;PCLK是库里的函数,在此定义为PCK;p3^5=P35;

首先:定义一列的情况:定义参数Byte;定义i;for循环,Byte&0x80是把0x80的最高位拿出来;移位代表分别拿出每一位;然后按照寄存器的性质进行设定;

最后定义列和每列的情况;高电位1亮灯;

SER=byte&(0x80>>i);是把一列的8个位置情况分别调出来,&--会把高电位1的那一个位置传给SER;

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

sbit RCK=P3^5;
sbit SCK=P3^6;
sbit SER=P3^4;
void _74HC595_writebyte(unsigned char byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}
void MatrixLED_ShowColomn(unsigned char Colomn,Date)
{
	_74HC595_writebyte(Date);
	P0=~(0x80>>Colomn);
	Delay(1);
	P0=0xFF;
}
void main()
{
	SCK=0;
	RCK=0;
	
	while(1)
	{
		MatrixLED_ShowColomn(0,0x3C);
		MatrixLED_ShowColomn(1,0x42);
		MatrixLED_ShowColomn(2,0xA9);
		MatrixLED_ShowColomn(3,0x85);
		MatrixLED_ShowColomn(4,0x85);
		MatrixLED_ShowColomn(5,0xA9);
		MatrixLED_ShowColomn(6,0x42);
		MatrixLED_ShowColomn(7,0x3C);
	}
}

4.LED点阵屏显示动画:

main.c

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

unsigned char Animation[]=
{
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,
};
void main()
{
	unsigned char i,count=0,offset=0;
	matri_Init();
	while(1)
	{
		for(i=0;i<8;i++)
		{
			MatrixLED_showColomn(i,Animation[i+offset]);
		}
		count++;
		if(count>10)
		{
			count=0;
			offset++;
			if(offset>40)
				offset=0;
		}
	}
}

Delay.c

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=256;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}

Delay.h

#ifndef _DELAY__H_
#define _DELAY__H_

void Delay(unsigned int xms);

#endif

matri.c

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

sbit RCK=P3^5;
sbit SCK=P3^6;
sbit SER=P3^4;

void _74HC595_writebyte(unsigned char byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}
void matri_Init()
{
	SCK=0;
	RCK=0;
}
void MatrixLED_showColomn(unsigned char colomn,Date)
{
	_74HC595_writebyte(Date);
	P0=~(0x80>>colomn);
	Delay(1);
	P0=0xFF;
}

matri.h 

#ifndef _MATRI__H_
#define _MATRI__H_
//外部可调用---主文件要用什么--头文件就要引用什么
void MatrixLED_showColomn(unsigned char colomn,Date);
void matri_Init();
#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值