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);
}
}