8*8点阵

8*8点阵相当于64个led。我的点阵的原理图如下:
8行8列,每一行有一个行控制线,连着这一行的led的阳极,每一列也同样有一个 列控制线,连着这一列的led的阴极.

然后第一行到第8行的行控制线分别通过D7到D0管脚接在75hc595的QH到QAio口,第一列到第8列的列控制线分别接在P07到P00io口。


因此要控制点阵还需要用的74hc595芯片,,原理图如下

我们只需通过mcuP34 P35 P36io口向该芯片的SER,RCLK,SRCLK io口 输入数据就可以控制了,
我觉得比较好的对芯片的解释点击打开链接


首先SER的作用:串行数据输入口。RCLK的作用:上升沿时移位寄存器的数据复制到数据存储寄存器,下降沿时数据存储寄存器的数据不变,通常我们将RCLK置低电平,当移位结束后,在RCLK置高电平,产生一个上升沿,更新数据. SRCLK的作用:上升沿时移位寄存器的数据移位.QA->QB->QC->....->QH,下降沿时移位寄存器数据不变.
下面给出2份代码。在操作前需要注意一定要将74HC595模块上的JP595短接片短接,并且将JOE短接片短接到GND端。


目的:点亮第一个led灯

#include<reg51.h>
#include<intrins.h>
sbit srclk=P3^6;
sbit rclk=P3^5;	
sbit ser=P3^4; 
typedef unsigned char u8 ;

void hc595sendbyte(u8 dat)//输入dat到595芯片
{
	u8 a;
	srclk=0;
	rclk=0;
	for(a=0;a<8;a++)//dat的8位存到移位寄存器里
	{
		ser=dat>>7;//把最高位输入
		dat<<=1;
		srclk=1;//上升沿时,对移位寄存器进行移位(向高位移),下降沿时移位寄存器数据不变
		_nop_();
		_nop_();//移位需要时间,调用延时函数
		srclk=0;
	}
    rclk=1;//把移位寄存器的数据放到数据存储寄存器
	_nop_();
	_nop_();
	rclk=0;
}
void main()
{

	while(1)
	{
		hc595sendbyte(0x80);
		P0=0x7f;
	}
	
}

目的:在点阵上显示数字0,方法和数码管的动态显示类似。

#include<reg51.h>
#include<intrins.h>
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};
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void hc595sendbyte(u8 dat)//输入信息到595芯片
{
	u8 a;
	srclk=0;
	rclk=0;
	for(a=0;a<8;a++)//dat的8位存到移位寄存器里
	{
		ser=dat>>7;//把最高位输入
		dat<<=1;
		srclk=1;//上升沿时,对移位寄存器进行移位(向高位移),下降沿时移位寄存器数据不变
		_nop_();
		_nop_();//移位需要时间,调用延时函数
		srclk=0;
	}
    rclk=1;//把移位寄存器的数据放到数据存储寄存器
	_nop_();
	_nop_();
	rclk=0;
}
void delay(u16 i)
{
	while(i--);
}
void main()
{
	u16 i;
	while(1)
		for(i=0;i<8;i++)
		{
			P0=ledwei[i];
			hc595sendbyte(ledduan[i]);
			delay(100);
			hc595sendbyte(0x00);
		}
	
}

posted @ 2018-05-19 21:03  eason99  阅读(422)  评论(0编辑  收藏  举报