51单片机-LED点阵

下 面是LED点阵的一个图形,我们可以清楚的看到,D0~D7是行P00~P07是列,其实这跟

数码管的原理是一样的无非就是我选哪一列,然后让这一列的哪一行的灯亮.

如果我想让第一颗灯亮,怎么做,就先选第一列,P0=0x7F,然后再选第一行D0=0x80,这样第一颗灯就可以亮了

而这个过程也涉及到另外一个芯片74HC595,这个芯片上有三个位SER,SERCLK,RCLK,负责把数据送进来再移位接着再把数据送到D0~D7(注意:测试中发现D0~D7是每一行,而不是每一列),如果我们要给第一列发送数据,首先,SER接受到一个位,SERCLK往下移,也就是上升沿,下面是高位,所以是上升沿,全部移动好之后,RCLK置高电平就会将数据全部送到D0~D7,这是同时发送的。而如果要发送给多列,那就用到级联,所谓级联,就是这个芯片连着另外一个芯片,上面也是有SER,SERCLK,RCLK,我们把这个芯片叫做2号,我们先把数据往2号送,送完了再送给一号,看到下图的1那里引出来一条黑线了吧,那个就是级联下一片.跟瓶子装水水一样,先把底填满,这样才能慢慢往上升,

好了,下面是显示的代码:

#include <REGX52.H>
sbit RCK=P3^5;   //RCLK
sbit SCK=P3^6;   //SRCLK
sbit SER=P3^4;   //SER
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);//每次提取最高位
		SCK=1;        //1为上升沿
		SCK=0;	      //0则关闭上升沿
	}
	RCK=1;
	RCK=0;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data); //给行发送数据,比如我想让第几列的哪一行亮
	P0=~(0x80>>Column); //P0口那里是0才能驱动,所以这里加了个取反,表示选第几列
}
void main()
{
	SCK=0; //因为上单片机上电为1,所以要初始化为0;因为上电不用移位,1为移位,0不移位
	RCK=0; //因为上单片机上电为1,所以要初始化为0;因为上电不用发送数据,1为发送数据,0则不是
	MatrixLED_ShowColumn(0,0xAA);
	while(1)
	{
		
	}
	
}

下图是显示结果

#include <REGX52.H>
sbit RCK=P3^5;   //RCLK
sbit SCK=P3^6;   //SRCLK
sbit SER=P3^4;   //SER

#define MATRIX_LED_PORT  P0

void Delayms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}while(--i);
	}
}
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_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT=~(0x80>>Column);
	Delayms(1); 
	MATRIX_LED_PORT=0XFF; 
}
void main()
{
	SCK=0; 
	RCK=0;

	while(1)
	{
		MatrixLED_ShowColumn(0,0x3C);
		MatrixLED_ShowColumn(1,0x42);
		MatrixLED_ShowColumn(2,0xA9);
		MatrixLED_ShowColumn(3,0x85);
		MatrixLED_ShowColumn(4,0x85);
		MatrixLED_ShowColumn(5,0xa9);
		MatrixLED_ShowColumn(6,0x42);
		MatrixLED_ShowColumn(7,0x3C);
	}
	
}

下图是显示结果:

#include <REGX52.H>
sbit RCK=P3^5;   //RCLK
sbit SCK=P3^6;   //SRCLK
sbit SER=P3^4;   //SER

#define MATRIX_LED_PORT  P0
unsigned char LEDShow[]=
{
	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 Delayms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}while(--i);
	}
}
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_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT=~(0x80>>Column);
	Delayms(1);
	MATRIX_LED_PORT=0XFF; //没有这两句发送数据可能会发送到上一列,从而发生错误
}
void main()
{
	unsigned char i,offset=0,count=0;
	SCK=0; //因为上单片机上电为1,所以要初始化为0;
	RCK=0;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			MatrixLED_ShowColumn(i,LEDShow[i+offset]);
		}
		count++;
		if(count>10)
		{
			count=0;
			offset++;
			if(offset>40)
			{
				offset=0;
			}
		}
	}
	
}

下图是显示结果:

显示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值