11.8*8LED点阵

将LED发光二极管分别集成封装,一共有64个LED。采用动态扫描的方式,可以显示数字和简单汉字。
点亮对角线:循环发送每一行点亮对应的数据,再循环使低电平选中每一列。显示其他的和点亮对角线原理一致。
11.8*8LED点阵_第1张图片
循环发送行点亮对应的数据,再循环使低电平选中每一列。
11.8*8LED点阵_第2张图片
循环发送列点亮对应的数据,再循环使低电平点亮每一行。
74HC595串行输入并行输出
P00-P07分别是每一列,P00在最右边,P07在最左边。
74HC595控制输出段选D0-D7分别是每一行,D0在最下边,D7在最上边。(开发板所用为第一个原理图)
11.8*8LED点阵_第3张图片
10脚控制主复位功能低电平有效,此处直接接VCC使使主复位功能失效。
11脚为移位寄存器时钟输入,控制移位,12脚为存储寄存器时钟输入,控制存储输出,13脚为输出有效(低电平),14脚为串行数据出入
???当11脚来一个上升沿,数据会输出;12脚来一个上升沿,串行输入的数据进行移位保存到数据存储寄存器中
11.8*8LED点阵_第4张图片
采用移位,先传送高位,后传送低位。
使两个时钟都延时两个记忆周期的方法:

#include
......
_nop_();//延时一个记忆周期
_nop_();//第二个

点亮左上角一个点的程序为:

#include
#include

typedef unsigned char u8;
typedef unsigned int u16;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

void Hc595SendByte(u8 dat)
{
	u8 a;
	SRCLK=0;
	RCLK=0;//先将两个时钟清零
	for(a=0;a<8;a++)
	{
		SER=dat>>7;//1000 0000>>7=1
		dat<<=1;//1000 0000<<1=0000 0000
		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;//上升沿延时两个记忆周期后下降沿
	}
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;//同上
}

void main()
{
	Hc595SendByte(0x80);//输入数据0x80,仅最高位为高电平
	P0=0x7f;//仅最高位置为低电平
	while(1);
}

可以通过改变0x80和0x7f来实现一个任意一个点的点亮
注意事项:
1、必须为#include因为52中有RCLK重复定义
2、开发板上,JP595短接,JOE和GND短接(不能光写程序,要动开发板)
利用LED点阵点亮来显示数字:

#include
#include

typedef unsigned char u8;
typedef unsigned int u16;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};//依次为每一列串联输入D7-D0
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//依次为每一行的P7-P0

void delay(u16 i)
{
	while(i--);
}
void Hc595SendByte(u8 dat)
{
	u8 a;
	SRCLK=0;
	RCLK=0;
	for(a=0;a<8;a++)
	{
		SER=dat>>7;
		dat<<=1;
		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;
	}
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
}

void main()
{
	u8 i;
	while(1)
	{
		P0=0x7f;//初始让P7为低电平
		for(i=0;i<8;i++)
		{
			Hc595SendByte(ledduan[i]);
			P0=ledwei[i];
			delay(100);
			Hc595SendByte(0x00);
		}
	}
}

可以通过改变ledwei[]的值来使输出不同的字样。

???如果不想让595后边的小灯泡点亮,可以拔掉JP595短接片

你可能感兴趣的:(51单片机)